电竞比分网-中国电竞赛事及体育赛事平台

分享

VC中模態(tài)與非模態(tài)對(duì)話框的顯示與關(guān)閉

 piaoyedu 2013-09-01

       在windows中將對(duì)話框分為兩類:模態(tài)對(duì)話框和非模態(tài)對(duì)話框。模態(tài)對(duì)話框打開(kāi)后,始終占據(jù)著當(dāng)前程序的焦點(diǎn),如果不關(guān)掉對(duì)話框的話,當(dāng)前程序?qū)o(wú)法做其他工作。例如在Word里,選擇“文件|打開(kāi)”命令,彈出打開(kāi)對(duì)話框,此時(shí)的對(duì)話框就是一個(gè)模態(tài)對(duì)話框。非模態(tài)對(duì)話框打開(kāi)時(shí),程序可以繼續(xù)做其他工作。例如在Word里,選擇“編輯|查找”命令,彈出“查找”對(duì)話框就是非模態(tài)的。

      對(duì)于模態(tài)對(duì)話框的顯示是利用對(duì)話框類的DoModal()函數(shù)實(shí)現(xiàn)的,調(diào)用了該函數(shù)時(shí),就創(chuàng)建了一個(gè)對(duì)話框并顯示。一旦模態(tài)對(duì)話框被創(chuàng)建并顯示出來(lái),它就進(jìn)入一個(gè) 消息循環(huán)。此時(shí)模態(tài)對(duì)話框會(huì)將接收到的消息分發(fā)給需要接收此類消息并進(jìn)行處理。

      而非模態(tài)對(duì)話框使用對(duì)話框類的ShowWindow(SW_SHOW)來(lái)顯示對(duì)話框,而不是使用DoModal()函數(shù),一般情況下,非模態(tài)對(duì)話框的對(duì)象需要利用new操作符進(jìn)行動(dòng)態(tài)的創(chuàng)建對(duì)話框?qū)ο?。?dāng)然C++語(yǔ)言中,對(duì)于利用new操作符創(chuàng)建的內(nèi)容需要使用delete操作符進(jìn)行銷毀。對(duì)于動(dòng)態(tài)創(chuàng)建的對(duì)話框?qū)ο笸瑯有枰陉P(guān)閉對(duì)話框時(shí)利用delete進(jìn)行銷毀。

 

       說(shuō)了這么多了,相信大家已經(jīng)懂了模態(tài)和非模態(tài)對(duì)話框的基本情況,那么在VC中是如何實(shí)現(xiàn)的呢,下面就來(lái)細(xì)細(xì)說(shuō)明

(1)、模態(tài)對(duì)話框的實(shí)現(xiàn)

  新建一個(gè)基于對(duì)話框的應(yīng)用程序Test,在資源視圖中右鍵點(diǎn)擊Dialog,在彈出菜單中選擇“Inert Dialog”,然后根據(jù)類向?qū)陆ㄒ粋€(gè)對(duì)話框相關(guān)的類dlg1

添加主對(duì)話框上與確定鍵相對(duì)應(yīng)的消息響應(yīng)函數(shù),實(shí)現(xiàn)模態(tài)對(duì)話框的顯示,代碼如下:

     

void CTestDlg::OnOK() 
{
    // TODO: Add extra validation here
     dlg1 dlg;
 
     int result=dlg.DoModal();       //調(diào)用對(duì)話框類的成員函數(shù)
     if(result==IDOK)
              AfxMessageBox("單擊確定按鈕");
     else
              AfxMessageBox("單擊取消按鈕");

     CDialog::OnOK();
}

編譯運(yùn)行便可實(shí)現(xiàn)模態(tài)對(duì)話框的顯示了

 

(2)、非模態(tài)對(duì)話框的實(shí)現(xiàn)

                   新建一個(gè)基于對(duì)話框的應(yīng)用程序Test,在資源視圖中右鍵點(diǎn)擊Dialog,在彈出菜單中選擇“Inert Dialog”,然后根據(jù)類向?qū)陆ㄒ粋€(gè)對(duì)話框相關(guān)的類dlg1,

   在CTestDlg類前面添加dg1的聲明語(yǔ)句,如下所示:

   class dlg1;
   class CTestDlg : public CDialog
   {

   ..........

   然后在CTestDlg中添加一個(gè)變量:dlg1 *pdlg;并且在CTestDlg的構(gòu)造函數(shù)中初始化為NULL,而且要在TestDlg.CPP的前面加上頭文件#include"dlg1.h"

 

   然后添加主對(duì)話框確定按鈕的消息映射,代碼如下

void CGeliangDlg::OnOK() 
{
     // TODO: Add extra validation here
     if((pdlg!=NULL)&&::IsWindow(pdlg->m_hWnd))  //判斷對(duì)話框是否已被創(chuàng)建
    {
         AfxMessageBox("對(duì)話框已經(jīng)被創(chuàng)建");
         pdlg->ShowWindow(SW_SHOW);        //已被創(chuàng)建,直接顯示
    }
   else
  {
       pdlg=new dlg1();                             //沒(méi)有被創(chuàng)建,則創(chuàng)建對(duì)象
  }
  if(!::IsWindow(pdlg->m_hWnd))
 {
    pdlg->Create(IDD_DIALOG1,this);              //創(chuàng)建對(duì)話框
    pdlg->ShowWindow(SW_SHOW);              //顯示對(duì)話框
 }
// CDialog::OnOK();
}

在添加內(nèi)存清理函數(shù),

在類視圖中右擊dlg1,選中Add Virtual Function,彈出New Virtual Overrride for class dlg1對(duì)話框,選擇PostNcDestroy,單擊AddHandler按鈕,單擊Edit Exiting按鈕,編寫代碼如下:

void dlg1::PostNcDestroy() 
{
   // TODO: Add your specialized code here and/or call the base class
    delete this;
   // CDialog::PostNcDestroy();
}

至此已經(jīng)完成了非模態(tài)對(duì)話框的顯示與銷毀了。

 

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多