談談GetSafeHwnd()和GetSafeHandle()的主要區別
AfxGetApp( )這個函式可以得到當前應用程序的指標,是CWinApp*型別的,通過這個指標可以訪問到這個程序中的物件。
http://baike.baidu.com/link?url=ebdHBLQs6YYpyDiLyc6ZJSU0WfOuBo_sckx79n2TIU6Sm8RAJOkxCx5it0kAMlsT7hf42ZMZs2Af9os3pgUnriOTQu9w5SZMVwM1o5qMxFi
HWND hMainWnd = AfxGetMainWnd()->GetSafeHwnd();
是mfc裡面的。
GetSafeHwnd()和GetSafeHandle()的主要區別:
1.使用者不同:
(1)窗體使用:
GetSafeHwnd()用於獲取窗體的安全控制代碼(即HWND),有了HWND我們就可以方便的對HWND指向的窗體進行所需的操作了;
(2)GDI物件使用:
GetSafeHandle(),用於獲取GDI物件的控制代碼。
注意:在使用指標時強烈建議這麼做:
// pSomeWnd 為一個窗體的指標
if ( NULL != pSomeWnd && NULL != pSomeWnd->GetSafeHwnd())
{
// do something.
}
//////////////////////////////////////////////////////////////////////
補充知識:
記憶體控制代碼與指標的區別:
(1).控制代碼其實就是指標,但是他和指標最大的不同是:給你一個指標,你可以通過這個指標做任何事情,也許是好事,也許是通過這個指標破壞記憶體,幹一些搗亂的事情。這個我想大家都會碰到過,因為亂用指標可能會導致程式崩潰。控制代碼就沒有這個缺點,通過控制代碼,你只能幹一些windows允許你乾的事情(例如呼叫一些api函式等等),沒有了指標的隨意。
(2).控制代碼是一些表的索引也就是指向指標的指標。
控制代碼和指標都是地址,控制代碼是windows程式設計的一個關鍵性的概念,編寫windows應用程式總是要和各種控制代碼打交道。所謂控制代碼,就是一個唯一的數,用以標識許多不同的物件型別,如視窗、選單、記憶體、畫筆、畫刷等。在win32裡,控制代碼是指向一個“無型別物件”(void)的指標,也就是一個4位元組長的資料。無論它的本質是什麼,控制代碼並不是一個真正意義上的指標。 由於windows是一個多工作業系統,它可以同時執行多個程式或一個程式的多個副本。這些執行的程式稱為一個例項。為了對同一程式的多個副本進行管理,windows引入了例項控制代碼。windows為每個應用程式建立一張表,例項控制代碼就好象是這張表的一個索引。
不同之處還在於: 附註:獲得視窗控制代碼三種方法 1.HWND FindWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName); HWND FindWindowEx( HWND hwndParent, HWND hwndChildAfter, LPCTSTR lpszClass, LPCTSTR lpszWindow );
2.HWND WindowFromPoint( 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.由指標獲得控制代碼
b.由控制代碼得到指標:
mfc類中有的還提供了標準方法,比如window 控制代碼
:
對於點陣圖: 有人說控制代碼就是一個標示,一個id號,是錯誤的。一個id號可以包括多個資源,比如說單文件中的idr_mainframe,一般是指在硬碟上的資源。但是當把硬碟上的資源調入記憶體以後,將有一個控制代碼指向它,但是控制代碼只能指向一個資源。而且控制代碼知道所指的記憶體有多大。而指標指向地址,它不知道分配的記憶體有多大。但是如果你定義一個控制代碼,然後在vc裡面右擊滑鼠,選擇" go to definition of handle,你會發現它的本質就是一個指標,但是它的作用不同於指標。 控制代碼是個指標,指向一塊記憶體,但至於這塊記憶體跟控制代碼所標識的物件是怎麼聯絡起來的,呼叫者不需要清楚,呼叫者只需要知道,這個控制代碼聯絡著一個win32物件。 控制代碼是實體地址,可以跨程序傳遞,例如,handle ha程序a的一個視窗,你可以在程序b中利用一個跟ha相等的值(相等就是說它們強制轉成int32的值相等)初始化一個控制代碼,利用這個控制代碼你可以對程序a的那個物件進行操作,例如movewindow showwindow等。控制代碼包含了一些引用計數之類的東西,所以我的上一點說的給控制代碼賦值是不安全的,windows api提供了一些函式,可以對控制代碼進行操作。 控制代碼就是受限的指標。它是由作業系統管理的,你不能通過它直接存取作業系統建立的資料結構(應該先獲取對應的指標)。 作業系統在建立一個物件(如gdi, file)等的時候,它會為這個物件上下文context保留一塊資料結構,然後把它放在一張全域性表中。控制代碼就是這塊資料結構在表中的索引。 |