分享
分享赚钱 收藏 举报 版权申诉 / 18

类型mfc可变窗口大小 仅供个人使用.doc

  • 上传人:yjrm16270
  • 文档编号:6815452
  • 上传时间:2019-04-23
  • 格式:DOC
  • 页数:18
  • 大小:161KB
  • 配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    mfc可变窗口大小 仅供个人使用.doc
    资源描述:

    1、在网上有VC 中自动改变控件位置和大小的对话框类的文章开始不知道如何使用我在生成的非模态对话框里研究了一天已经搞定了步骤:1,在非模态对话框类的头文件(.h)顶部加上#include “lxDialog.h“,然后把非模态对话框类的基类改成 ClxDialog,也就是在头文件里 class C* : public CDialog 改成:class C* : public ClxDialog在非模态对话框类的.cpp 函数里,把构造函数C*:C*(CWnd* pParent ): CDialog(C*:IDD, pParent)改成:C*:C*(CWnd* pParent ): ClxDialo

    2、g(C*:IDD, pParent)2,用类向导给非模态对话框添加一个 OnInitDialog()函数;也就是在双击类向导-Message Maps- 选非模态对话框类;Messages 选 WM_INITDIALOG 双击它,这样在你的非模态对话框的 cpp 文件里就生成了 ON_WM_INITDIALOG 和OnInitDialog()函数;3,在这个 OnInitDialog 函数里添加代码:ClxDialog:OnInitDialog();ClxDialog:ShowSizeIcon(TRUE);/显示可以调整大小的图标static DLGCTLINFO dcMenuGroup =

    3、IDCANCEL, MOVEX, 100,IDCANCEL, MOVEY, 100,IDC_EDIT_RECDSPDLG, ELASTICX, 100,IDC_EDIT_RECDSPDLG, ELASTICY, 100,;SetControlProperty(dcMenuGroup, sizeof(dcMenuGroup)/sizeof(DLGCTLINFO);return TRUE; /IDCANCEL 是关闭按钮的 ID,IDOK 按钮我去掉了所以没加,IDC_EDIT_RECDSPDLG 是一个 EDIT 控件/想让哪个控件调整,就照葫芦画瓢在组里加上4,再用类向导添加 OnSize()

    4、函数,也就是双击 ON_WM_SIZE,这样就增加了void C*:OnSize(UINT nType, int cx, int cy) 这个函数,然后在这个函数里添加代码:ClxDialog:OnSize(nType, cx, cy);5,别忘了在资源里右键你的非模态对话框,把属性栏 Styles 里 Border 选成Resizing。这样就搞定了附上网上找的那个类:VC 中自动改变控件位置和大小的对话框类lxDialog.h 文件: / 自动改变控件位置和大小的对话框类/ 文件名:lxDialog.h/ 作者:StarLee()/class ClxDialog : public CDia

    5、logpublic:ClxDialog(UINT nID, CWnd* pParent = NULL);typedef struct _dlgControlTagint iId;int iFlag;int iPercent; DLGCTLINFO, *PDLGCTLINFO;enumMOVEX = 0,MOVEY,MOVEXY,ELASTICX,ELASTICY,ELASTICXY;/ 设置控件信息BOOL SetControlProperty(PDLGCTLINFO lp, int nElements);/ 是否在对话框右下角显示表示可改变大小的图标void ShowSizeIcon(BOO

    6、L bShow = TRUE);protected:virtual BOOL OnInitDialog();afx_msg void OnSize(UINT nType, int cx, int cy);afx_msg void OnSizing(UINT nSide, LPRECT lpRect);DECLARE_MESSAGE_MAP()private:int m_iClientWidth; / 对话框 client 区域的宽度int m_iClientHeight; / 对话框 client 区域的高度int m_iMinWidth; / 对话框的最小宽度int m_iMinHeight

    7、; / 对话框的最小高度PDLGCTLINFO m_pControlArray; / 控件信息数组指针int m_iControlNumber; / 设置控件信息的控件个数BOOL m_bShowSizeIcon; / 是否显示表示可改变大小的图标CStatic m_wndSizeIcon; / 放图标的静态控件/ 保存图标的 bitmapCBitmap m_bmpSizeIcon;BITMAP m_bitmap;lxDialog.cpp 文件:/ 自动改变控件位置和大小的对话框类/ 文件名:lxDialog.cpp/ 作者:StarLee()/#include “stdafx.h“#incl

    8、ude “lxDialog.h“/ 表示可改变大小的图标 ID#ifndef OBM_SIZE#define OBM_SIZE 32766#endifClxDialog:ClxDialog(UINT nID, CWnd* pParent ): CDialog(nID, pParent), m_iClientWidth(0), m_iClientHeight(0), m_iMinWidth(0), m_iMinHeight(0), m_pControlArray(NULL), m_iControlNumber(0), m_bShowSizeIcon(TRUE)BEGIN_MESSAGE_MAP(

    9、ClxDialog, CDialog)ON_WM_SIZE()ON_WM_SIZING()END_MESSAGE_MAP()BOOL ClxDialog:OnInitDialog()CDialog:OnInitDialog();/ 设置对话框为可变大小的ModifyStyle(0, WS_SIZEBOX);/ 以对话框的初始大小作为对话框的宽度和高度的最小值CRect rectDlg;GetWindowRect(rectDlg);m_iMinWidth = rectDlg.Width();m_iMinHeight = rectDlg.Height();/ 得到对话框 client 区域的大小C

    10、Rect rectClient;GetClientRect(rectClient);m_iClientWidth = rectClient.Width();m_iClientHeight = rectClient.Height();/ Load 图标m_bmpSizeIcon.LoadOEMBitmap(OBM_SIZE);m_bmpSizeIcon.GetBitmap(/ 创建显示图标的静态控件并放在对话框右下角m_wndSizeIcon.Create(NULL, WS_CHILD | WS_VISIBLE | SS_BITMAP, CRect(0, 0, m_bitmap.bmWidth,

    11、 m_bitmap.bmHeight), this, 0);m_wndSizeIcon.SetBitmap(m_bmpSizeIcon);m_wndSizeIcon.MoveWindow(m_iClientWidth - m_bitmap.bmWidth, m_iClientHeight - m_bitmap.bmHeight, m_bitmap.bmWidth, m_bitmap.bmHeight);/ 显示图标m_wndSizeIcon.ShowWindow(m_bShowSizeIcon);return TRUE;void ClxDialog:OnSize(UINT nType, int

    12、 cx, int cy)CDialog:OnSize(nType, cx, cy);/ 对话框宽度和高度的增量int iIncrementX = cx - m_iClientWidth;int iIncrementY = cy - m_iClientHeight;/ 最小化时增量为 0if (nType = SIZE_MINIMIZED)iIncrementX = iIncrementY = 0;for (int i = 0; i 100)continue;/ 得到控件指针pWndCtrl = GetDlgItem(iId);if (NULL != pWndCtrl) pWndCtrl-Get

    13、WindowRect(rectCtrl);ScreenToClient(rectCtrl);int iLeft = rectCtrl.left;int iTop = rectCtrl.top;int iWidth = rectCtrl.Width();int iHeight = rectCtrl.Height();switch (iFlag)case MOVEX: / X 方向移动iLeft += (iIncrementX * iPercent / 100);break;case MOVEY: / Y 方向移动iTop += (iIncrementY * iPercent / 100);bre

    14、ak;case MOVEXY: / X 方向和 Y 方向同时移动iLeft += (iIncrementX * iPercent / 100);iTop += (iIncrementY * iPercent / 100);break;case ELASTICX: / X 方向改变大小iWidth += (iIncrementX * iPercent / 100);break;case ELASTICY: / Y 方向改变大小iHeight += (iIncrementY * iPercent / 100);break;case ELASTICXY: / X 方向和 Y 方向同时改变大小iWid

    15、th += (iIncrementX * iPercent / 100);iHeight += (iIncrementY * iPercent / 100);break;default:;/ 把控件移动到新位置pWndCtrl-MoveWindow(iLeft, iTop, iWidth, iHeight);/ 把图标移动到对话框右下角if (IsWindow(m_wndSizeIcon.GetSafeHwnd()m_wndSizeIcon.MoveWindow(cx - m_bitmap.bmWidth, cy - m_bitmap.bmHeight, m_bitmap.bmWidth, m

    16、_bitmap.bmHeight);/ 记录对话框 client 区域的大小if (nType != SIZE_MINIMIZED)m_iClientWidth = cx;m_iClientHeight = cy;void ClxDialog:OnSizing(UINT nSide, LPRECT lpRect)CDialog:OnSizing(nSide, lpRect);/ 对话框不能小于初始大小int iWidth = lpRect-right - lpRect-left;int iHeight = lpRect-bottom - lpRect-top;if (iWidth right

    17、= lpRect-left + m_iMinWidth;if(iHeight bottom = lpRect-top + m_iMinHeight;BOOL ClxDialog:SetControlProperty(PDLGCTLINFO lp, int nElements)/ 设置控件数组信息if (NULL = lp)return FALSE;if (nElements GetWindowRect(ScreenToClient(/将控件大小转换为在对话框中的区域坐标/ cx/m_rect.Width()为对话框在横向的变化比例rect.left=rect.left*cx/m_rect.Wi

    18、dth();/调整控件大小rect.right=rect.right*cx/m_rect.Width();rect.top=rect.top*cy/m_rect.Height();rect.bottom=rect.bottom*cy/m_rect.Height();pWnd-MoveWindow(rect);/设置控件大小GetClientRect(/将变化后的对话框大小设为旧大小以上是我在网上找的,试过,能得到想要的效果!调试过程中,遇到点问题,还望高手指点!在对话框属性里,设置最大化,最小化框,运行时,能最大化,最大化后也可以还原;也能最小化,问题就出来了,最小化后,只能右键关闭,不能还原

    19、,点它,弹出错误代码,需要调试!请问是怎么回事?如何消除!谢谢了啊!最小化的时候 m_rect 的各个量是“0”,所以在管口还原的时候就出现了除 0的异常。如下:rect.left=rect.left*cx/m_rect.Width();/调整控件大小怎样在在子对话框中获得父对话框的大小,并设置子对话框的大小,使其正好覆盖父对话框请问:怎样在在子对话框中获得父对话框的大小,并设置子对话框的大小,使其正好覆盖父对话框getparent()或 findwindow()得到父窗口, getwindowrect()得到父窗口的位置,大小。 movewindow()或 setwindowpos()将子窗

    20、口移动到父窗口的位置,并改变大小。网友:papaya_stone getparent()或 findwindow()得到父窗口句柄, getwindowrect()得到父窗口的位置,大小。 movewindow()或 setwindowpos()将子窗口移动到父窗口的位置,并改变大小。MFC 对话框大小如何调节? 互联网 电脑软件 电脑硬件悬赏点数 10 1 个回答 685 次浏览0LeeTeuk 2008-10-28 14:39:53 172.30.211.* 举报MFC 对话框大小如何调节?回答登录并发表回答 取消 在谷歌搜索 MFC 对话框大小如何调节?回答 按时间排序 按投票数排序0l

    21、iuyangbmw 2008-10-28 15:27:11 121.29.129.* 举报简单的说可以在 OnInitDialog()函数里加上一句:RECT rect;GetClientRect(MoveWindow(1024-rect.right,0,rect.right,rect.bottom);以上 MoveWindow 中的前两个参数就是窗体显示时的左上角坐标,我假设你的屏幕分辨率为 1024*768,所以其横坐标为 1024-rect.right;获得对话框准确像素 悬赏分:0 - 解决时间:2008-11-17 11:02想在对话框添加背景图片,但不知道如何获得对话框的像素,无法

    22、准确设置图片的大小。请问如何在 VC6.0 或 2005 中使图片与对话框配置适当的大小?提问者: jimoffice - 五级最佳答案获得 WindowRect 和 ClientRect 然后做一些计算 /API 的实现 RECT rw, rc; GetWindowRect(hwnd, GetClientRect(hwnd, OffsetRect( int w = 图片宽 + rw.right - rc.right; int h = 图片高 + rw.bottom - rc.bottom; SetWindowPos(hwnd, HWND_TOP, 0, 0, w, h, SWP_NOMOVE

    23、 | SWP_NOZORDER);用 GetClientRect(CLogPropertyPage m_LogSystem; /System Log;CLogPropertyPage m_LogClientOne; / Log about ClientOne;CLogPropertyPage m_LogClientTwo; /Log about ClientTwo;CLogPropertyPage m_LogTimer;/Log about timer ;m_sheet.AddPage(m_sheet.AddPage(m_sheet.AddPage(m_sheet.AddPage( m_she

    24、et.Create(this, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT);RECT rect;this-GetWindowRect(int width =rect.right-rect.left;int height = rect.bottom - rect.top;m_sheet.MoveWindow(0,125,width,height);OnSize 函数里m_sheet.MoveWindow( margin,ctrlheight+margin*2, rt.Width()-margin*2, rt.Height()-ctrlheight-ma

    25、rgin*2 );CTabCtrl* ptab =m_sheet.GetTabControl(); ptab-MoveWindow( 0,0, rt.Width()-margin*2, rt.Height()-ctrlheight-margin*2); 第二句话就会调用 m_LogSystem 的 OnSize 函数.VC 中用 MFC 新建了一个对话框应用程序,想获得客户区(不包括标题栏)的矩形大小,用哪个函数获得?悬赏分: 5 解决时间:2009-04-06 01:32VC 中用 MFC 新建了一个对话框应用程序,想获得客户区(不包括标题栏)的矩形大小,用哪个函数获得?最佳答案 coldp

    26、lay328_644 - 二副 十一级在 Dlg 类中用 this-GetClientRect 可以获得当前客户区的大小,this-GetWindowRect 可以获得在屏幕的位置,当然互相可以转换ScreenToClient 这些函数VC 中自动改变控件位置和大小的对话框类2006-07-19 16:33 作者:StarLee 出处:blog 责任编辑:方舟在用 VC 开发应用程序时,经常会要做一些可以改变大小的对话框,而这个时候就要求对话框上的控件会随着对话框大小的改变而改变自己的位置和大小。如果控件比较少,那可以在对话框的 OnSize()事件里面添加代码,通过计算来调整各个控件的位置和

    27、大小;但是,如果对话框上的控件比较多的话,那这将是一件非常痛苦的事情!要是程序中又有很多可以改变大小的对话框,那一个一个的 OnSize()写下来,那会使程序员崩溃的!为了解决这个问题,我写了一个自动改变控件位置和大小的对话框类ClxDialog。从这个类继承的对话框类,只要在 OnInitDialog()里对控件做一些简单的设置,对话框上的控件就会随着对话框大小的改变而改变自己的位置和大小。为了保存控件信息,我定义了一个结构:typedef struct _dlgControlTagint iId; / 控件 IDint iFlag; / 标志,表示怎样改变控件的位置或者大小int iPer

    28、cent; / 改变值占对话框改变值的百分比 DLGCTLINFO, *PDLGCTLINFO;这里要对结构中的 iFlag 和 iPercent 进行一些解释。其中 iFlag 是下面的枚举值:enumMOVEX = 0, / 控件在 X 方向(左右)移动MOVEY, / 控件在 Y 方向(上下)移动MOVEXY, / 控件在 X 方向和 Y 方向同时移动ELASTICX, / 控件在 X 方向(宽度)改变大小ELASTICY, / 控件在 Y 方向改(高度)改变大小ELASTICXY / 控件在 X 方向和 Y 方向同时改变大小;iPercent 表示改变值占对话框改变值的百分比。例如,一

    29、个控件的iPercent 值为 100,iFlag 值为 MOVEX,那么当对话框的宽度改变 100 个单位的时候,这个控件就在 X 方向移动 100 个单位;又如,一个控件的 iPercent 值为100,iFlag 值为 ELASTICXY,那么当对话框的宽度和高度分别改变 100 个单位的时候,控件的高度和宽度也相应的改变 100 个单位。下面是设置控件信息的函数:BOOL SetControlProperty(PDLGCTLINFO lp, int nElements);使用起来非常简单,在对话框的 OnInitDialog()函数里面添加类似下面的代码就行了:/ 控件信息数组stat

    30、ic DLGCTLINFO dcMenuGroup =IDOK, MOVEX, 100,IDCANCEL, MOVEX, 100,IDC_BUTTON1, MOVEX, 50,IDC_BUTTON1, MOVEY, 100,IDC_EDIT1, ELASTICX, 100,IDC_EDIT2, ELASTICX, 50,IDC_EDIT3, ELASTICX, 50,IDC_EDIT3, MOVEX, 50,IDC_EDIT4, ELASTICY, 100,IDC_EDIT5, ELASTICX, 100,IDC_EDIT5, ELASTICY, 50,IDC_EDIT6, ELASTICX,

    31、 100,IDC_EDIT6, ELASTICY, 50,IDC_EDIT6, MOVEY, 50,;/ 设置控件信息SetControlProperty(dcMenuGroup, sizeof(dcMenuGroup)/sizeof(DLGCTLINFO);下面就是使用上面这段代码的对话框改变大小前后的效果图:对两张截图的比较我们可以很容易的理解上面那段代码。我还提供了一个函数:void ShowSizeIcon(BOOL bShow = TRUE);来设置是否显示对话框右下角表示可以改变大小的图标。这个图标是从系统中读取的,我上面的截图是 Windows2000 下的,在 WindowsXP 中就会自动变成 XP 风格的。

    展开阅读全文
    提示  道客多多所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:mfc可变窗口大小 仅供个人使用.doc
    链接地址:https://www.docduoduo.com/p-6815452.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    道客多多用户QQ群:832276834  微博官方号:道客多多官方   知乎号:道客多多

    Copyright© 2025 道客多多 docduoduo.com 网站版权所有世界地图

    经营许可证编号:粤ICP备2021046453号    营业执照商标

    1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png



    收起
    展开