| 導購 | 订阅 | 在线投稿
分享
 
 
 

Windows API-GDI入門基礎知識詳解(1)

來源:互聯網  2008-06-01 02:05:13  評論

什麽是GDI?GDI是Graphics Device Interface的縮寫,含義是圖形設備接口,它的主要任務是負責系統與繪圖程序之間的信息交換,處理所有Windows程序的圖形輸出。

在Windows操作系統下,絕大多數具備圖形界面的應用程序都離不開GDI,我們利用GDI所提供的衆多函數就可以方便的在屏幕、打印機及其它輸出設備上輸出圖形,文本等操作。GDI的出現使程序員無需要關心硬件設備及設備驅動,就可以將應用程序的輸出轉化爲硬件設備上的輸出,實現了程序開發者與硬件設備的隔離,大大方便了開發工作。GDI是如何實現輸出的?要想在屏幕或者其它輸出設備上輸出圖形或者文字,那麽我們就必須先獲得一個稱爲設備描述表( DC:Device Context)的對象的句柄,以它爲參數,調用各種GDI函數實現各種文字或圖形的輸出。

設備描述表是GDI內部保存數據的一種數據結構,此結構中的屬性內容與特定的輸出設備(顯示器,打印機等)相關,屬性定義了GDI函數的工作細節,在稍後我們將看到如何使用TextOut函數輸出文字,在這裏屬性確定了文字的顔色,x坐標和y坐標映射到窗口顯示區域的方式等。設備描述表句柄一旦獲得,那麽系統將使用默認的屬性值填充設備描述表結構。假如有必要,我們可以使用一些GDI函數獲取和改變設備描述表中的屬性值。什麽是有效矩形什麽是無效矩形?當應用程序接受到WM_PAINT消息後通常就預備更新正個顯示區域,但是通常只需要更新一個比較小的區域而不是整個區域,這種情況通常出現在當應用程序的主窗口的一部分被一個對話框覆蓋,需要重畫的只是被覆蓋的矩形區域(見下圖)。

Windows API-GDI入門基礎知識詳解(1)
EXE示例程序下載:點擊這裏下載(90K, WinZip壓縮文件)陰影以下的部分就是需要更新的矩形區域,該區域就是我們所說的無效區域,正是因爲此區域的存在,系統才會向消息隊列中放入一個WM_PAINT消息。Windows內部爲每個窗口都保留了一個繪圖結構(PAINTSTRUCT),它包含了包圍無效區域的最小矩形的坐標和一些其它信息,需要注重的是當窗口消息處理函數在處理WM_PAINT消息之前顯示區域中出現了另一個無效區域,那麽Windows會計算出一個包圍兩個無效區域的新無效區域,並把這種變化保存在繪圖結構(PAINTSTRUCT)中,Windows是不會同時把多個WM_PAINT消息同時放到消息隊列中的。窗口消息處理函數是通過調用InvalidateRect函數使窗口顯示區域內的矩形變爲無效的,假如消息隊列中已經存在一個WM_PAINT消息,那麽Windows將計算出新的無效矩形,在接收到WM_PAINT消息的時候,窗口消息處理函數可以獲得無效矩形的座標,通過調用GetUpdateRect,可以在任何時候獲得這些坐標。
Windows API-GDI入門基礎知識詳解(1)
更多內容請看linux基礎知識 Solaris基礎知識入門 Windows操作系統安全集專題,或

如何獲取或釋放設備描述表句柄? 當應用程序需要繪圖的時候,必須先獲取設備描述表句柄,繪圖操作結束後必須釋放設備描述表句柄。我們有兩種方法獲取和釋放設備描述表句柄。1. 使用BeginPaint和Endpaint函數

通常是在應用程序接收到WM_PAINT消息,也就是需要更新窗口的顯示區域的時候調用BeginPaint函數獲取設備描述表句柄的,使用完後調用Endpaint函數釋放設備描述表句柄。他們的函數原型爲:HDC BeginPaint(

HWND hwnd,, // handle to window

LPPAINTSTRUCT pPaint // paint information

);

BOOL EndPaint(

HWND hWnd, // handle to window

CONST PAINTSTRUCT *pPaint // paint data

);從上面BeginPaint函數的原形中我們可以看到需要一個PAINTSTRUCT結構對象的內存地址,PAINTSTRUCT結構包含在WinUser.h頭文件中。定義如下:typedef struct tagPAINTSTRUCT {

HDC hdc;//設備描述表句柄

BOOL fErase; //擦除狀態

RECT rcPaint; //無效矩形座標

BOOL fRestore;

BOOL fIncUpdate;

BYTE rgbReserved[32];

}

PAINTSTRUCT, *PPAINTSTRUCT, *NPPAINTSTRUCT, *LPPAINTSTRUCT;事實上當程序調用BeginPaint函數的時候,Windows會自動的填寫此結構的各個屬性,而程序作者只需要關心前三個屬性。第一個屬性hdc表示當前的設備描述表句柄。第二個屬性fErase來說,多數情況下它是被標記成FALSE(0)的,這表示Windows已經擦除了無效矩形的背景,這個擦除動作是是在BeginPaint函數中發生的,而擦除背景用的畫刷則是WNDCLASS結構中的hbrBackground屬性指定的畫刷來擦除背景的,在很多情況下可能程序作者想自己定義一些插除行爲,那麽可以通過響應消息隊列中的WM_ERASEBKGND消息來完成。第三個屬性rcPaint則表示無效矩形座標,它定義了無效矩形的邊界。RECT結構可以在WinDef.h頭文件中找到。定義如下:typedef struct tagRECT

{

LONG left;

LONG top;

LONG right;

LONG bottom;

} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;注重,我們在前面提到了InvalidateRect函數,並已經清楚了調用它可以讓窗口顯示區域內的矩形變爲無效,那麽我們就可以在處理WM_PAINT消息的時候通過調用它實現在無效矩形外繪圖,該調用是在調用BegingPaint函數之前調用的。使用方法:InvalidateRect(hwnd,NULL,TRUE);通過上面代碼的調用我們讓整個顯示區域變爲了無效,並擦除背景,要注重的是,最後一個參數假如爲FALSE,則不擦除背景,原有的東西將保留在原處,這通常是在接受到WM_PAINT消息的時候而不考慮rcPaint屬性的情況下簡單的重繪整個顯示區域最方便的方法,例如,在顯示區域內我們輸出了一個圖形,這個圖形的一小部分落在了無效矩形區域內,而這就讓繪制這個圖形的無效部分變的沒有意義,這時就需要重繪整個圖形,因爲在調用BeginPaint函數傳回設備描述表句柄的時候,Windows不會繪制rcPaint也就是無效矩形以外的任何部分。對于InvalidateRect函數的具體舉例,我們將在以後的章節中看到。

Windows API-GDI入門基礎知識詳解(1)
更多內容請看Linux基礎知識 Solaris基礎知識入門 Windows操作系統安全集專題,或

2. 使用GetDC和ReleaseDC函數

在很多情況下我們可能需要在接收到非WM_PAINT消息的時候獲取設備描述表句柄,通過調用GetDC函數我們可以獲得設備描述表句柄,因爲程序作者可能要使用設備描述表句柄完成其它工作,例如獲得設備描述表屬性,或者修改設備描述表屬性值等,在最後我們與第一種方法一樣要釋放句柄,通過調用ReleaseDC函數完成工作。他們的函數原型爲:HDC GetDC(

HWND hWnd // handle to window

);

int ReleaseDC(

HWND hWnd, // handle to window

HDC hDC // handle to DC

);兩種方法的區別:<1> 使用BeginPaint函數獲得的的操作區域是顯示區域中的無效矩形區域,接下來繪圖操作只能在窗口的無效區域範圍內進行,無效區域以外的區域將被忽略不能進行操作,而GetDC函數獲得的操作區域則是整個窗口的顯示區域,之後的操作可以在任何部分進行,而不只限制在無效區域。<2> BeginPaint函數會自動把無效區域變成有效的區域,而GetDC函數則不會將任何無效區域變得有效,必須強行調用ValidateRect函數,並把第二個參數設置爲NULL來完成。最後我們給出一個可執行程序的例子,當應用程序執行的時候會有一個對話框出現,當你拉動這個對話框的時候又會出現同樣的另一個對話框,這就證實了窗口的覆蓋會造成無效矩形的出現,系統將會發送WM_PAINT消息。未完待續……

Windows API-GDI入門基礎知識詳解(1)
更多內容請看Linux基礎知識 Solaris基礎知識入門 Windows操作系統安全集專題,或

什麽是GDI?  GDI是Graphics Device Interface的縮寫,含義是圖形設備接口,它的主要任務是負責系統與繪圖程序之間的信息交換,處理所有Windows程序的圖形輸出。   在Windows操作系統下,絕大多數具備圖形界面的應用程序都離不開GDI,我們利用GDI所提供的衆多函數就可以方便的在屏幕、打印機及其它輸出設備上輸出圖形,文本等操作。GDI的出現使程序員無需要關心硬件設備及設備驅動,就可以將應用程序的輸出轉化爲硬件設備上的輸出,實現了程序開發者與硬件設備的隔離,大大方便了開發工作。GDI是如何實現輸出的?  要想在屏幕或者其它輸出設備上輸出圖形或者文字,那麽我們就必須先獲得一個稱爲設備描述表( DC:Device Context)的對象的句柄,以它爲參數,調用各種GDI函數實現各種文字或圖形的輸出。 設備描述表是GDI內部保存數據的一種數據結構,此結構中的屬性內容與特定的輸出設備(顯示器,打印機等)相關,屬性定義了GDI函數的工作細節,在稍後我們將看到如何使用TextOut函數輸出文字,在這裏屬性確定了文字的顔色,x坐標和y坐標映射到窗口顯示區域的方式等。  設備描述表句柄一旦獲得,那麽系統將使用默認的屬性值填充設備描述表結構。  假如有必要,我們可以使用一些GDI函數獲取和改變設備描述表中的屬性值。什麽是有效矩形什麽是無效矩形?  當應用程序接受到WM_PAINT消息後通常就預備更新正個顯示區域,但是通常只需要更新一個比較小的區域而不是整個區域,這種情況通常出現在當應用程序的主窗口的一部分被一個對話框覆蓋,需要重畫的只是被覆蓋的矩形區域(見下圖)。[url=/bbs/detail_1785342.html][img]http://image.wangchao.net.cn/it/1323423828855.gif[/img][/url]  EXE示例程序下載:點擊這裏下載(90K, WinZip壓縮文件)  陰影以下的部分就是需要更新的矩形區域,該區域就是我們所說的無效區域,正是因爲此區域的存在,系統才會向消息隊列中放入一個WM_PAINT消息。  Windows內部爲每個窗口都保留了一個繪圖結構(PAINTSTRUCT),它包含了包圍無效區域的最小矩形的坐標和一些其它信息,需要注重的是當窗口消息處理函數在處理WM_PAINT消息之前顯示區域中出現了另一個無效區域,那麽Windows會計算出一個包圍兩個無效區域的新無效區域,並把這種變化保存在繪圖結構(PAINTSTRUCT)中,Windows是不會同時把多個WM_PAINT消息同時放到消息隊列中的。  窗口消息處理函數是通過調用InvalidateRect函數使窗口顯示區域內的矩形變爲無效的,假如消息隊列中已經存在一個WM_PAINT消息,那麽Windows將計算出新的無效矩形,在接收到WM_PAINT消息的時候,窗口消息處理函數可以獲得無效矩形的座標,通過調用GetUpdateRect,可以在任何時候獲得這些坐標。 [url=/bbs/detail_1785342.html][img]http://image.wangchao.net.cn/it/1323423829025.gif[/img][/url] 更多內容請看linux基礎知識 Solaris基礎知識入門 Windows操作系統安全集專題,或 如何獲取或釋放設備描述表句柄?   當應用程序需要繪圖的時候,必須先獲取設備描述表句柄,繪圖操作結束後必須釋放設備描述表句柄。我們有兩種方法獲取和釋放設備描述表句柄。1. 使用BeginPaint和Endpaint函數   通常是在應用程序接收到WM_PAINT消息,也就是需要更新窗口的顯示區域的時候調用BeginPaint函數獲取設備描述表句柄的,使用完後調用Endpaint函數釋放設備描述表句柄。他們的函數原型爲:HDC BeginPaint( HWND hwnd,, // handle to window LPPAINTSTRUCT pPaint // paint information ); BOOL EndPaint( HWND hWnd, // handle to window CONST PAINTSTRUCT *pPaint // paint data );  從上面BeginPaint函數的原形中我們可以看到需要一個PAINTSTRUCT結構對象的內存地址,PAINTSTRUCT結構包含在WinUser.h頭文件中。  定義如下:typedef struct tagPAINTSTRUCT { HDC hdc; //設備描述表句柄 BOOL fErase; //擦除狀態 RECT rcPaint; //無效矩形座標 BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[32]; } PAINTSTRUCT, *PPAINTSTRUCT, *NPPAINTSTRUCT, *LPPAINTSTRUCT;  事實上當程序調用BeginPaint函數的時候,Windows會自動的填寫此結構的各個屬性,而程序作者只需要關心前三個屬性。  第一個屬性hdc表示當前的設備描述表句柄。  第二個屬性fErase來說,多數情況下它是被標記成FALSE(0)的,這表示Windows已經擦除了無效矩形的背景,這個擦除動作是是在BeginPaint函數中發生的,而擦除背景用的畫刷則是WNDCLASS結構中的hbrBackground屬性指定的畫刷來擦除背景的,在很多情況下可能程序作者想自己定義一些插除行爲,那麽可以通過響應消息隊列中的WM_ERASEBKGND消息來完成。  第三個屬性rcPaint則表示無效矩形座標,它定義了無效矩形的邊界。  RECT結構可以在WinDef.h頭文件中找到。  定義如下:typedef struct tagRECT { LONG left; LONG top; LONG right; LONG bottom; } RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;  注重,我們在前面提到了InvalidateRect函數,並已經清楚了調用它可以讓窗口顯示區域內的矩形變爲無效,那麽我們就可以在處理WM_PAINT消息的時候通過調用它實現在無效矩形外繪圖,該調用是在調用BegingPaint函數之前調用的。  使用方法:InvalidateRect(hwnd,NULL,TRUE);  通過上面代碼的調用我們讓整個顯示區域變爲了無效,並擦除背景,要注重的是,最後一個參數假如爲FALSE,則不擦除背景,原有的東西將保留在原處,這通常是在接受到WM_PAINT消息的時候而不考慮rcPaint屬性的情況下簡單的重繪整個顯示區域最方便的方法,例如,在顯示區域內我們輸出了一個圖形,這個圖形的一小部分落在了無效矩形區域內,而這就讓繪制這個圖形的無效部分變的沒有意義,這時就需要重繪整個圖形,因爲在調用BeginPaint函數傳回設備描述表句柄的時候,Windows不會繪制rcPaint也就是無效矩形以外的任何部分。  對于InvalidateRect函數的具體舉例,我們將在以後的章節中看到。 [url=/bbs/detail_1785342.html][img]http://image.wangchao.net.cn/it/1323423829045.gif[/img][/url] 更多內容請看Linux基礎知識 Solaris基礎知識入門 Windows操作系統安全集專題,或 2. 使用GetDC和ReleaseDC函數   在很多情況下我們可能需要在接收到非WM_PAINT消息的時候獲取設備描述表句柄,通過調用GetDC函數我們可以獲得設備描述表句柄,因爲程序作者可能要使用設備描述表句柄完成其它工作,例如獲得設備描述表屬性,或者修改設備描述表屬性值等,在最後我們與第一種方法一樣要釋放句柄,通過調用ReleaseDC函數完成工作。  他們的函數原型爲:HDC GetDC( HWND hWnd // handle to window ); int ReleaseDC( HWND hWnd, // handle to window HDC hDC // handle to DC );  兩種方法的區別:  <1> 使用BeginPaint函數獲得的的操作區域是顯示區域中的無效矩形區域,接下來繪圖操作只能在窗口的無效區域範圍內進行,無效區域以外的區域將被忽略不能進行操作,而GetDC函數獲得的操作區域則是整個窗口的顯示區域,之後的操作可以在任何部分進行,而不只限制在無效區域。  <2> BeginPaint函數會自動把無效區域變成有效的區域,而GetDC函數則不會將任何無效區域變得有效,必須強行調用ValidateRect函數,並把第二個參數設置爲NULL來完成。  最後我們給出一個可執行程序的例子,當應用程序執行的時候會有一個對話框出現,當你拉動這個對話框的時候又會出現同樣的另一個對話框,這就證實了窗口的覆蓋會造成無效矩形的出現,系統將會發送WM_PAINT消息。  未完待續…… [url=/bbs/detail_1785342.html][img]http://image.wangchao.net.cn/it/1323423829070.gif[/img][/url] 更多內容請看Linux基礎知識 Solaris基礎知識入門 Windows操作系統安全集專題,或
󰈣󰈤
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有