視窗類 視窗類物件與視窗

2022-03-10 16:52:55 字數 1222 閱讀 5380

**

我們可以發現, sdk 程式中多了乙個 hwnd 型別的變數 hwnd 。該變數用來儲存由 createwindowex函式建立的視窗控制代碼,並將其作為引數傳遞給隨後的顯示視窗操作( showwindow 函式)和更新視窗操作(updatewindow 函式)。而我們自定義的實現**中, cwnd 類定義了乙個 hwnd 型別的成員變數:m_hwnd ,用於儲存這個視窗控制代碼。首先 cwnd 類的 createex 函式建立視窗,並將該視窗控制代碼 儲存到這個成員變數,接著呼叫 cwnd 類的 showwindow 函式顯示視窗時,就不需要再傳遞這個控制代碼了,因為它已經是成員變數,該函式可以直接使用它。 cwnd 類的 updatewindow 函式也是一樣的道理。

許多程式設計師在進行 mfc 程式開發時,容易混淆一點:認為這裡的 cwnd 型別的 wnd 這個 c++ 物件所代表的就是乙個視窗。因為在實踐中,他們看到的現象是:當 c++ 視窗類物件銷毀時,相應的視窗也就沒了。有時正好巧合,當視窗銷毀時, c++ 視窗類物件的生命週期也到了,從而也銷毀了。正因為如此,許多程式設計師感覺 c++ 視窗類物件就是視窗,視窗就是這個 c++ 視窗類物件。事實並非如此。讀者可以想像一下,如果我們關閉了乙個視窗,這個視窗就銷毀了,那麼該視窗對應的 c++ 視窗類物件銷毀了沒有呢?當然沒有。當乙個視窗銷毀時,它會呼叫 cwnd 類的 destroywindow 函式,該函式銷毀視窗後,將 cwnd 成員變數:m_hwnd 設為 null 。

c++ 視窗類物件的生命週期和視窗的生命週期不是一致的。當乙個視窗銷毀時,與 c++ 視窗類物件沒有關係,它們之間的紐帶僅僅在於這個 c++ 視窗類內部的成員變數: m_hwnd ,該變數儲存了與這個 c++ 視窗類物件相關的那個視窗的控制代碼。

另一方面,當我們設計的這個 c++ 視窗類物件銷毀的時候,與之相關的視窗是應該銷毀的,因為它們之間的紐帶( m_hwnd )已經斷了。另外,視窗也是一種資源,它也佔據記憶體。這樣,在 c++ 視窗類物件析構時,也需要**相關的視窗資源,即銷毀這個視窗。

因此,讀者一定要注意:

c++視窗類物件與視窗並不是一回事,它們之間惟一的關係是 c++視窗類物件內部定義了乙個視窗控制代碼變數,儲存了與這個 c++視窗類物件相關的那個視窗的控制代碼。視窗銷毀時,與之對應的 c++視窗類物件銷毀與否,要看其生命週期是否結束。但 c++視窗類物件銷毀時,與之相關的視窗也將銷毀。

視窗控制代碼 視窗類物件以及窗

視窗控制代碼 視窗類物件以及視窗之間的關係 air的技術檔案館 視窗控制代碼,提供了視窗的乙個標識,類似於指標的概念,每乙個視窗都對應了乙個視窗控制代碼作為其標識,通過控制代碼可以方便的從記憶體中索引到資源。視窗類的物件則是對應視窗類的乙個例項化,在mfc程式中,通過子類物件訪問類的函式時就不需要提...

視窗風格 視窗類風格

視窗風格 ws border 新建乙個有邊框的視窗 ws caption 新建乙個有邊框 標題欄的視窗。不能和 ws dlgframe 一起用 ws child 新建乙個子視窗,不能和 ws popup 一起用 ws childwindow 和 ws child 風格一樣 ws clipchildr...

視窗類釋放問題

寫了乙個帶窗體的dll,在dll初始化時呼叫 if one findwindow sipselect clsname,null null 但是在第二次載入dll失敗,當然以後都會失敗的。設計發現,if one findwindow sipselect clsname,null null 失敗,導致不...