程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 模態對話框與非模態對話的銷毀方法與區別

模態對話框與非模態對話的銷毀方法與區別

編輯:關於VC++

前幾天發現自己的程序中使用非模態對話框,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了。

msdn的建議,英文的,當初我看了2遍沒看懂。現在在回頭去看,才發現比較簡單。但讓現在你看了這篇blog後就不用看這個了。

http://msdn.microsoft.com/en-us/library/5zba4hah.aspx

http://renjwjx.blog.51cto.com/811549/191320/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved