關於控制代碼的一些知識
來源:互聯網
上載者:User
控制(control)、字型(font)、資源(resource),包括表徵圖(icon),游標 (cursor),字串(string)等、GDI對象(GDI
object),包括位元影像(bitmap),畫刷(brush),元檔案(metafile),調色盤(palette),畫筆(pen),地區 (region),以及裝置描述表(device context)。
<<WINDOWS編程短平快>>(南京大學出版社):
控制代碼是WONDOWS用來標識被應用程式所建立或使用的對象的唯一整數,WINDOWS使用各種各樣的控制代碼標識諸如應用程式執行個體,視窗,控制,位元影像,GDI對象等等。WINDOWS控制代碼有點象C語言中的檔案控制代碼。
二、MFC原始碼:
#ifdef STRICT
typedef void *HANDLE;
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif
DECLARE_HANDLE(HMODULE);
DECLARE_HANDLE(HINSTANCE);
DECLARE_HANDLE(HLOCAL);
DECLARE_HANDLE(HGLOBAL);
DECLARE_HANDLE(HDC);
DECLARE_HANDLE(HRGN);
DECLARE_HANDLE(HWND);
DECLARE_HANDLE(HMENU);
DECLARE_HANDLE(HACCEL);
DECLARE_HANDLE(HTASK);
三、理解:
HANDLE就是PVOID,也就是無類型指標,
上面這些資源的控制代碼Handles都不過是指向struct的指標,至於這個struct的用處,連M$都說unused了,現在解釋下M$這麼做的意義,這就是所謂資料封裝,你可以在你的程式中把M$的內部結構指標傳來傳去,可是你卻不知道它到底指向的內容是什麼。
控制代碼與指標確實是完全不同的兩個概念。控制代碼僅僅是一個32位整數,WIN32中用於標記某個系統或進程的對象,可以理解為對象索引(由於M$未完全公開相關技術,在一定程度上只能如此理解),這個索引更像是一種映射關係(從控制代碼到對象指標的映射),而不是純粹意義上的“數組下標”。
控制代碼可以理解為用於指向或標識記憶體的一塊“資源”,這些資源如:檔案(file)、記憶體塊(block of memory)、菜單(menu)等等。作業系統通過控制代碼來定位核心對象和系統資源。
指標即為指向記憶體的“資料或指令”某一單元。
說的確切一點,控制代碼實際上是一種指向某種資源的指標,但與指標又有所不同:指標對應著一個資料在記憶體中的地址,得到了指標就可以自由地修改該資料。Windows並不希望一般程式修改其內部資料結構,因為這樣太不安全。所以Windows給每個使用GlobalAlloc等函式宣告的記憶體地區指定一個控制代碼(本質上仍是一個指標,但不要直接操作它),平時你只是在調用API函數時利用這個控制代碼來說明要操作哪段記憶體。
四、引喻:
牧童遙指杏花村
牧童的手為指標,杏花村的牌子為控制代碼,杏花村酒店為對象的執行個體.
附註:獲得視窗控制代碼三種方法
1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)
HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName)
2.HWND WindowFromPoint(POINT& Point)//獲得當前滑鼠游標位置的視窗HWND
3.BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
BOOL CALLBACK EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc,LPARAM lParam)
BOOL CALLBACK EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)