国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
模態(tài)對話框與非模態(tài)對話的銷毀

前幾天發(fā)現(xiàn)自己的程序中使用非模態(tài)對話框,Debug版本有警告提示如下:

    Warning: calling DestroyWindow in CWnd::~CWnd OnDestroy or PostNcDestroy in derived class will not be called

    由于是Warnning,就沒有太在意,后來隨意上網(wǎng)一找發(fā)現(xiàn),這個問題還是很嚴重的問題。

    最后,發(fā)現(xiàn)有些基本問題我還沒有搞清楚。同時在這個過程中,也學習了不少新東西,網(wǎng)上關(guān)于這個問題的資料很多,感覺真正把問題講清楚的不多。今天我就來個總結(jié),同時,也把網(wǎng)上有些人的疑問給解答下,更重要的是自己以后忘記了,可以回來參考。

    先說下模式對話框調(diào)用的原則。(就是一定要先關(guān)了這個對話框才能操作后面窗口的對話框)

    在模式對話框下,用CDialog::OnOK()或CDialog::OnCancel()以及CDialog::OnClose()關(guān)閉對話框。

    一定要注意之前的CDialog::(當然,你可以重載你自己對話框的這個虛函數(shù),但是,后面必須調(diào)用基類的CDialog::)

    具體我們再參照深入淺出的風格,來個解刨。

    CDialog::Close()默認調(diào)用CDialog::OnCancel() , CDialog::OnCancel()調(diào)用CDialog::EndDialog(IDCANCEL);

    CDialog::EndDialog調(diào)用CDialog::DestroyWindows(),CDialog::DestroyWindows調(diào)用CDialog::OnDestroy() ;

    CDialog::OnOK()默認先CDialog::UpdateData(),然后再調(diào)用CDialog::EndDialog(IDOK).

    CDialog::EndDialog調(diào)用CDialog::DestroyWindows(), CDialog::DestroyWindows調(diào)用CDialog::OnDestroy()

    看來上面你可能就知道了如下的等式

    CDialog::Close() == CDialog::OnCancel() == CDialog::EndDialog(IDCANCEL)一樣。

    CDialog::OnOK() == CDialog::EndDialog(IDOK).

   而CDialog::EndDialog(IDOK)跟CDialog::EndDialog(IDCANCEL)的區(qū)別就是,少了一個CDialog::UpdateData(),也就是CDialog::EndDialog(IDOK),在關(guān)閉對話框后,會把對話框上控件關(guān)聯(lián)的變量的值更新為用戶最后輸入的值。而CDialog::EndDialog(IDCANCEL)就不會更新這個值。

    希望自己把模式對話框的關(guān)閉講清楚了。

    下面說說非模態(tài)對話框。

    調(diào)用原則是:

    在無模式對話框,重載你自己的OnOK(),就是CMyDialog::OnOK()調(diào)用CDialog::DestroyWindows()。注意:不是默認的CDialog::OnOK()來關(guān)閉對話框。

    重載CMyDialog::OnCancel()調(diào)用CDialog::DestroyWindows()。注意:不是調(diào)用默認的CDialog::OnCancel(),來關(guān)閉對話框。

    聽起來很簡單,但是下面提到一個很具體的編程問題。

    一般,我們用非模態(tài)對話框都是全局的,也就是通過new來創(chuàng)建,是在heap上的,而不是在stack上的。

    這樣我們當然還要通過delete 來銷毀對象,不然可是有內(nèi)存泄漏的。那么我們什么時候delete這個對象呢?

    在msdn上面我們可以看到微軟提供的方法是,

    我們要重載PostNcDestroy(),即我們要實現(xiàn)CMyDialog::PostNcDestroy(),內(nèi)容如下

    CMyDialog::PostNcDestroy() { CDialog::PostNcDestroy(); delete this; }

    這樣的話,我們的類就會Auto-Cleanup了。


本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
vc中關(guān)閉對話框dialog
【轉(zhuǎn)】MFC 窗口關(guān)閉過程
關(guān)于OnOK()、OnCancel()、OnClose()、OnDestroy() 模式對話框
【mfc】用對話框的切換實現(xiàn)重新登錄
MFC 模態(tài)對話框dlg.DoModal()返回值
VC++模態(tài)對話框和非模態(tài)對話框 | 求索閣
更多類似文章 >>
生活服務
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服