




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、總結MFCf口銷毀過程總結MFC®口銷毀過程假設自己通過new創建了一個窗口對象pWnd然后pWnd->Create。則銷毀窗口的調用次序:1 .手工調用pWnd->DestroyWindow();2 .DestroyWindow會發送WM_DESTR;OY3 .WM_DESTR®YS的消息處理函數是OnDestroy();4 .DestroyWindow會發送WM_NCDEST;ROY5 .WM_NCDESTROY的消息處理函數是OnNcDestroy;6 .OnNcDestroy最后會調用PostNcDestroy;7.PostNcDestroy經常被用戶重
2、載以提供釋放內存操作。例如可以使用deletethis;通過這種方式,窗口對象對應的窗口和窗口對象本身都被釋放了。如果含有子窗口:如果含有子窗口,則調用父窗口的DestroyWindow時,它會向子窗口發送WM_DESTROYWM_NCDESTROY。具體調用順序參考下文的例子。DestroyWindow對delete的影響:應該說前者對后者并沒有什么影響。但經常在DestroyWindow間接導致執行的PostNcDestroy中delete窗口對象指針,即deletethis。CView:PostNcDestroy中唯一的操作就是deletethis;CframeWnd:PostNcDes
3、tory也是如此。而默認的CWnd:PostNcDestroy是空操作,CDialog中也沒有對其進行重載,即也是空。delete對Destroy的影響:delete會導致析構函數。CWnd勺析構函數中有對DestroyWindow的調用,但必須保證:m_hWnd!=NULL&&this!=(CWnd*)&wndTop&&this!=(CWnd*)&wndBottom&&this!=(CWnd*)&wndTopMost&&this!=(CWnd*)&wndNoTopMost。Cdialog的析構函數
4、中也有對DestroyWindow的調用,但條件比較松,只需要m_hWnd!=NULL另外Cdialog:DoModal也會調用DestroyWindow。CFrameWn的OnClose中會調用DestroyWindow,但其析構中不會調用DestroyWindow。CView的析構也不會調用DestroyWindow。一個SDI程序的銷毀過程有CMainFram聯、CMyView。并且CMyViewW兩個子窗口CMyDlg和CmyWnd實例。點擊退出按鈕,CMainFram總收到WM_CLOSE息。CframeWnd(CMainFramefi勺父類)間接會調用CWnd:DestroyWin
5、dow;它首先向CMyVie破送WM_DESTORYWM_NCDESTROY,并引發相應的處理函數;然后向CMyDlg發送WM_DESTORYWM_NCDESTROY,并引發相應的處理函數;然后向CMyWnd送WM_DESTORYWM_NCDESTROY,并引發相應的處理函數。具體的執行順序是:1 .調用CMainFrame:DestroyWindow2 .CFrameWnd:OnDestroy3 .CMyView:OnDestroy4 .CmyWnd:OnDestroy5 .CmyDlg:OnDestroy6 .CmyWnd:PostNcDestroy7 .CmyWnd勺析構8 .CmyDl
6、g:OnDestroy9 .CmyDlg的析構10 .CMyView:PostNcDestroy11 .CmyView的析構12 .CMainFrame的析構13 .CMainFrame:DestroyWindow退出上面情況是假設我們在CmyWndCmyDlg的PostNcDestroy中添加了deletethis。如果沒有添加,則7,10不會執行。因為CView:PostNcDestroy中調用了deletethis,所以然后會執行CMyVieW勺析構操彳因為CframeWnd:PostNcDestroy中調用了deletethis,所以最后執行CMainFrame的析構操作。如果自己的C
7、myDlg和CmyWndEPostNcDestroy中有deletethis;則二者會被析構。否則內存泄漏。當然delete也可以放在CMyVieW勺析構中做,只是不夠OO總結可以有兩種方法銷毀窗口對象對應的窗口和釋放窗口對象指針。一種是通過DestroyWindow。這是比較好的方法,因為最后MFC自動相應WM_CLOSE致CframWnd:DestroyWindow被調用,然后會一次釋放所有子窗口的句柄。用戶需要做的是在PostNcDestroy中釋放堆窗口對象指針。但因為某些對象是在棧中申請的,所以deletethis可能出錯。這就要保證寫程序時自己創建的窗口盡量使用堆申請。另一種是de
8、lete。Delete一個窗口對象指針有的窗口類(如CWndCdialog)會間接調用DestroyWindow,有的窗口類(如CView,CframeWn不會調用DestroyWindow。所以要小心應對。二者是相互調用的,很繁瑣。一段很好的文章:(作者:聞怡洋)一個MFC®口對象包括兩方面的內容:一是窗口對象封裝的窗口,即存放在m_hWn成員中的HWND窗口句柄),二是窗口對象本身是一個C+寸象。要刪除一個MFC®口對象,應該先刪除窗口對象封裝的窗口,然后刪除窗口對象本身。刪除窗口最直接方法是調用CWnd:DestroyWindow或:DestroyWindow,前者封
9、裝了后者的功能。前者不僅會調用后者,而且會使成員m_hWn保存的HWNEE效(NULL)。如果DestroyWindow刪除的是一個父窗口或擁有者窗口,則該函數會先自動刪除所有的子窗口或被擁有者,然后再刪除父窗口或擁有者。在一般情況下,在程序中不必直接調用DestroyWindow來刪除窗口,因為MFG自動調用DestroyWindow來刪除窗口。例如,當用戶退出應用程序時,會產生WM_CLOSE息,該消息會導致MFCS動調用CWnd:DestroyWindow來刪除主框架窗口,當用戶在對話框內按了。城Cancel按鈕時,MFC自動調用CWnd:DestroyWindow來刪除對話框及其控件。
10、窗口對象本身的刪除則根據對象創建方式的不同,分為兩種情況。在MF既程中,會使用大量的窗口對象,有些窗口對象以變量的形式嵌入在別的對象內或以局部變量的形式創建在堆棧上,有些則用new操作符創建在堆中。對于一個以變量形式創建的窗口對象,程序員不必關心它的刪除問題,因為該對象的生命期總是有限的,若該對象是某個對象的成員變量,它會隨著父對象的消失而消失,若該對象是一個局部變量,那么它會在函數返回時被清除。對于一個在堆中動態創建的窗口對象,其生命期卻是任意長的。初學者在學習C+編程時,對new操作符的使用往往不太踏實,因為用new在堆中創建對象,就不能忘記用delete刪除對象。讀者在學習MFC勺例程時
11、,可能會產生這樣的疑問,為什么有些程序用new創建了一個窗口對象,卻未顯式的用delete來刪除它呢?問題的答案就是有些MFC®口對象具有自動清除的功能。如前面講述非模態對話框時所提到的',當調用CWnd:DestroyWindow或二DestroyWindow刪除一個窗口時,被刪除窗口的PostNcDestroy成員函數會被調用。缺省的PostNcDestroy什么也不干,但有些MFC®口類會覆蓋該函數并在新版本的PostNcDestroy中調用deletethis來刪除對象,從而具有了自動清除的功能。此類窗口對象通常是用new操作符創建在堆中的,但程序員不必操心
12、用delete操作符去刪除它們,因為一旦調用DestroyWindow刪除窗口,對應的窗口對象也會緊接著被刪除。不具有自動清除功能的窗口類如下所示。這些窗口對象通常是以變量的形式創建的,無需自動清除功能。所有標準的Windows控件類。1. 從CWn域直接派生出來的子窗口對象(如用戶定制的控件)。2. 切分窗口類CSplitterWnd。3. 缺省的控制條類(包括工具條、狀態條和對話條)。4. 模態對話框類。具有自動清除功能的窗口類如下所示,這些窗口對象通常是在堆中創建的。1 .主框架窗口類(直接或間接從CFrameWnd派生)。2 .視圖類(直接或間接從CView類派生)。讀者在設計自己的派生窗口類時,可根據窗口對象的創建方法來決定是否將窗口類設計成可以自動清除的。例如,對于一個非模態對話框來說,其對象是創建在堆中的,因此應該具有自動清除功能。綜上所述,對于MFC®口類及其派生類來說,在程序中一般不必顯式刪除窗口對象。也就是說,既不必調用DestroyWindow來刪除窗口對象封裝的窗口,也不必顯式地用delete操作符來刪除窗口對象本身。只要保證非自動清除的窗口對象是以變量的形式創建的,自動清除的窗口對象是在堆中創建的,MFC勺運行機制就可以保證窗口對象的徹底刪除。如果需要手工刪除窗口對象,則應該先調用相應的函數(如CWnd:DestroyWindow)刪除窗口,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 設計薪酬績效管理制度
- 評審項目分配管理制度
- 試行課堂手機管理制度
- 貝殼考試答案管理制度
- 財政分局對賬管理制度
- 貨品損失賠付管理制度
- 貨物監管倉庫管理制度
- 貨車司機黨員管理制度
- 2025年中國氡氣檢測試劑盒行業市場全景分析及前景機遇研判報告
- 塔吊安全服務協議書范本
- 部編版七年級歷史(下)材料論述題專項訓練
- 年產1000噸乳酸的生產工藝設計
- 博克服裝CAD制版說明操作手冊(共95頁)
- 南開中學小卷數學模擬試卷(共3頁)
- 光電效應測普朗克常數-實驗報告
- (完整word版)數據模型與決策課程案例分析
- 自制桁架移動式操作平臺施工方案
- 物業服務參與校園文化建設及舉辦大型活動配合措施
- 太陽能LED路燈項目實施方案
- 調崗調薪實操指引PPT課件
- 福清核電廠輻射防護生產準備實踐
評論
0/150
提交評論