MFC(六)(对话框)
對話框:
?
在MFC中對資源的操作都是通過一個與資源相關(guān)的類來完成的
(在VC中用view –classwizard完成類與資源的綁定)
對話框的創(chuàng)建:
?
1.模態(tài)對話框(打開后不可以進行改程序的其他輸入操作)
void CMainFrame::OnDialog()
{
?????? // TODO: Add your command handler code here
?
MyDialog dlg=new MyDialog();
//這兩種C++對象生成方式好像是一樣的
//MyDialog dlg;
dlg.DoModal();
??????
}
?
2.非模態(tài)對話框(打開后能進行改程序的其他輸入操作)
這個主要是因為對話框打開后程序并沒有向上述對話框一樣停留在一條語句等待,而是順序執(zhí)行onDialog里面的代碼直到結(jié)束
?
?
void CMainFrame::OnDialog()
{
?????? // TODO: Add your command handler code here
//用指針new一個內(nèi)存,在堆上分配內(nèi)存,延長對象的生命周期。或者把MyDialog申明為//成員變量
MyDialog *dlg=new MyDialog();
?
//第一個參數(shù)對話框的ID,第二個是該對話框的父窗口
dlg->Create(IDD_DIALOG1,this);
?
//與上述模態(tài)對話框不同,必須顯示的調(diào)用顯示函數(shù)讓其顯示。上面的DoModal()函數(shù)本//身調(diào)用了ShowWindow()函數(shù)
dlg->ShowWindow(SW_SHOW);
?
?
??????
}
?
上述代碼有內(nèi)存泄露的危險,因為生命周期結(jié)束時,他保存的內(nèi)存地址就丟失了,沒法在引用到原來指向的內(nèi)存,必須顯示的釋放指針所指向的內(nèi)存。
在對話框關(guān)聯(lián)類里面重載PostNcDestroy()方法:
void MyDialog::PostNcDestroy()
{
?????? delete this;
?????? CDialog::PostNcDestroy();
?
}
?
模態(tài)對話框上的OK和Cancel按鈕的響應(yīng)函數(shù)調(diào)用了EndDialog函數(shù)銷毀對話框,而非模態(tài)對話框只是隱藏了對話框,要銷毀必須重寫響應(yīng)函數(shù)調(diào)用DestroyWindow函數(shù)銷毀對話框。
?
CWnd對象都有一個m_hWnd,保存與窗口對象相關(guān)聯(lián)的句柄。如果窗口對象沒有與任一個窗口相關(guān)聯(lián),句柄為NULL,如下:
?
void MyDialog::OnButton1()
{
??????
?????? if (!btn.m_hWnd)
?????? {
????????????? btn.Create("New",BS_DEFPUSHBUTTON|WS_VISIBLE,CRect(0,0,100,100),this,123);
?????? }
?????? else
?????? {
????????????? btn.DestroyWindow();
?
?????? }
?
}
?
靜態(tài)文本框之類的多個控件的ID是一樣的,要想給他們添加消息響應(yīng)函數(shù)必須修改他們的ID,此外還要選中其屬性對話框中的Notify選項,不然沒法向父窗口發(fā)送消息。
控件也是窗口,獲取靜態(tài)控件上顯示的文本,調(diào)用cwnd對象的成員函數(shù)GetWindowText()函數(shù),獲取控件對象用GetDlgItem()
設(shè)置靜態(tài)控件的文本用SetWindowText()函數(shù),如下:
?
void MyDialog::OnStatic1()
{
?????? // TODO: Add your control notification handler code here
?????? CString str;
?????? GetDlgItem(IDC_STATIC1)->GetWindowText(str);
?
?????? if (str=="Number1")
?????? {
????????????? this->GetDlgItem(IDC_STATIC1).SetWindowText("數(shù)字一");
?????? }
?
}
PS:碰到一個有意思的報錯
error C2228: left of '.SetWindowTextA' must have class/struct/union type
this->GetDlgItem(IDC_STATIC1).SetWindowText("數(shù)字一");把.改成->就好了
?
另一種獲取控件的內(nèi)容的方法是用幾個變量分別和控件相關(guān)聯(lián),這個過程用class wizard中的Add Variable來完成,在內(nèi)部是DoDataExchange()來完成關(guān)聯(lián)的。在調(diào)用關(guān)聯(lián)的變量之前要用UpdateData(bool)來讓數(shù)據(jù)交換生效,UpdateData()函數(shù)內(nèi)部調(diào)用了DoDotaExchange()來完成數(shù)據(jù)關(guān)聯(lián),里面的bool為true的時候代表正在獲取對話框的數(shù)據(jù),為false代表正在初始化對話框的控件.(DDV開頭的函數(shù)對話框數(shù)據(jù)交換DDC對話框數(shù)據(jù)校驗)
?
void MyDialog::OnButton1()
{
this->UpdateData(true);
?????? m_edit3=m_edit1+m_edit2;
?????? this->UpdateData(false);
}
?
還有一種方式,用幾個控件變量與上述控件關(guān)聯(lián),同樣用wizard實現(xiàn)關(guān)聯(lián)。控件變量與控件關(guān)聯(lián)后就獲取了該控件的對象,然后再調(diào)用GetWindowText()和SetWindowText()實現(xiàn)
?
Windows程序都是基于消息的系統(tǒng),通過SendMessage()來發(fā)送消息,獲取窗口文本的消息是WM_GETTEXT設(shè)置窗口文本的消息是WM_SETTEXT,Cwnd類都有SendMessage()函數(shù),加::表示調(diào)用Platform SDK的SendMessage函數(shù)。
?
::SendMessage(m_e1.m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);
?????? ::SendMessage(m_e2.m_hWnd,WM_GETTEXT,10,(LPARAM)ch2);
?????? int b=atoi(ch1)+atoi(ch2);
?????? itoa(b,ch3,10);
?????? ::SendMessage(m_e3.m_hWnd,WM_SETTEXT,10,(LPARAM)ch3);
?
還可以直接用SendDlgItemMessage()直接給對話框的子控件發(fā)送消息。相當(dāng)于把GetDlgItem()和SendMessage()這兩個函數(shù)組合起來了
?
控件對象的SetFocus()函數(shù)獲取焦點
?
轉(zhuǎn)載于:https://www.cnblogs.com/totem1990/archive/2012/07/18/2598381.html
總結(jié)
以上是生活随笔為你收集整理的MFC(六)(对话框)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Remote PC另类用法:远程控制
- 下一篇: iOS开发 小知识点