如何獲取設備描述表句柄--WIN32 api


       Windows提供了幾種獲取設備描述表句柄的方法,如果在處理一條消息時獲取了設備描述表句柄,應該在退出窗口函數之前釋放它。一旦釋放了句柄,它就不再有效了。


       1、最常用的獲取並釋放設備描述表句柄的方法是,在處理WM_PAINT消息時,使用的BeginPaint和EndPaint調用:
hdc = BeginPaint(hwnd,&ps);
//other program lines
EndPaint(hwnd,&ps);

變量ps是類型爲PAINTSTRUCT的結構,該結構的hdc字段是BeginPaint返回的設備描述表句柄。

PAINTSTRUCT結構又包含一個名爲rcPaint的RECT結構,rcPaint定義一個包圍窗口客戶區無效範圍的矩形。使用從BeginPaint獲得的設備描述表句柄,只能在這個區域內繪圖。BeginPaint調用使該區域有效。


2、Windows程序還可以在處理非WM_PAINT消息時獲取設備描述表句柄:
hdc = GetDC(hwnd);
//other program lines
ReleaseDC(hwnd,hdc);

這個設備描述表使用於窗口句柄爲hwnd的客戶區。這些調用與BeginPaint和EndPaint的組合之間的基本區別是,利用從GetDC返回的句柄可以在整個客戶區上繪圖。當然,GetDC和ReleaseDC不使客戶區中任何可能的無效區域變成有效。


3、Windows程序還可以獲取適用於整個窗口(而不僅限於窗口的客戶區)的設備描述句柄:

hdc = GetWindowDC(hwnd);
//other program lines
ReleaseDC(hwnd,hdc);

這個設備描述表除了客戶區之外,還包括窗口的標題欄、菜單、滾動條、和框架。GetWindowDC函數很少使用,如果想嘗試用一用它,則必須捕獲WM_NCPAINT(非客戶繪製)消息,Windows使用該消息在窗口的非客戶區上繪圖。我們看到大部分的網絡遊戲的登陸器就是利用這個設備描述表句柄來完成的個性化製作。


BeginPaint、GetDC和GetWindowDC獲得的設備描述表都與視頻顯示器上的某個特定的窗口相關。獲取設備描述表句柄的另一個更通用的函數是CreateDC:
hdc = CreateDC(pszDriver,pszDevice,pszOutput,pData);
//other program lines
DeleteDC(hdc);


列如,可以通過下面的調用來獲取整個屏幕的設備描述表句柄:
hdc = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);


有時候只是需要獲取關於某設備描述表的一些信息而並不進行任何繪圖,在這種情況下,可以使用CreateIC來獲取一個“信息描述表”的句柄,其參數與CreateDC函數相同,列如:
hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);

不可以使用這個信息環境句柄往設備上寫東西。
當使用位圖時,獲取一個“內存設備描述表”有時是有用的:
hdcMem = CreateCompatibleDC(hdc);
//other program lines
DeleteDC(hdcMem);

利用這個函數可以將位圖選進內存設備描述表,然後使用GDI函數在位圖上繪畫。
還可以獲取元文件設備描述表來創建元文件:
hdcMeta = CreateMetaFile(pszFiename);
//other program lines
hmf = CloseMetaFile(hdcMeta);


在元文件設備描述表有效期間,任何用hdcMeta所做的GDI調用都變成元文件的一部分而不會顯示。在調用CloseMetaFile之後,設備描述表句柄變成無效,函數返回一個指向元文件(hmf)的句柄。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章