MFC的非模態對話方塊資源管理

2021-09-08 14:33:12 字數 1033 閱讀 3602

非模態對話方塊比模態對話方塊更難使用這是眾所周知的,這是由於模態對話方塊執行時,阻塞了其父視窗的訊息迴圈,使其能自成一派,所以能夠怡然自得。但非模態對話方塊只相當於乙個由父窗體建立的乙個同級的hwnd,就像乙個長大了的孩子,可以和父母並駕齊驅了,需要父母管又不能管的太厲害,其資源管理、通訊都會比模態的更為複雜。  

很多時候,能用模態對話方塊的情況下,都會用模態的。雖然copper

老先生指著鼻子苦口婆心的教導了我們,但有時候人懶臉皮也就厚了,無所謂了。但,世界總是很殘酷,很多時候(比如需要在處理對話方塊事件的時候也能響應窗體事件),我們不得不去面對非模態對話方塊。其實了解了資源管理的模式,就像扒開了非模態對話方塊半遮的琵琶,可以很坦然的面對了。

模態對話方塊的資源分成兩種,一種是記憶體資源,一種是非記憶體資源。單看非記憶體資源的管理,其實和記憶體資源的管理原理是一樣的。在c++中,記憶體資源的管理講究new和delete配對,同理,非記憶體資源的管理需要create和destroy出雙入對。在這篇文章

中,基本體現了非模態對話方塊資源管理的乙個基本模式,即記憶體資源管理和非記憶體資源同步。

這樣通過判斷記憶體資源是否占用(即指標是否為空)就可以判斷非記憶體資源的使用狀況。當指標為空,說明對話方塊還未建立(非記憶體資源未申請);當指標不為空,對話方塊已建立,正處於可見或不可見狀態。這樣將兩部分資源管理合併在一起了,只需要判斷指標是否為空就可以了解對話方塊資源的狀態。一些記憶體管理的手段,比如類管理思想(將delete和destroy放到類的析構函式中),可以實現資源的自動管理。

為了實現這種管理模式,要注意以下幾點:

1. 在堆上分配非模態對話方塊的記憶體資源,通俗一點的描述就是不要用這種方式:cxxdialog t;而是用這種方式:cxxdialog *t = new cxxdialog();來分配記憶體。

2. 同步構造和析構過程,就是說有new一定配上個create,delete一定要勾搭乙個destroy。

3. 被delete的記憶體指標一定要置空,也就是下面兩句要接踵而至:delete xx;和xx == null;。其實這也是普通的記憶體管理需要遵循的乙個良好習慣。

了解了這些,非模態對話方塊也會只有溫柔沒有猙獰。

MFC 模態對話方塊與非模態對話方塊釋放資源的小總結

對於模態對話方塊,其實它是在堆上建立的物件,當函式結束後會自動釋放其資源。但對於非模態對話方塊資源的釋放就沒這麼直接,原因 1 它是在堆上建立的。2 在當前的使用函式內是不能直接用delete刪除的。後經過查資料才了解怎麼樣處理,對非模式對話方塊做了些總結如下 a.如何建立非模式對話方塊 建立函式 ...

非模態對話方塊 MFC

cvolsetdlg m pvoldlg null m pvoldlg newcvolsetdlg m pvoldlg create idd dlg vol m pvoldlg showwindow sw show 過載oncancel函式 void cxx oncancel todo add yo...

MFC 非模態對話方塊

非模態對話方塊 用mfc可以建立非模態的對話方塊,只是建立方式不同,模態對話方塊用 dlg.domodel 呼叫,而非模態對話方塊要用create函式建立呼叫。假設idd test dlg為已經定義的對話方塊資源的id號 ctestdlg dlg new ctestdlg dlg create id...