1. 程式人生 > >模態對話方塊與非模態對話方塊的建立及的幾種銷燬方法與區別

模態對話方塊與非模態對話方塊的建立及的幾種銷燬方法與區別

對話方塊的建立:

CDialogEx* g_pDlg = NULL;  全域性對話方塊指標 模態對話方塊 void  A() { CTest dlg; dlg.DoModal();   //程式在這裡暫停,只有關閉後才能往下執行 //只有關閉了 dlg建立的窗口才能執行到這裡 } 非模態對話方塊 (可以直接使用,我正在用) void A() { AFX_MANAGE_STATE(AfxGetStaticModuleState());

if(NULL != g_pDlg->GetSafeHwnd())
{
g_pDlg->ShowWindow(SW_SHOW);
return 1;
}
CTest* pDlg  = new CTest(); pDlg->Create:(IDD_TEST_DLG);   //IDD_TEST_DLG  對話方塊ID pDlg->ShowWindow(SW_SHOW); } void CTest::PostNcDestroy()
{
CDialogEx::PostNcDestroy();
delete this;
} 模態對話方塊與非模態對話的幾種銷燬方法與區別
 先著一個注意點,自己誤識了好久: CloseWindow是一個函式,可以用來最小化指定的視窗,但並不銷燬該視窗。
OnClose();  //關閉對話方塊,但不銷燬該視窗, 可以用 ShowWindow(SHOW_WINDOW);重新顯示

先說下模式對話方塊呼叫的原則。

模式對話方塊下,用CDialog::OnOK()或CDialog::OnCancel()以及CDialog::OnClose()關閉對話方塊。

一定要注意之前的CDialog::(當然,你可以過載你自己對話方塊的這個虛擬函式,但是,後面必須呼叫基類的CDialog::

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

CDialog::Close()預設呼叫CDialog::OnCancel(),

CDialog::OnCancel()呼叫CDialog::EndDialog(IDCANCEL);

CDialog::EndDialog(IDCANCEL)呼叫CDialog::DestroyWindows(),

CDialog::DestroyWindows呼叫CDialog::OnDestroy();

CDialog::OnOK()呼叫CDialog::EndDialog(IDOK).

CDialog::EndDialog(IDOK)呼叫UpdateData()和CDialog::DestroyWindows(),

CDialog::DestroyWindows呼叫CDialog::OnDestroy()   

看來上面你可能就知道了如下的過程

CDialog::Close()==>CDialog::OnCancel()==>CDialog::EndDialog(IDCANCEL)

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

CDialog::DestroyWindows()==>CDialog::OnDestroy()

CDialog::EndDialog(IDOK) ==   CDialog::UpdateData() + CDialog::DestroyWindows()==>CDialog::OnDestroy()

CDialog::EndDialog(IDCANCEL) ==CDialog::DestroyWindows()==>CDialog::OnDestroy()

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

希望自己把模式對話方塊的關閉講清楚了。

下面說說非模態對話方塊

呼叫原則是:  一定要用DestroyWindow()來結束非模態對話方塊...因為呼叫CDialog::Create() 時是在堆上 new的物件...需要DestroyWindow來delete 物件..不然會存在資源洩漏的風險...,不要用WM_CLOSE訊息,它不會銷燬非模態對話方塊,用DestroyWindow()是最正確的方法(當然,你可以在響應WM_CLOSE的時候呼叫

Destroywindow)

在無模式對話方塊,過載你自己的OnOK(),就是CMyDialog::OnOK()呼叫CDialog::DestroyWindows()。

注意:過載的OnOk中不不要呼叫父類的OnOk即CDialog::OnOK(),因為CDialog::OnOK()會呼叫EndDialog,而EndDialog是模態對話方塊專用的

過載CMyDialog::OnCancel()呼叫CDialog::DestroyWindows()。

注意:過載的OnCancel中不不要呼叫父類的OnCancelCDialog::OnCancel(),因為CDialog::OnCancel()會呼叫EndDialog,而EndDialog是模態對話方塊專用的

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

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

這樣我們當然還要通過delete 來銷燬物件,不然可是有記憶體洩漏的。那麼我們什麼時候delete這個物件呢?

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

響應這個訊息的時候是delete掉非模態對話物件的最佳時機

所以我們要響應WM_NCDESTROY訊息:

void CMainShowDlg::OnNcDestroy()
{
	CDialog::OnNcDestroy();
	delete this;
}

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

相關推薦

對話方塊對話方塊建立銷燬方法區別

對話方塊的建立: CDialogEx* g_pDlg = NULL;  全域性對話方塊指標 模態對話方塊 void  A() { CTest dlg; dlg.DoModal();   //程式在這裡暫停,只有關閉後才能往下執行 //只有關閉了 dlg建立的窗口才能執行

對話方塊 兩個對話方塊之間值的傳遞

①、模態對話方塊的建立:CDialog::DoModal       不用釋放資源 ②、非模態對話方塊的建立:CDialog::Create     >:  MyDialog dlg;

MFC——對話方塊對話方塊釋放資源的小總結

        對於模態對話方塊,其實它是在堆上建立的物件,當函式結束後會自動釋放其資源。但對於非模態對話方塊資源的釋放就沒這麼直接,原因: (1) 它是在堆上建立的。(2) 在當前的使用函式內是不能直

對話方塊對話方塊建立銷燬

首先宣告:在網上看了很多資料,很多內容也是從別人那裡學到的,只是結合自己的使用寫下來。 在VS中對話方塊分兩種:模態對話方塊和非模態對話方塊。 模態對話方塊就是一旦我被打開了,就得完全做我的事情,只有把我關了,你才能做其他的事情。 非模態對話方塊就是你把我打開了,可以去幹點

QT對話方塊對話方塊

模式對話方塊:在沒有關閉它之前,不能與同一個應用程式的其他視窗進行互動;比如新建專案時彈出的對話方塊。 非模式對話方塊:可以與其他視窗進行互動,比如查詢替換對話方塊。 舉例: #include"mywidget.h" #include "ui_mywidget.h" #

QT-檔案選擇對話方塊

        模態對話方塊與非模態對話方塊的基本概念就不詳說了,簡單說一下:                模態對話方塊彈出時,主視窗被阻塞,簡單來說就是如果該對話方塊不關閉,則主視窗上的按鈕都不可用;                非模態對話方塊反之。       那麼

駱駝命名法和對話對話

混合 evel 置頂 ring int 字節 適合 函數庫 unix 駱駝式命名法(Camel-Case)又稱駝峰命名法,是電腦程式編寫時的一套命名規則(慣例)。正如它的名稱CamelCase所表示的那樣,是指混合使用大小寫字母來構成變量和函數的名字。程序員們為了自己的代碼

8.QT-對話框()

所有 消息 屬於 分享 數值 oid qdialog HA 繼承 對話框介紹 對話框是於用戶進行簡易交互的頂層窗口 QDialog是Qt中所有對話框窗口的父類,是一種容器類型的組件 QDialog繼承於QWidget類,如下圖所示:

VC++6.0 MFC顯示對話方塊對話方塊

1、模態對話方塊 #include "AddDataDlg.h"//新增標頭檔案 CAddDataDlg AddData_Dialog;//在標頭檔案中定義對話方塊物件(CAddDataDlg為該對話方塊對應的類) int nReturn = AddData_Dialog.DoModal

MFC對話方塊對話方塊

下面是一個我的手寫的模態對話方塊和非模態對話方塊圖: 模態對話方塊是指當其顯示時,程式會暫停執行,直到關閉這個模態對話方塊後,才能繼續執行程式中其他任務。非模態對話方塊是指當其顯示時,允許轉而執行程式中其他任務,而不用關閉這個對話方塊。      模態對話方塊的建立:

C#裡面MessageBox不能亂用,阻塞和阻塞,對話方塊

我一開始以為這個MessageBox跟Delphi裡面的ShowMessage是一樣的,程式裡可以隨便放,因為C#裡面就TM這一個封裝好的彈出對話方塊提示訊息函式,可以直接用的。 結果實習做程式測試被坑爹了,發現我錯了,C#這個MessageBox預設是模態對話方塊,是阻塞的,也就是說你不

MFC——對話方塊對話方塊

一、模態對話方塊 如果你需要做一個模態對話方塊,簡單的說就是你點一個按鈕,彈出一個對話方塊,之後你只能在彈出的對話方塊上操作的這麼一個過程。實驗的過程很簡單,跟著我做吧。 下面開始模態對話方塊實驗 在資源檢視新建一個對話方塊資源,修改其ID為IDD_DIAL

MFC中的對話方塊對話方塊

MFC筆記之模態對話方塊和非模態對話方塊 迫於科研的進度壓力,我還是選擇了MFC最為工具去開發裝置除錯軟體,最初想用Qt來創新一下,然而串列埠的通訊一直沒有成功,而且周圍沒有人用Qt使得我在遇到問題無法

對話方塊對話方塊區別

模態對話方塊(Modal Dialog)與非模態對話方塊(Modeless Dialog)的概念不是Qt所獨有的,在各種不同的平臺下都存在。又有叫法是稱為模式對話方塊,無模式對話方塊等。所謂模態對話方塊就是在其沒有被關閉之前,使用者不能與同一個應用程式的其他視窗進行互動,直到該對話方塊關閉。對於非模

MFC建立模對話方塊對話方塊方法

在MFC中對話方塊有兩種形式,一個是模態對話方塊(model dialog box),一個是非模態對話方塊(modeless dialog box)。本文對此分別簡述其建立方法。一、模態對話方塊(model dialog box)在程式執行的過程中,若出現了模態對話方塊,那麼

VS2013/MFC程式設計入門之十一(對話方塊對話方塊建立顯示)

 上一節講了模態對話方塊及其彈出過程,本節接著講另一種對話方塊--非模態對話方塊的建立及顯示。        前面已經說過,非模態對話方塊顯示後,程式其他視窗仍能正常執行,可以響應使用者輸入,還可以相互切換。本文中將上一講中建立的Tip模態對話方塊改為非模態對話方塊,讓

Duilib 對話方塊對話方塊

void CMainDlg::DoTask()   {       CTaskDlg * pDlg = NULL;       pDlg = new CTaskDlg(XML_FILE_NAME_TASK_DLG, WND_CLASS_NAME_TASK_DLG); 

彈窗彈窗

在手機app應用中各種格式的彈窗效果相信大家都看過,也可能反感過某些彈窗,本文就來談談關於app彈窗設計以及彈窗的適用情景。 一、彈窗的定義 1、彈窗作用 彈窗是為了讓使用者迴應,需要使用者與之互動的視窗。 非模態彈窗一般被設計成用來告訴使用者資訊內容,而模態彈窗除了告

mysql介紹(關系型數據庫),關系型關系型數據庫,數據庫文件的對應關系,mysql啟動連接,修改mysql配置信息

修改 關系型 管理 路徑 端口號 ini font serve 主機 mysql介紹 數據庫是用來存儲數據的倉庫本質就是存儲數據的socket套接字c/s架構數據庫服務端:  存放數據庫的主機集群數據庫客戶端:  可以連接數據庫任意客戶端數據庫管理員:DBA數據庫的基本概念

冪運算的解決方法

【問題】 計算a**b%c的值。 其中,"**"代表冪(Python中就是這樣表示的);"%"代表取模運算。 【分析】 首先由模運算的性質,可以得到下面的公式: (a*b) % c = (a%c) * b % c        【公式一】 將【公式一】繼續展開,可