扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:StarLee 来源:blog 2007年10月16日
关键字:
lxDialog.h文件: ///////////////////////////////////////////////////////////////////////////////////// // 自动改变控件位置和大小的对话框类 // 文件名:lxDialog.h // 作者:StarLee(coolstarlee@sohu.com) ///////////////////////////////////////////////////////////////////////////////////// class ClxDialog : public CDialog { public: ClxDialog(UINT nID, CWnd* pParent = NULL); typedef struct _dlgControlTag { int iId; int iFlag; int iPercent; } DLGCTLINFO, *PDLGCTLINFO; enum { MOVEX = 0, MOVEY, MOVEXY, ELASTICX, ELASTICY, ELASTICXY }; // 设置控件信息 BOOL SetControlProperty(PDLGCTLINFO lp, int nElements); // 是否在对话框右下角显示表示可改变大小的图标 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_iMinWidth; // 对话框的最小宽度 int m_iMinHeight; // 对话框的最小高度 PDLGCTLINFO m_pControlArray; // 控件信息数组指针 int m_iControlNumber; // 设置控件信息的控件个数 BOOL m_bShowSizeIcon; // 是否显示表示可改变大小的图标 CStatic m_wndSizeIcon; // 放图标的静态控件 // 保存图标的bitmap CBitmap m_bmpSizeIcon; BITMAP m_bitmap; }; lxDialog.cpp文件: ////////////////////////////////////////////////////////////////////// // 自动改变控件位置和大小的对话框类 // 文件名:lxDialog.cpp // 作者:StarLee(coolstarlee@sohu.com) ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "lxDialog.h" // 表示可改变大小的图标ID #ifndef OBM_SIZE #define OBM_SIZE 32766 #endif ClxDialog::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) , 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_iMinHeight = 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_bitmap); // 创建显示图标的静态控件并放在对话框右下角 m_wndSizeIcon.Create(NULL, WS_CHILD | WS_VISIBLE | 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 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; // 最小化时增量为0 if (nType == SIZE_MINIMIZED) { iIncrementX = iIncrementY = 0; } for (int i = 0; i < m_iControlNumber; i++) { CWnd *pWndCtrl = NULL; int iId = m_pControlArray[i].iId; int iFlag = m_pControlArray[i].iFlag; int iPercent = m_pControlArray[i].iPercent; // 无效值 if ((iPercent < 0) || (iPercent > 100)) continue; // 得到控件指针 pWndCtrl = GetDlgItem(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 * iPercent / 100); break; case ELASTICX: // X方向改变大小 iWidth += (iIncrementX * iPercent / 100); break; case ELASTICY: // Y方向改变大小 iHeight += (iIncrementY * iPercent / 100); break; case ELASTICXY: // X方向和Y方向同时改变大小 iWidth += (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_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 <= m_iMinWidth) lpRect->right = lpRect->left + m_iMinWidth; if(iHeight <= m_iMinHeight) lpRect->bottom = lpRect->top + m_iMinHeight; } BOOL ClxDialog::SetControlProperty(PDLGCTLINFO lp, int nElements) { // 设置控件数组信息 if (NULL == lp) return FALSE; if (nElements <= 0) return FALSE; m_pControlArray = lp; m_iControlNumber = nElements; return TRUE; } void ClxDialog::ShowSizeIcon(BOOL bShow /*=NULL*/) { m_bShowSizeIcon = bShow; } |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者