首先放一下參考的鏈接。。
http://blog.sina.com.cn/s/blog_4b5039210100dzkd.html
http://bbs.csdn.NET/topics/350153879
http://blog.csdn.Net/liuy_yy/article/details/7219616
以上第一篇文章博主的方法雖然可以實現控件按比例跟隨窗口變大變小,但問題來了。。
button控件我們不需要他變大啊(變大要丑死),而編輯框控件(Edit Control)到邊角的距離應該保持不變。
所以必須換一種方法。。
第二篇文章是一個帖子,里面說到可以用MoveWindow/SetWindowPos自己調整按鈕的位置或者大小。
操作方式類似于第一篇文章博主的做法
1 首先要知道對話框大小是否改變,改變了多少,我們應該記錄當前對話框的大小。
現在Dlg上面拖進來一個Edit Control ,命名為IDC_EDIT1。
在CTestDlg對話框類(根據工程名的不同,讀者自己找自己的對話框類,一般以Dlg結尾)中添加成員變量 CRect m_rect 他是用來記錄當前對話框的大小。
我們在OnInitDialog()函數中獲取對話框創建時的大小:GetClientRect(&m_rect);
2 增加消息WM_SIZE的消息響應函數OnSize(): 只要對話框大小發生變化,就會調用該函數。
PS: 消息響應函數的添加方法可參考文章末尾
3 在OnSize()函數中增加如下代碼:(最簡單的為例子,就一個確定按鈕,取消按鈕和一個編輯框)
void CTestDlg::OnSize(UINT nType, int cx, intcy){ CDialog::OnSize(nType, cx, cy); // TODO: Add your message handler code here
CWnd *pWnd; pWnd =GetDlgItem(IDC_EDIT1); //獲取控件的句柄 if(pWnd) //判斷是否為空,因為對話框創建時會調用此函數,而當時控件還未創建 { CRectrect; //獲取控件變化前的大小
pWnd->GetWindowRect(&rect); ScreenToClient(&rect);//將控件大小轉換為在對話框中的區域坐標 // cx/m_rect.Width()為對話框在橫向的變化比例
rect.left=rect.left;//調整控件大小 rect.right= cy - ( m_rect.Width() - rect.right ) ; rect.top=rect.top; rect.bottom= cy - ( m_rect.Height() - rect.bottom ) ;
pWnd->MoveWindow(rect);//設置控件大小
} GetClientRect(&m_rect);//將變化后的對話框大小設為舊大小 }
歸根結底的思路就是:用舊的坐標,通過數學計算得到新的坐標。
上面那個示例的運行結果,確定取消按鈕是不會動的。。
如果想要讓他們也動,需要重新修改坐標那塊的代碼。
累。。。
老師告訴我們,如果有一個功能實現不了,那肯定是你不知道,不是人家實現不了。
肯定會有更簡單的方法。。
于是找到了這個東西 easysize
使用方法很簡單。
1、在stdafx.h中引用EasySize.h頭文件(同時將EasySize.h放到你的程序目錄中)
2、在類定義中添加DECLARE_EASYSIZE
[html] view plain copyPRint?<pre name="code" class="html">class CEasySizeDemoDlg : public CDialog { DECLARE_EASYSIZE //(此處沒有分號) `````` }; 
<pre name="code" class="html">class CEasySizeDemoDlg : public CDialog{ DECLARE_EASYSIZE //(此處沒有分號) ``````};3、增加OnInitDialog處理函數,將INIT_EASYSIZE放到函數尾處。
[html] view plain copyprint?<pre name="code" class="cpp">BOOL CEasySizeDemoDlg::OnInitDialog() { ````` INIT_EASYSIZE; return TRUE; } 
<pre name="code" class="cpp">BOOL CEasySizeDemoDlg::OnInitDialog(){````` INIT_EASYSIZE; return TRUE;}4、增加OnSize函數(OnSize 是WM_SIZE的消息函數,不會添加的看最下面),添加宏UPDATE_EASYSIZE
[html] view plain copyprint?<pre name="code" class="cpp">void CEasySizeDemoDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); UPDATE_EASYSIZE; } 
<pre name="code" class="cpp">void CEasySizeDemoDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); UPDATE_EASYSIZE;} 5、可選(最小化)
6、創建EasySize映射(map),在你對話框實現文件的 xxxxxDlg.cpp中找到類似這樣的代碼
BEGIN_MESSAGE_MAP(CcameraDlg, CDialogEx) END_MESSAGE_MAP()
在下面添加
[cpp] view plain copyprint?BEGIN_EASYSIZE_MAP(CEasySizeDemoDlg) EASYSIZE(IDC_EDIT1, ES_BORDER, ES_KEEPSIZE, ES_BORDER, ES_BORDER, 0) EASYSIZE(IDOK,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,ES_BORDER,0) EASYSIZE(IDCANCEL,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,ES_BORDER,0) END_EASYSIZE_MAP 
BEGIN_EASYSIZE_MAP(CEasySizeDemoDlg) EASYSIZE(IDC_EDIT1, ES_BORDER, ES_KEEPSIZE, ES_BORDER, ES_BORDER, 0) EASYSIZE(IDOK,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,ES_BORDER,0) EASYSIZE(IDCANCEL,ES_KEEPSIZE,ES_KEEPSIZE,ES_BORDER,ES_BORDER,0) END_EASYSIZE_MAP 通過在EasySize Map中使用EASYSIZE宏來指定當對話框改變時control相應的行為,宏定義格式如下:
EASYSIZE(control,left,top,right,bottom,options)
參數1(Control):需要重新定位的control ID.
參數2、3、4、5(left, top, right and bottom ):這四個參數可以設定的值有其它控件的ID、特定的值如如ES_BORDER、ES_KEEPSIZE。
ES_BORDER :代表控件與邊框的距離保持不變。
ES_KEEPSIZE:代表控件的寬度和高度保持不變,left/right只能設置其中一個為ES_KEEPSIZE,同理,top/bottom亦然。
參數6(options):ES_HCENTER, ES_VCENTER and 0的組合。
ES_HCENTER :代表控件在left/right之間水平居中,此時這兩個參數都不能設置為ES_KEEPSIZE,控件的寬度保持不變。
ES_VCENTER 同理(垂直方向)。
但是這樣還是需要一個一個的設定,目前沒有找到更簡單的方法。。
===================================本教程結束============================================
關于如何添加消息映射函數

在這個Dlg上右鍵 ---類向導 ----

左邊WM_XXXXXX 那一堆里面找到你想要的消息雙擊,然后點擊右邊的編輯代碼,VS 會幫你做好前期工作的,代碼復制進去就好了。。