《vc中自动改变控件位置和大小的对话框类》由会员分享,可在线阅读,更多相关《vc中自动改变控件位置和大小的对话框类(12页珍藏版)》请在金锄头文库上搜索。
1、VC 中自动改变控件位置和大小的对话框类在用 VC 开发应用程序时,经常会要做一些可以改变大小的对话框,而这个时候就要求对话框上的控件会随着对话框大小的改变而改变自己的位置和大小。如果控件比较少,那可以在对话框的 OnSize()事件里面添加代码,通过计算来调整各个控件的位置和大小;但是,如果对话框上的控件比较多的话,那这将是一件非常痛苦的事情!要是程序中又有很多可以改变大小的对话框,那一个一个的 OnSize()写下来,那会使程序员崩溃的!为了解决这个问题,我写了一个自动改变控件位置和大小的对话框类 ClxDialog。从这个类继承的对话框类,只要在 OnInitDialog()里对控件做一
2、些简单的设置,对话框上的控件就会随着对话框大小的改变而改变自己的位置和大小(当然,别忘了把对话框的 Border 属性改为 Resizing)。为了保存控件信息,我定义了一个结构:typedef struct _dlgControlTag int iId; / 控件 IDint iFlag; / 标志,表示怎样改变控件的位置或者大小int iPercent; / 改变值占对话框改变值的百分比 DLGCTLINFO, *PDLGCTLINFO;这里要对结构中的 iFlag 和 iPercent 进行一些解释。其中 iFlag 是下面的枚举值:enumMOVEX = 0, / 控件在 X 方向(左
3、右)移动MOVEY, / 控件在 Y 方向(上下)移动MOVEXY, / 控件在 X 方向和 Y 方向同时移动ELASTICX, / 控件在 X 方向(宽度)改变大小ELASTICY, / 控件在 Y 方向改(高度)改变大小ELASTICXY / 控件在 X 方向和 Y 方向同时改变大小;iPercent 表示改变值占对话框改变值的百分比。例如,一个控件的 iPercent 值为 100,iFlag 值为 MOVEX,那么当对话框的宽度改变 100 个单位的时候,这个控件就在 X 方向移动 100个单位;又如,一个控件的 iPercent 值为 100,iFlag 值为 ELASTICXY,那
4、么当对话框的宽度和高度分别改变 100 个单位的时候,控件的高度和宽度也相应的改变 100 个单位。下面是设置控件信息的函数:BOOL SetControlProperty(PDLGCTLINFO lp, int nElements); 使用起来非常简单,在对话框的 OnInitDialog()函数里面添加类似下面的代码就行了:/ 控件信息数组static DLGCTLINFO dcMenuGroup = IDOK, MOVEX, 100,IDCANCEL, MOVEX, 100,IDC_BUTTON1, MOVEX, 50,IDC_BUTTON1, MOVEY, 100,IDC_EDIT1,
5、 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, 100,IDC_EDIT6, ELASTICY, 50,IDC_EDIT6, MOVEY, 50,;/ 设置控件信息SetControlProperty(dcMenuGroup, sizeof(dcMenuGroup)/sizeof(DLGC
6、TLINFO);下面就是使用上面这段代码的对话框改变大小前后的效果图: 对两张截图的比较我们可以很容易的理解上面那段代码。我还提供了一个函数:void ShowSizeIcon(BOOL bShow = TRUE);来设置是否显示对话框右下角表示可以改变大小的图标。这个图标是从系统中读取的,我上面的截图是 Windows2000 下的,在 WindowsXP 中就会自动变成 XP 风格的。好了,闲话不多说了,下面贴出该对话框类 ClxDialog 的源代码,里面有详细的注释:lxDialog.h 文件:/ 自动改变控件位置和大小的对话框类/ 文件名:lxDialog.h/ 作者:StarLee
7、()/class ClxDialog : public CDialogpublic:ClxDialog(UINT nID, CWnd* pParent = NULL);typedef struct _dlgControlTag int iId;int iFlag;int iPercent; DLGCTLINFO, *PDLGCTLINFO;enumMOVEX = 0,MOVEY,MOVEXY,ELASTICX,ELASTICY,ELASTICXY;/ 设置控件信息BOOL SetControlProperty(PDLGCTLINFO lp, int nElements);/ 是否在对话框右下角
8、显示表示可改变大小的图标void ShowSizeIcon(BOOL 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_iMin
9、Width; / 对话框的最小宽度int m_iMinHeight; / 对话框的最小高度PDLGCTLINFO m_pControlArray; / 控件信息数组指针int m_iControlNumber; / 设置控件信息的控件个数BOOL m_bShowSizeIcon; / 是否显示表示可改变大小的图标CStatic m_wndSizeIcon; / 放图标的静态控件/ 保存图标的 bitmapCBitmap m_bmpSizeIcon; BITMAP m_bitmap; ;lxDialog.cpp 文件:/ 自动改变控件位置和大小的对话框类/ 文件名:lxDialog.cpp/ 作
10、者:StarLee()/#include stdafx.h#include lxDialog.h/ 表示可改变大小的图标 ID#ifndef OBM_SIZE#define OBM_SIZE 32766#endifClxDialog:ClxDialog(UINT nID, CWnd* pParent /*=NULL*/): CDialog(nID, pParent), m_iClientWidth(0), m_iClientHeight(0), m_iMinWidth(0), m_iMinHeight(0), m_pControlArray(NULL), m_iControlNumber(0)
11、, m_bShowSizeIcon(TRUE)BEGIN_MESSAGE_MAP(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_iMinHeigh
12、t = rectDlg.Height();/ 得到对话框 client 区域的大小CRect 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
13、| SS_BITMAP, CRect(0, 0, m_bitmap.bmWidth, 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
14、TRUE;void ClxDialog:OnSize(UINT nType, int 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 = GetDlg
15、Item(iId);if (NULL != pWndCtrl) & IsWindow(pWndCtrl-GetSafeHwnd()CRect rectCtrl;pWndCtrl-GetWindowRect(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);break;case MOVEXY: / X 方向和 Y 方向同时移动iLeft += (iIncrementX * iPercent / 100);iTop += (iIncrementY * iPercen