非模態(tài)對(duì)話框 免費(fèi)編輯 添加義項(xiàng)名 B 添加義項(xiàng) ? 義項(xiàng)指多義詞的不同概念,如李娜的義項(xiàng):網(wǎng)球運(yùn)動(dòng)員、歌手等;非誠勿擾的義項(xiàng):馮小剛執(zhí)導(dǎo)電影、江蘇衛(wèi)視交友節(jié)目等。 查看詳細(xì)規(guī)范>> 所屬類別 : 其他 非模態(tài)(Modeless)對(duì)話框,又叫做無模式對(duì)話框,當(dāng)用戶打開非模態(tài)對(duì)話框時(shí),依然可以操作其他窗口。例如,Windows提供的記事本程序中的【查找】對(duì)話框?!静檎摇繉?duì)話框不會(huì)壟斷用戶的輸入,打開【查找】對(duì)話框后,仍可與其他用戶界面對(duì)象進(jìn)行交互。用戶可以一邊查找,一邊修改文章,這樣就大大方便了使用。 折疊 編輯本段 非模態(tài)對(duì)話框非模態(tài)對(duì)話框允許用戶在處理非模態(tài)對(duì)話框的同時(shí)處理目標(biāo)對(duì)話框。其不會(huì)壟斷用戶的輸入,如圖所示。Windows應(yīng)用程序中,對(duì)話框分為兩種。另一種是模態(tài)對(duì)話框。二者的區(qū)別在于當(dāng)對(duì)話框打開時(shí),是否允許用戶進(jìn)行其他對(duì)象的操作。 要建立非模態(tài)對(duì)話框需要調(diào)用兩個(gè)函數(shù)Create()和ShowWindow() 折疊 編輯本段 創(chuàng)建和關(guān)閉對(duì)話框無模式對(duì)話框與有模式對(duì)話框不同的是在創(chuàng)建后其他窗口都可以繼續(xù)接收用戶輸入,因此無模式對(duì)話框有些類似一個(gè)彈出窗口。創(chuàng)建無模式對(duì)話框需要調(diào)用 BOOL CDialog::Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );之后還需要調(diào)用 BOOL CDialog::ShowWindow( SW_SHOW);進(jìn)行顯示,否則無模式對(duì)話框?qū)⑹遣豢梢姷?。相關(guān)代碼如下: void CYourView::OnOpenDlg(void) { /*假設(shè)IDD_TEST_DLG為已經(jīng)定義的對(duì)話框資源的ID號(hào)*/ CTestDlg *dlg=new CTestDlg; dlg->Create(IDD_TEST_DLG,NULL); dlg->ShowWindow(SW_SHOW); /*不要調(diào)用 delete dlg;*/ } 在上面的代碼中我們新生成了一個(gè)對(duì)話框?qū)ο螅以谕顺龊瘮?shù)時(shí)并沒有銷毀該對(duì)象。因?yàn)槿绻藭r(shí)銷毀該對(duì)象(對(duì)象被銷毀時(shí)窗口同時(shí)被銷毀),而此時(shí)對(duì)話框還在顯示就會(huì)出現(xiàn)錯(cuò)誤。那么這就提出了一個(gè)問題:什么時(shí)候銷毀該對(duì)象。我時(shí)常使用的方法有兩個(gè): 在對(duì)話框退出時(shí)銷毀自己:在對(duì)話框中重載OnOK與OnCancel在函數(shù)中調(diào)用父類的同名函數(shù),然后調(diào)用DestroyWindow()強(qiáng)制銷毀窗口,在對(duì)話框中映射WM_DESTROY消息,在消息處理函數(shù)中調(diào)用delete this;強(qiáng)行刪除自身對(duì)象。相關(guān)代碼如下: void CTestDlg1::OnOK() { CDialog::OnOK(); DestroyWindow(); } void CTestDlg1::OnCancel() { CDialog::OnCancel(); DestroyWindow(); } void CTestDlg1::OnDestroy() { CDialog::OnDestroy(); AfxMessageBox("call delete this"); delete this; } 這種方法的要點(diǎn)是在窗口被銷毀的時(shí)候,刪除自身對(duì)象。所以你可以在任何時(shí)候調(diào)用DestroyWindow()以達(dá)到徹底銷毀自身對(duì)象的作用。(DestroyWindow()的調(diào)用會(huì)引起OnDestroy()的調(diào)用) 通過向父親窗口發(fā)送消息,要求其他窗口對(duì)其進(jìn)行銷毀:首先需要定義一個(gè)消息用于進(jìn)行通知,然后在對(duì)話框中映射WM_DESTROY消息,在消息處理函數(shù)中調(diào)用消息發(fā)送函數(shù)通知其他窗口。在接收消息的窗口中利用ON_MESSAGE映射處理消息的函數(shù),并在消息處理函數(shù)中刪除對(duì)話框?qū)ο?。相關(guān)代碼如下: /*更改對(duì)話框的有關(guān)文件*/ CTestDlg2::CTestDlg2(CWnd* pParent /*=NULL*/) : CDialog(CTestDlg2::IDD, pParent) {/*m_pParent為一成員變量,用于保存通知窗口的指針,所以該指針不能是一個(gè)臨時(shí)指針*/ ASSERT(pParent); m_pParent=pParent; //{{AFX_DATA_INIT(CTestDlg2) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT } void CTestDlg2::OnOK() { CDialog::OnOK(); DestroyWindow(); } void CTestDlg2::OnCancel() { CDialog::OnCancel(); DestroyWindow(); } void CTestDlg2::OnDestroy() { CDialog::OnDestroy(); /*向其他窗口發(fā)送消息,將自身指針作為一個(gè)參數(shù)發(fā)送*/ m_pParent->PostMessage(WM_DELETE_DLG,(WPARAM)this); } /*在消息接收窗口中添加消息映射*/ /*在頭文件中添加函數(shù)定義*/ afx_msg LONG OnDelDlgMsg(WPARAM wP,LPARAM lP); /*添加消息映射代碼*/ ON_MESSAGE(WM_DELETE_DLG,OnDelDlgMsg) END_MESSAGE_MAP() /*實(shí)現(xiàn)消息處理函數(shù)*/ LONG CMy53_s1View::OnDelDlgMsg(WPARAM wP,LPARAM lP) { delete (CTestDlg2*)wP; return 0; } /*創(chuàng)建對(duì)話框*/ void CMy53_s1View::OnTest2() { CTestDlg2 *dlg=new CTestDlg2(this); dlg->Create(IDD_TEST_DLG_2); dlg->ShowWindow(SW_SHOW); } 在這種方法中我們利用消息來進(jìn)行通知,在Window系統(tǒng)中利用消息進(jìn)行通知和傳遞數(shù)據(jù)的用法是很多的。 同樣無模式對(duì)話框的另一個(gè)作用還可以用來在用戶在對(duì)話框中的輸入改變時(shí)可以及時(shí)的反映到其他窗口。下面的代碼演示了在對(duì)話框中輸入一段文字,然后將其更新到視圖的顯示區(qū)域中,這同樣也是利用了消息進(jìn)行通知和數(shù)據(jù)傳遞。 /*在對(duì)話框中取出數(shù)據(jù),并向其他窗口發(fā)送消息和數(shù)據(jù),將數(shù)據(jù)指針作為一個(gè)參數(shù)發(fā)送*/ void CTestDlg2::OnCommBtn() { char szOut[30]; GetDlgItemText(IDC_OUT,szOut,30); m_pParent->SendMessage(WM_DLG_NOTIFY,(WPARAM)szOut); } /*在消息接收窗口中*/ /*映射消息處理函數(shù)*/ ON_MESSAGE(WM_DLG_NOTIFY,OnDlgNotifyMsg) /*在視圖中繪制出字符串 m_szOut*/ void CMy53_s1View::OnDraw(CDC* pDC) { CMy53_s1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here pDC->TextOut(0,0,"Display String"); pDC->TextOut(0,20,m_szOut); } /*處理通知消息,保存信息并更新顯示*/ LONG CMy53_s1View::OnDlgNotifyMsg(WPARAM wP,LPARAM lP) { m_szOut=(char*)wP; Invalidate(); return 0; } 此外這種用法利用消息傳遞數(shù)據(jù)的方法對(duì)有模式對(duì)話框和其他的窗口間通信也一樣有效 |
|
|