轉自:http://webbery.tianyablog.com
閱讀本文前,我們假設您已經:
1,知道如何創建一個單文檔的App Wizard
2,知道C++ 類、函數重載等簡單知識
3,知道如何給View類或者Doc文檔添加成員變量
4,會用MFC的IDE調試工具最好,那麼本文的程序您可以copy去調試
5,知道如何爲某個框架類添加虛函數或消息處理函數
1,動態創建按鈕
1)增加全局變量 CButton m_btn;
2)在需要創建的地方
//ID號123可以隨意改變
if(!m_btn.m_hWnd)
m_btn.Create("維新",BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,CRect(0,0,100,100),this,123);
else
m_btn.DestroyWindow();
2,複製控件
在dlg上添加控件時,按住ctrl鍵,拖動就可以複製一模一樣的控件
3,控件對齊
在對話框上多個控件對齊,可以用layout菜單或者左下角toolbar
4,動態編輯static靜態文本框
CString str;
if(GetDlgItem(IDC_NUMBER1)->GetWindowText(str),str=="Number1:")
GetDlgItem(IDC_NUMBER1)->SetWindowText("數值1:");
else
GetDlgItem(IDC_NUMBER1)->SetWindowText("Number1:");
要讓static靜態文本框響應消息,需要複選上notify選項
5,Edit文本框
獲取/設置文本內容
1)方法1
char ch[10];
GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,10);
GetDlgItem(IDC_EDIT3)->SetWindowText(itoa(atoi(ch1),ch1,10));
2)方法2
GetDlgItemText(IDC_EDIT1,ch1,10);
SetDlgItemText(IDC_EDIT3,itoa(atoi(ch1),ch1,10));
3)方法3
SetDlgItemInt(IDC_EDIT3,GetDlgItemInt(IDC_EDIT1));//對整型數字的字符串有用
4)關聯變量法
對每個Edit控件關聯一個變量,設置後記得用UpdateData()
對於顯示數字類的文本框,可以定義value和control兩種類型變量
DoDataExchange() called by the framework to exchange and validate dialog data
The framework automatically calls UpdateData with bSaveAndValidate set
to FALSE when a modal dialog box is created in the default
implementation of CDialog::OnInitDialog.
5)利用WM_GETTEXT消息處理獲取文本
char ch1[10];
可以用以下四種方法(m_edit1爲關聯的控制型變量)
::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);
::SendMessage(m_edit1.m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);
GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT,10,(LPARAM)ch1);
m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)ch1);
利用WM_SETTEXT消息處理設置文本
m_edit3.SendMessage(WM_SETTEXT,0,(LPARAM)ch3);
6)直接對對話框控件進行消息發送
SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1);//獲取文本
SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,0,(LPARAM)ch3);//設置文本
SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,0,-1);
7)利用EM_GETSEL,EM_SETSEL的消息處理
6,對話框收縮
點擊"收縮<<"對話框收縮,點擊"擴展>>"則擴展, 請看例子代碼
7,多個edit框用Enter鍵切換的方法,三種方法
1)捕獲鍵盤消息,在消息函數中處理(未提供)
2)修改Edit的窗口過程:自己寫窗口過程替代原來的窗口過程(比較麻煩的方法)
(1)定義窗口過程類型變量
WNDPROC prevProc;
(2)定義窗口過程函數
LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam )
{
if(uMsg==WM_CHAR && wParam==0x0d)//如果是回車
{
//::SetFocus(::GetNextWindow(hwnd,GW_HWNDNEXT));//獲取下一窗口句柄方法一
//SetFocus(::GetWindow(hwnd,GW_HWNDNEXT));//方法二
SetFocus(::GetNextDlgTabItem(::GetParent(hwnd),hwnd,FALSE));//方法三
return 1;
}
else
return prevProc(hwnd,uMsg,wParam,lParam);
}
(3)添加WM_INITDIALOG對應的函數
(4)在OnInitDialog中添加
prevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(LONG)WinSunProc);
(5)注意 edit控件 MultiLine複選屬性選/不選的不同
SetWindowLong changes an attribute of the specified window.
3)在OnOK(default button對應的函數)
GetFocus()->GetNextWindow()->SetFocus();//注意最後一個窗口時要判斷,不然獲取出錯
GetFocus()->GetWindow(GW_HWNDNEXT)->SetFocus();//注意同上
GetNextDlgTabItem(GetFocus())->SetFocus();
注意: 對話框初始的OK的ID號爲IDOK,即使刪除按鈕(OnOk函數存在),依然會響應OnOk函數