話題引入:在c語言時代,當人們使用純粹的c開發windows應用程式時,只需要通過視窗控制代碼hwnd【hwnd是wnd的記憶體控制代碼,而wnd是windows是乙個內部私有資料結構,儲存著視窗的相關資訊:尺寸資訊、標題資訊等。一般來說開發人員無法訪問這個資料結構,不過可以以hwnd為引數呼叫windows的api函式如:getwindowrect、getwindowtext等獲得對其的訪問】即可完成有關視窗的操作。mfc類是c++類機制,mfc的類通過c++的物件方法將視窗的控制代碼封裝起來。存在著視窗控制代碼(windows物件)到mfc中c++視窗物件(mfc物件)之間的對映機制,該機制保證了hwnd與c++物件之間的雙向溝通,從而開闢了程式設計的一種全新模式。控制代碼對映機制主要包括兩個類控制代碼對映輔助類、模組——執行緒狀態類。參見書《mfc視窗程式設計 姚領田,高守傳 中國水利水電出版社》第一章windows視窗與cwnd物件。
這個筆記描述了mfc的規則,這個規則支援視窗的物件控制代碼到c++物件的對映。
問題使用控制代碼對映的視窗物件如下:
hwnd是wnd的記憶體控制代碼,窗體控制代碼,而wnd是windows是乙個內部私有資料結構,儲存著視窗的相關資訊:尺寸資訊、標題資訊等。一般來說開發人員無法訪問這個資料結構,不過可以以hwnd為引數呼叫windows的api函式如:getwindowrect、getwindowtext等獲得對其的訪問
hdc是裝置描述表(device context)的控制代碼。裝置描述表中記錄和此裝置相關的各種資訊,比如對於顯示器來說,記錄了顯示器的尺寸、解析度,還有當前選擇的畫筆、畫刷、字型等gdi物件的資訊。 可以將hdc理解做乙個裝置的表面,比如顯示器的表明,印表機的表面等等,我們可以使用這個hdc在這些表明上繪製圖形——很多gdi繪圖函式,都需要使用這個hdc作為引數的。
hmenu是選單控制代碼。hpen是畫筆控制代碼。hbrush 畫刷控制代碼。hfont 字型控制代碼。hbitmap點陣圖控制代碼。hpalette 調色盤控制代碼。hrgn 區域 (region)控制代碼。
通過給以上這些物件賦予控制代碼,你可以發現mfc的物件的封裝操作是通過呼叫乙個靜態的成員函式 fromhandle來實現的。舉例,已知乙個值為hwnd的hwnd cwnd::fromhandle(hwnd)
將會返回乙個指向cwnd的指標,這個指標封裝了hwnd。如果hwnd並沒有產生乙個明確的物件,那麼乙個臨時的cwnd將被建立出來封裝hwnd。這使通過任何控制代碼獲得乙個有效的c++物件變得可能。
attaching handles to mfc objects
已知乙個新建立的已封裝的控制代碼物件和乙個指向視窗物件的控制代碼,你可以將這兩者通過呼叫attach聯絡起來。例如:
成員函式detach 做這些工作。
mywnd.detach();
臨時物件
當fromhandle 被付給乙個控制代碼的時候的時候並沒有乙個已經封裝的c++物件,那麼就會產生乙個臨時的物件。這些臨時的物件是同他們的控制代碼相分離的,並且通過呼叫deletetempmap 函式進行刪除。預設狀況下onidle 時刻cwinthread 自動呼叫deletetempmap 來使每乙個類都支援臨時的控制代碼對映。這就意味著你不能假定乙個指向臨時物件的指標可以在獲得該指標的函式退出時依然保持有效,在windows訊息迴圈空閒時間這個臨時的物件就會被刪除。
封裝物件和多執行緒
視窗控制代碼 視窗類物件以及窗
視窗控制代碼 視窗類物件以及視窗之間的關係 air的技術檔案館 視窗控制代碼,提供了視窗的乙個標識,類似於指標的概念,每乙個視窗都對應了乙個視窗控制代碼作為其標識,通過控制代碼可以方便的從記憶體中索引到資源。視窗類的物件則是對應視窗類的乙個例項化,在mfc程式中,通過子類物件訪問類的函式時就不需要提...
視窗和控制代碼
視窗是windows 應用程式中的乙個非常重要的元素,乙個 windows 應用程式至少要有乙個視窗,稱為主視窗。視窗是螢幕上的一塊矩形區域,是 windows 應用程式與使用者進行互動的介面。利用視窗,可以接收使用者的輸入,以及顯示輸出。乙個應用程式視窗通常都包含標題欄,選單欄,系統選單,最小化框...
獲取視窗控制代碼
在windows中,控制代碼是乙個系統內部資料結構的引用。例如當你操作乙個視窗,或說是乙個delphi窗體時,系統會給你乙個該視窗的控制代碼,系統會通知你 你正在操作142號視窗,就此你的應用程式就能要求系統對 142號視窗進行操作 移動視窗 改變視窗大小 把視窗最小化等等。實際上許多windows...