1.首先在初始化函數中,FormView在OnInitialUpdate(),Dialog在OnInitDialog()中初始化控件的大小。
view plaincopy to clipboardprint?
01.//開始初始化控件大小
02. m_IsInitialed = false;
03.
04. CRect m_ClientRect;
05. this->GetClientRect(&m_ClientRect);
06. CSize m_Forsize;
07. m_Forsize = GetTotalSize();//在資源編輯器中定好大小后,程序運行時大?。ú还茏畲蠡妥钚』摯笮【鶠橥粋€值),客戶區大于或等于顯示的大小
08. double m_x = (double)m_ClientRect.Width() / m_Forsize.cx;//寬度方向發大倍數
09. double m_y = (double)m_ClientRect.Height() / m_Forsize.cy;//高度方向發大倍數
10.
11. //調整控件的大小
12. CWnd *pWnd = NULL;
13. pWnd = GetWindow(GW_CHILD);
14. while(pWnd)//判斷是否為空,因為對話框創建時會調用此函數,而當時控件還未創建
15. {
16. CRect rect; //獲取控件變化前大小
17. pWnd->GetWindowRect(&rect);
18. ScreenToClient(&rect);//將控件大小轉換為在對話框中的區域坐標
19. m_ControlRect.insert(pair<int, CRect>(pWnd->GetDlgCtrlID(), rect));//保存控件的初始大小,以便在OnSize函數中繼續使用
20. int width = rect.Width();
21. int height = rect.Height();
22.
23. WCHAR szBuf[256];
24. GetClassName(pWnd->m_hWnd,szBuf,256);
25. if( _tcsicmp(szBuf,_T("Edit")) == 0)
26. {
27. //Edit只是位置變化,大小沒有變
28. rect.top = m_y * rect.top;
29. rect.left = m_x * rect.left;
30. rect.bottom = rect.top + height;
31. rect.right = rect.left + width;
32. }
33. else
34. {
35. //其它控件位置和大小均變化
36. rect.top = m_y * rect.top;
37. rect.left = m_x * rect.left;
38. rect.bottom = m_y * rect.bottom;
39. rect.right = m_x * rect.right;
40. }
41.
42. pWnd->MoveWindow(&rect);//設置控件大小
43. pWnd = pWnd->GetWindow(GW_HWNDNEXT);
44. }
45.
46. //控件初始化結束
47. m_IsInitialed = true;
//開始初始化控件大小
m_IsInitialed = false;
CRect m_ClientRect;
this->GetClientRect(&m_ClientRect);
CSize m_Forsize;
m_Forsize = GetTotalSize();//在資源編輯器中定好大小后,程序運行時大小(不管最大化和最小化,該大小均為同一個值),客戶區大于或等于顯示的大小
double m_x = (double)m_ClientRect.Width() / m_Forsize.cx;//寬度方向發大倍數
double m_y = (double)m_ClientRect.Height() / m_Forsize.cy;//高度方向發大倍數
//調整控件的大小
CWnd *pWnd = NULL;
pWnd = GetWindow(GW_CHILD);
while(pWnd)//判斷是否為空,因為對話框創建時會調用此函數,而當時控件還未創建
{
CRect rect; //獲取控件變化前大小
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);//將控件大小轉換為在對話框中的區域坐標
m_ControlRect.insert(pair<int, CRect>(pWnd->GetDlgCtrlID(), rect));//保存控件的初始大小,以便在OnSize函數中繼續使用
int width = rect.Width();
int height = rect.Height();
WCHAR szBuf[256];
GetClassName(pWnd->m_hWnd,szBuf,256);
if( _tcsicmp(szBuf,_T("Edit")) == 0)
{
//Edit只是位置變化,大小沒有變
rect.top = m_y * rect.top;
rect.left = m_x * rect.left;
rect.bottom = rect.top + height;
rect.right = rect.left + width;
}
else
{
//其它控件位置和大小均變化
rect.top = m_y * rect.top;
rect.left = m_x * rect.left;
rect.bottom = m_y * rect.bottom;
rect.right = m_x * rect.right;
}
pWnd->MoveWindow(&rect);//設置控件大小
pWnd = pWnd->GetWindow(GW_HWNDNEXT);
}
//控件初始化結束
m_IsInitialed = true;
2.如果界面在運行時大小可以改變,則在OnSize函數中加入如下代碼
view plaincopy to clipboardprint?
01.// TODO: 在此處添加消息處理程序代碼
02. CFormView::ShowScrollBar(SB_BOTH, false);//設置沒有滾動條,視情況而定。
03. //在界面不是最小化并且已經初始化完畢
04. if (!IsIconic() && m_IsInitialed)
05. {
06. CSize m_Forsize;
07. m_Forsize = GetTotalSize();
08. double m_x = (double)cx / m_Forsize.cx;
09. double m_y = (double)cy / m_Forsize.cy;
10.
11. //讀取控件的初始大小
12. map<int, CRect>::iterator pos = m_ControlRect.begin();
13. for (; pos != m_ControlRect.end(); ++pos)
14. {
15. CRect rect = pos->second;
16. int width = rect.Width();
17. int height = rect.Height();
18.
19. WCHAR szBuf[256];
20. GetClassName(GetDlgItem(pos->first)->m_hWnd,szBuf,256);
21. if( _tcsicmp(szBuf,_T("Edit")) == 0)
22. {
23. rect.top = m_y * rect.top;
24. rect.left = m_x * rect.left;
25. rect.bottom = rect.top + height;
26. rect.right = rect.left + width;
27. }
28. else
29. {
30. rect.top = m_y * rect.top;
31. rect.left = m_x * rect.left;
32. rect.bottom = m_y * rect.bottom;
33. rect.right = m_x * rect.right;
34. }
35. GetDlgItem(pos->first)->MoveWindow(rect);
36. }
37. }
// TODO: 在此處添加消息處理程序代碼
CFormView::ShowScrollBar(SB_BOTH, false);//設置沒有滾動條,視情況而定。
//在界面不是最小化并且已經初始化完畢
if (!IsIconic() && m_IsInitialed)
{
CSize m_Forsize;
m_Forsize = GetTotalSize();
double m_x = (double)cx / m_Forsize.cx;
double m_y = (double)cy / m_Forsize.cy;
//讀取控件的初始大小
map<int, CRect>::iterator pos = m_ControlRect.begin();
for (; pos != m_ControlRect.end(); ++pos)
{
CRect rect = pos->second;
int width = rect.Width();
int height = rect.Height();
WCHAR szBuf[256];
GetClassName(GetDlgItem(pos->first)->m_hWnd,szBuf,256);
if( _tcsicmp(szBuf,_T("Edit")) == 0)
{
rect.top = m_y * rect.top;
rect.left = m_x * rect.left;
rect.bottom = rect.top + height;
rect.right = rect.left + width;
}
else
{
rect.top = m_y * rect.top;
rect.left = m_x * rect.left;
rect.bottom = m_y * rect.bottom;
rect.right = m_x * rect.right;
}
GetDlgItem(pos->first)->MoveWindow(rect);
}
}
或在OnShowWindow()函數中加入也可以(特別是在對話框作為tabpage時)
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/ybw20041910/archive/2010/06/19/5679730.aspx