VC非模態對話框創建和銷燬

非模態對話框相對於模態對話框,他的創建和銷燬過程和模態對話框有一定的區別

先看一下MSDN的原文:

When   you   implement   a   modeless   dialog   box,   always   override   the   OnCancel   member   function   and   call   DestroyWindow   from   within   it.   Don’t   call   the   base   class   CDialog::OnCancel,   because   it   calls   EndDialog,   which   will   make   the   dialog   box   invisible   but   will   not   destroy   it.   You   should   also   override   PostNcDestroy   for   modeless   dialog   boxes   in   order   to   delete   this,   since   modeless   dialog   boxes   are   usually   allocated   with   new.   Modal   dialog   boxes   are   usually   constructed   on   the   frame   and   do   not   need   PostNcDestroy   cleanup.

MS的指示:非模態對話框需要重載函數OnCanel,並且在這個函數中調用DestroyWindow。並且不能調用基類的OnCancel,因爲基類的OnCancel調用了EndDialog這個函數,這個函數是針對模態對話框的。
還有一個必須重載的函數就是PostNcDestroy,這也是一個虛函數,通常的非模態對話框是用類的指針,通過new創建的,這就需要在PostNcDestroy函數中delete掉這個指針。

瞭解了理論過後,下面我們就可以用代碼實現一下非模態對話框的創建和銷燬過程:
//建立
//主框架中:
CTestDlg *pDlg=new CTestDlg;
pDlg->Create(IDD_TESTDLG,this);
pDlg->ShowWindow(SW_SHOW);


//對話框中:
void CTestDlg::OnCancel()
{
     DestroyWindow();
}

void CTestDlg::PostNcDestroy()
{
     CDialog::PostNcDestroy();
     delete this;
}

如果要在點擊按鈕的情況下,銷燬非模態對話框,只需要把按鈕的事件映射到OnCancel函數即可。

以下是一點資料供參考,非模態對話框的銷燬順序:

MFC應用程序中處理消息的順序

1.AfxWndProc()       該函數負責接收消息,找到消息所屬的CWnd對象,然後調用AfxCallWndProc

2.AfxCallWndProc()   該函數負責保存消息(保存的內容主要是消息標識符和消息參數)供應用程序以後使用,
                     然後調用WindowProc()函數

3.WindowProc()       該函數負責發送消息到OnWndMsg()函數,如果未被處理,則調用DefWindowProc()函數

4.OnWndMsg()         該函數的功能首先按字節對消息進行排序,對於WM_COMMAND消息,調用OnCommand()消息
                     響應函數,對於WM_NOTIFY消息
                     調用OnNotify()消息響應函數。任何被遺漏的消息將是一個窗口消息。OnWndMsg()函數搜
                     索類的消息映像,以找到一個
                     能處理任何窗口消息的處理函數。如果OnWndMsg()函數不能找到這樣的處理函數的話,則
                     把消息返回到WindowProc()函數,由它將消息發送給DefWindowProc()函數

5.OnCommand()       該函數查看這是不是一個控件通知(lParam參數不爲NULL,如果lParam參數爲空的話,說明
                     該消息不是控件通知),如果它是,OnCommand()函數會試圖將消息映射到製造通知的控件;
                     如果他不是一個控件通知(或者如果控件拒絕映射的消息)OnCommand()就會調用OnCmdMsg()函數

6.OnCmdMsg()         根據接收消息的類,OnCmdMsg()函數將在一個稱爲命令傳遞(Command Routing)的過程中潛在的
                     傳遞命令消息和控件通知。
                     例如:如果擁有該窗口的類是一個框架類,則命令和通知消息也被傳遞到視圖和文檔類,併爲該
                     類尋找一個消息處理函數




MFC應用程序創建窗口的過程

1.PreCreateWindow()   該函數是一個重載函數,在窗口被創建前,可以在該重載函數中改變創建參數
                       (可以設置窗口風格等等)

2.PreSubclassWindow() 這也是一個重載函數,允許首先子分類一個窗口

3.OnGetMinMaxInfo()   該函數爲消息響應函數,響應的是WM_GETMINMAXINFO消息,允許設置窗口的最大或者
                       最小尺寸

4.OnNcCreate()         該函數也是一個消息響應函數,響應WM_NCCREATE消息,發送消息以告訴窗口的客戶區
                       即將被創建

5.OnNcCalcSize()       該函數也是消息響應函數,響應WM_NCCALCSIZE消息,作用是允許改變窗口客戶區大小

6.OnCreate()           該函數也是一個消息響應函數,響應WM_CREATE消息,發送消息告訴一個窗口已經被創建

7.OnSize()             該函數也是一個消息響應函數,響應WM_SIZE消息,發送該消息以告訴該窗口大小已經
                       發生變化

8.OnMove()             消息響應函數,響應WM_MOVE消息,發送此消息說明窗口在移動

9.OnChildNotify()     該函數爲重載函數,作爲部分消息映射被調用,告訴父窗口即將被告知一個窗口剛剛被
                       創建





MFC應用程序關閉窗口的順序(非模態窗口)

1.OnClose()       消息響應函數,響應窗口的WM_CLOSE消息,當關閉按鈕被單擊的時候發送此消息

2.OnDestroy()     消息響應函數,響應窗口的WM_DESTROY消息,當一個窗口將被銷燬時,發送此消息

3.OnNcDestroy()   消息響應函數,響應窗口的WM_NCDESTROY消息,當一個窗口被銷燬後發送此消息

4.PostNcDestroy() 重載函數,作爲處理OnNcDestroy()函數的最後動作,被CWnd調用






MFC應用程序中打開模式對話框的函數調用順序

1.DoModal()             重載函數,重載DoModal()成員函數

2.PreSubclassWindow()   重載函數,允許首先子分類一個窗口

3.OnCreate()             消息響應函數,響應WM_CREATE消息,發送此消息以告訴一個窗口已經被創建

4.OnSize()               消息響應函數,響應WM_SIZE消息,發送此消息以告訴窗口大小發生變化

5.OnMove()               消息響應函數,響應WM_MOVE消息,發送此消息,以告訴窗口正在移動

6.OnSetFont()           消息響應函數,響應WM_SETFONT消息,發送此消息,以允許改變對話框中控件的字體

7.OnInitDialog()         消息響應函數,響應WM_INITDIALOG消息,發送此消息以允許初始化對話框中的控件,
                         或者是創建新控件

8.OnShowWindow()         消息響應函數,響應WM_SHOWWINDOW消息,該函數被ShowWindow()函數調用

9.OnCtlColor()           消息響應函數,響應WM_CTLCOLOR消息,被父窗口發送已改變對話框或對話框上面控件
                         的顏色

10. OnChildNotify()     重載函數,作爲WM_CTLCOLOR消息的結果發送





MFC應用程序中關閉模式對話框的順序

1.OnClose()         消息響應函數,響應WM_CLOSE消息,當"關閉"按鈕被單擊的時候,該函數被調用

2.OnKillFocus()     消息響應函數,響應WM_KILLFOCUS消息,當一個窗口即將失去鍵盤輸入焦點以前被髮送

3.OnDestroy()       消息響應函數,響應WM_DESTROY消息,當一個窗口即將被銷燬時,被髮送

4.OnNcDestroy()     消息響應函數,響應WM_NCDESTROY消息,當一個窗口被銷燬以後被髮送

5.PostNcDestroy()   重載函數,作爲處理OnNcDestroy()函數的最後動作被CWnd調用






打開無模式對話框的順序

1.PreSubclassWindow()     重載函數,允許用戶首先子分類一個窗口

2.OnCreate()             消息響應函數,響應WM_CREATE消息,發送此消息以告訴一個窗口已經被創建

3.OnSize()               消息響應函數,響應WM_SIZE消息,發送此消息以告訴窗口大小發生變化

4.OnMove()               消息響應函數,響應WM_MOVE消息,發送此消息以告訴窗口正在移動

5.OnSetFont()             消息響應函數,響應WM_SETFONT消息,發送此消息以允許改變對話框中控件的字體


以上這些的執行都是按給定的順序執行!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章