必威电竞|足球世界杯竞猜平台

非模態(tài)對(duì)話框
來源:互聯(lián)網(wǎng)

非模態(tài)對(duì)話框,又稱無模式對(duì)話框,是指在用戶打開此類對(duì)話框時(shí),仍然能夠操作其他窗口的一種對(duì)話框類型。例如,Windows操作系統(tǒng)下的記事本程序中的【查找】對(duì)話框即屬于非模態(tài)對(duì)話框。這類對(duì)話框的特點(diǎn)是不會(huì)獨(dú)占用戶的輸入焦點(diǎn),使得用戶能夠在處理對(duì)話框的同時(shí),與其它用戶界面元素進(jìn)行交互。這一特性顯著提升了用戶體驗(yàn)。

特征

非模態(tài)對(duì)話框允許用戶在處理該對(duì)話框的同時(shí),處理目標(biāo)對(duì)話框。它不會(huì)壟斷用戶的輸入,這意味著用戶可以一邊查找,一邊修改文章,從而極大地提高了使用的便利性。相比之下,另一類對(duì)話框——模態(tài)對(duì)話框,則會(huì)在打開時(shí)阻止用戶進(jìn)行其他對(duì)象的操作。

創(chuàng)建與關(guān)閉

無模式對(duì)話框在創(chuàng)建后,其他窗口仍然可以接受用戶輸入,類似于一個(gè)彈出窗口。創(chuàng)建非模態(tài)對(duì)話框需要調(diào)用`BOOL CDialog::Create(UINT nIDTemplate, CWnd* pParentWnd = NULL)`函數(shù)來創(chuàng)建對(duì)話框,隨后還需調(diào)用`BOOL CDialog::ShowWindow(SW_SHOW)`函數(shù)使其可見。具體示例代碼如下:

```C++

void CYourView::OnOpenDlg(void)

{

// 假設(shè)IDD_TEST_DLG為已定義的對(duì)話框資源ID

CTestDlg *dlg = new CTestDlg;

dlg->Create(IDD_TEST_DLG, NULL);

dlg->ShowWindow(SW_SHOW);

// 不要調(diào)用delete dlg;

}

```

需要注意的是,在以上代碼中,我們?cè)诤瘮?shù)結(jié)束時(shí)不銷毀對(duì)話框?qū)ο蟆_@是因?yàn)槿绻诖藭r(shí)銷毀對(duì)象(對(duì)象被銷毀時(shí)窗口也會(huì)被銷毀),而對(duì)話框仍在顯示狀態(tài),將會(huì)導(dǎo)致錯(cuò)誤。因此,我們需要考慮何時(shí)銷毀該對(duì)象。一種常見的做法是在對(duì)話框退出時(shí)由其自行銷毀。具體實(shí)現(xiàn)方法包括在對(duì)話框中重載`OnOK()`和`OnCancel()`函數(shù),分別調(diào)用父類的同名函數(shù)后,再調(diào)用`DestroyWindow()`函數(shù)強(qiáng)制銷毀窗口。在對(duì)話框中映射`WM_DESTROY`消息,并在其消息處理函數(shù)中調(diào)用`delete this`語句,以刪除自身對(duì)象。相關(guān)的示例代碼如下:

```C++

void CTestDlg1::OnOK()

{

CDialog::OnOK();

DestroyWindow();

}

void CTestDlg1::OnCancel()

{

CDialog::OnCancel();

DestroyWindow();

}

void CTestDlg1::OnDestroy()

{

CDialog::OnDestroy();

AfxMessageBox("call delete this");

delete this;

}

```

這種方法的關(guān)鍵在于,在窗口被銷毀時(shí),刪除自身對(duì)象。因此,你可以隨時(shí)調(diào)用`DestroyWindow()`函數(shù),以確保對(duì)話框及其對(duì)象都被正確地銷毀。

另一種方法是通過向父窗口發(fā)送消息,請(qǐng)求父窗口銷毀對(duì)話框。首先,需要定義一個(gè)用于通知的消息,然后在對(duì)話框中映射`WM_DESTROY`消息,在其消息處理函數(shù)中調(diào)用消息發(fā)送函數(shù)通知父窗口。在接收到消息的父窗口中,利用`ON_MESSAGE`宏映射處理消息的函數(shù),并在消息處理函數(shù)中刪除對(duì)話框?qū)ο蟆>唧w的示例代碼如下:

```C++

/* 更改對(duì)話框的相關(guān)文件 */

CTestDlg2::CTestDlg2(CWnd* pParent /*=NULL*/)

: CDialog(CTestDlg2::IDD, pParent)

{

ASSERT(pParent);

m_pParent = pParent;

//{{AFX_數(shù)據(jù)_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();

m_pParent->PostMessage(WM_DELETE_DLG, (WPARAM)this);

}

/* 在消息接收窗口中添加消息映射 */

/* 在頭文件中添加函數(shù)定義 */

afx_msg LONG OnDelDlgMsg(WPARAM wP, LPARAM lP);

/* 添加消息映射代碼 */

ON_MESSAGE(WM_DELETE_DLG, OnDelDlgMsg)

/* 實(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);

}

```

在這個(gè)例子中,我們利用消息機(jī)制進(jìn)行通知和數(shù)據(jù)傳遞。這是Windows系統(tǒng)中常見的一種通信方式。

此外,非模態(tài)對(duì)話框還有一種用途,即在用戶在對(duì)話框中的輸入發(fā)生變化時(shí),能夠及時(shí)地反映到其他窗口。以下代碼展示了如何在對(duì)話框中輸入一段文本,然后將其更新到視圖的顯示區(qū)域內(nèi)。這也是利用消息進(jìn)行通知和數(shù)據(jù)傳遞的一個(gè)實(shí)例。

```C++

/* 在對(duì)話框中獲取數(shù)據(jù),并向其他窗口發(fā)送消息和數(shù)據(jù),將數(shù)據(jù)指針作為參數(shù)發(fā)送 */

void CTestDlg2::OnCommBtn()

{

char szOut[30];

GetDlgItemText(IDC_OUT, szOut, sizeof(szOut));

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 數(shù)據(jù) 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ì)于模態(tài)對(duì)話框以及其他窗口之間的通信也同樣適用。

參考資料 >

MFC---模態(tài)對(duì)話框及非模態(tài)對(duì)話框的彈出過程(對(duì)話框).CSDN.2024-09-10

快速入門:掌握模態(tài)和非模態(tài)對(duì)話框設(shè)計(jì)基礎(chǔ).搜狐網(wǎng).2024-09-10

7.5 模態(tài)對(duì)話框與非模態(tài)對(duì)話框.7.5 模態(tài)對(duì)話框與非模態(tài)對(duì)話框.2024-09-10

生活家百科家居網(wǎng)