控制代碼和指標

2021-07-25 06:48:15 字數 3152 閱讀 1651

getsafehwnd()

和getsafehandle()的主要區別:

1.使用者不同:

(1)窗體使用:

getsafehwnd()

用於獲取窗體的安全控制代碼(即hwnd),有了hwnd我們就可以方便的對hwnd指向的窗體進行所需的操作了;

(2)gdi物件使用:

getsafehandle()

,用於獲取gdi物件的控制代碼。

注意:在使用指標時強烈建議這麼做:

// psomewnd

為乙個窗體的指標

if ( null != psomewnd && null != psomewnd->getsafehwnd())

// 補充知識:

記憶體控制代碼與指標的區別:

(1).控制代碼其實就是指標,但是他和指標最大的不同是:

給你乙個指標,你可以通過這個指標做任何事情,也許是好事,也許是通過這個指標破壞記憶體,幹一些搗亂的事情。這個我想大家都會碰到過,因為亂用指標可能會導致程式崩潰。

控制代碼就沒有這個缺點,通過控制代碼,你只能幹一些windows允許你幹的事情(例如呼叫一些api函式等等),沒有了指標的隨意。

(2).控制代碼是一些表的索引也就是指向指標的指標。 控制代碼和指標都是位址,控制代碼是windows程式設計的乙個關鍵性的概念,編寫windows應用程式總是要和各種控制代碼打交道。

所謂控制代碼,就是乙個唯一的數,用以標識許多不同的物件型別,如視窗、選單、記憶體、畫筆、畫刷等。在win32裡,控制代碼是指向乙個「無型別物件」(void)的指標,也就是乙個4位元組長的資料。

無論它的本質是什麼,控制代碼並不是乙個真正意義上的指標。

從構造上看,控制代碼是乙個指標,儘管它沒有指向用於儲存某個物件的記憶體位置。事實上,控制代碼指向乙個包含了對該物件進行引用的位置。

控制代碼的宣告是這樣的:

typedef void handle

由於windows是乙個多工作業系統,它可以同時執行多個程式或乙個程式的多個副本。這些執行的程式稱為乙個例項。為了對同一程式的多個副本進行管理,windows引入了例項控制代碼。windows為每個應用程式建立一張表,例項控制代碼就好象是這張表的乙個索引。

不同之處還在於:

1、控制代碼所指的可以是乙個很複雜的結構,並且很有可以是與系統有關的,比如說上面所說的執行緒的控制代碼,它指向的就是乙個類或者結構,他和系統有很密切的關係,當乙個執行緒由於不可預料的原因而終止時,系統就可以**它所占用的資源,如cpu,記憶體等等。反過來想可以知道,這個控制代碼中的某一些項,是與系統進行互動的。由於windows系統是乙個多工的系統,它隨時都可能要分配記憶體,**記憶體,重組記憶體等。 

2、指標它也可以指向乙個複雜的結構,但是通常是使用者定義的,所有的必需的工作都需使用者完成,特別是在刪除的時候。 但在vc++6.0中也有一些指標,它們都是在處理一些小問題才用的,如最常見的字元的指標 它也是需要使用者處理的,譬如你動態分配了記憶體;但是cstring就不要使用者處理了,它其實是vc++中的乙個類,所有的操作都由成員函式完成,產生(分配)由建構函式,刪除(**)由析構函式完成。

附註:獲得視窗控制代碼三種方法

1.hwnd findwindow( 

lpctstr

lpclassname

, lpctstr

lpwindowname);

hwnd findwindowex( hwnd hwndparent, hwnd hwndchildafter,  

lpctstr lpszclass, lpctstr lpszwindow );

2.hwnd windowfrompoint( 

point

point

);//

獲得當前滑鼠游標位置的視窗hwnd

3.bool callback enumchildproc( 

hwnd

hwnd

, lparam

lparam);

bool enumchildwindows( hwnd hwndparent,

wndenumproc lpenumfunc,

lparam lparam );

bool enumwindows( 

wndenumproc 

lpenumfunc

, lparam 

lparam

);

bool callback enumwindowsproc( hwnd hwnd, lparam lparam );
補充知識:指標和控制代碼之間的轉換

a.由指標獲得控制代碼 

cwnd* pwnd ;

hwnd  hwnd ;

hwnd = pwnd-> getsafehwnd();

b.由控制代碼得到指標:

cwnd* pwnd = fromehandle(hmyhandle);

pwnd-> setwindowtext(" hello world!" ) ;

mfc類中有的還提供了標準方法,比如window 控制代碼 : 

static cwnd pascal fromhandle( hwnd hwnd )

hwnd getsafehwnd( ) const

對於位圖: 

static cbitmap pascal fromhandle( hbitmap hbitmap )

static cgdiobject pascal fromhandle( hgdiobj hobject )

hgdiobj getsafehandle( ) const

有人說控制代碼就是乙個標示,乙個id號,是錯誤的。乙個id號可以包括多個資源,比如說單文件中的idr_mainframe,一般是指在硬碟上的資源。但是當把硬碟上的資源調入記憶體以後,將有乙個控制代碼指向它,但是控制代碼只能指向乙個資源。而且控制代碼知道所指的記憶體有多大。而指標指向位址,它不知道分配的記憶體有多大。

但是如果你定義乙個控制代碼,然後在vc裡面右擊滑鼠,選擇" go to definition of handle,你會發現它的本質就是乙個指標,但是它的作用不同於指標。

控制代碼是個指標,指向一塊記憶體,但至於這塊記憶體跟控制代碼所標識的物件是怎麼聯絡起來的,呼叫者不需要清楚,呼叫者只需要知道,這個控制代碼聯絡著乙個win32物件。

控制代碼是實體地址,可以跨程序傳遞,例如,handle ha程序a的乙個視窗,你可以在程序b中利用乙個跟ha相等的值(相等就是說它們強制轉成int32的值相等)初始化乙個控制代碼,

控制代碼和指標

控制代碼是一些表的索引也就是指向指標的指標,控制代碼和指標都是位址,控制代碼是windows程式設計的乙個關鍵性的概念,編寫windows應用程式總是要和各種控制代碼打交道。所謂控制代碼,就是乙個唯一的數,用以標識許多不同的物件型別,如視窗 選單 記憶體 畫筆 畫刷等。在win32裡,控制代碼是指向...

什麼是控制代碼?指標和控制代碼的區別

控制代碼在windows程式設計中是乙個很重要的概念,在許多地方都扮演著重要的角色。在windows環境中,控制代碼是用來標識專案的,這些專案包括 1 模組 module 2 任務 task 3 例項 instance 4 檔案 file 5 記憶體塊 block of memory 6 選單 me...

控制代碼和指標的區別

首先,指標指向系統中物理記憶體的位址,而控制代碼是windows在記憶體中維護的乙個物件記憶體實體地址列表的整數索引,控制代碼是一種指向指標的指標。在windows系統中的記憶體管理一般會將當前處於空閒狀態的物件的記憶體釋放掉,當需要訪問的時候再重新提交分配物理記憶體,從而導致物件的實體地址是變化的...