VC中自動改變控制元件位置和大小的對話方塊類 阿新 • • 發佈:2018-12-11 lxDialog.h檔案: ///////////////////////////////////////////////////////////////////////////////////// // 自動改變控制元件位置和大小的對話方塊類 // 檔名:lxDialog.h // 作者:StarLee([email protected]) ///////////////////////////////////////////////////////////////////////////////////// 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( [email protected]) ////////////////////////////////////////////////////////////////////// #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; }