模態視窗與非模態視窗銷毀方法

來源:互聯網
上載者:User

前幾天發現自己的程式中使用非模態對話方塊,Debug版本有警告提示如下:

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

    由於是Warnning,就沒有太在意,後來隨意上網一找發現,這個問題還是很嚴重的問題。

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

    先說下強制回應對話方塊調用的原則。(就是一定要先關了這個對話方塊才能操作後面視窗的對話方塊)

    在強制回應對話方塊下,用CDialog::OnOK()或CDialog::OnCancel()以及CDialog::OnClose()關閉對話方塊。

    一定要注意之前的CDialog::(當然,你可以重載你自己對話方塊的這個虛函數,但是,後面必須調用基類的CDialog::)

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

    CDialog::Close()預設調用CDialog::OnCancel() , CDialog::OnCancel()調用CDialog::EndDialog(IDCANCEL);

    CDialog::EndDialog調用CDialog::DestroyWindows(),CDialog::DestroyWindows調用CDialog::OnDestroy() ;

    CDialog::OnOK()預設先CDialog::UpdateData(),然後再調用CDialog::EndDialog(IDOK).

    CDialog::EndDialog調用CDialog::DestroyWindows(), CDialog::DestroyWindows調用CDialog::OnDestroy()

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

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

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

    而CDialog::EndDialog(IDOK)跟CDialog::EndDialog(IDCANCEL)的區別就是,少了一個CDialog::UpdateData(),也就是CDialog::EndDialog(IDOK),在關閉對話方塊後,會把對話方塊上控制項關聯的變數的值更新為使用者最後輸入的值。而CDialog::EndDialog(IDCANCEL)就不會更新這個值。

    希望自己把強制回應對話方塊的關閉講清楚了。

    下面說說非模態對話方塊。

    調用原則是:

    在無強制回應對話方塊,重載你自己的OnOK(),就是CMyDialog::OnOK(),然後在函數裡調用CDialog::DestroyWindows()。注意:不是預設的CDialog::OnOK()來關閉對話方塊。

    重載CMyDialog::OnCancel(),然後在函數裡調用CDialog::DestroyWindows()。注意:不是調用預設的CDialog::OnCancel(),來關閉對話方塊。

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

    一般,我們用非模態對話方塊都是全域的,也就是通過new來建立,是在heap上的,而不是在stack上的。

    這樣我們當然還要通過delete 來銷毀對象,不然可是有記憶體流失的。那麼我們什麼時候delete這個對象呢?

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

    我們要重載PostNcDestroy(),即我們要實現CMyDialog::PostNcDestroy(),內容如下

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

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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.