日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MFC(六)(对话框)

發(fā)布時間:2024/9/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC(六)(对话框) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

對話框:

?

在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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。