1. 程式人生 > >VC中自動改變控制元件位置和大小的對話方塊類

VC中自動改變控制元件位置和大小的對話方塊類

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; }