[翻譯]-WinCE 程序設計 (3rd 版)--2.1 繪圖基礎

繪圖基礎
綜觀歷史,Windows被細分成三個主要部分:核心層,處理進程和管理內存;用戶層,處理窗口接口和控件;圖形設備接口(GDI)負責底層繪製。在Windows CE裏,用戶層和GDI層合成爲圖形窗口及事件處理器,即GWE。你可能有時會聽Windows CE程序員談起GWE。GWE並不是什麼新事務,只是標準Windows部件的不同包裝而已。在本書裏,我通常將GWE的圖形部分依然稱爲GDI,以保持和標準Windows編程術語的一致性。

不論你是爲Windows CE、2000、還是XP編寫程序,需要做的不僅僅是處理WM_PAINT消息這麼簡單。理解什麼時候和爲什麼WM_PAINT消息要被送到窗口是很有益處的。

有效和無效區域
某些情況下,窗口的一部分暴露給用戶,這些部分在Windows裏稱爲區域,這些區域被標記爲無效。當應用程序消息隊列裏沒有其它消息在等待處理並且應用程序窗口包含有無效區域的時候,Windows會給窗口發送WM_PAINT消息。正如第一章裏提到的,處理WM_PAINT消息的繪製操作是包含在BeginPaint和EndPaint調用之間的。BeginPaint實際上執行很多動作。首先將無效區域標記爲有效,接下來計算需要裁減的區域。裁減區是限制繪圖動作的區域。BeginPaint接下來發送WM_ERASEBACKGROUND消息,如果需要,還會重繪背景,如果用於指示文本輸入的光標可見,它還會隱藏光標。最後BeginPaint獲得顯示設備環境變量的句柄,該句柄可以用於應用程序中。EndPaint函數則釋放設備環境,如果必要,還會重新顯示光標。如果WM_PAINT處理過程沒有更多的操作要執行,您也必須至少調用BeginPaint 和EndPaint ,以便將無效區域標記爲有效。

作爲替代,您可以調用ValidateRect來強制使矩形有效。但這種情況下沒有繪製動作發生,因爲應用程序在窗口上繪製任何東西之前,必須有設備環境句柄。

應用程序經常需要強制重畫它的窗口。應用程序決不應該郵遞或發送(post or send)WM_PAINT消息給自身或其它窗口。您應該使用以下函數:

BOOL InvalidateRect (HWND hWnd, const RECT *lpRect, BOOL bErase);
請注意InvalidateRect並不要求窗口設備環境句柄,只要窗口句柄自身。lpRect表示窗口中需要無效的區域。該參數爲NULL則表示整個窗口無效。bErase用來指出在調用BeginPaint的時候是否重畫窗口背景。請注意不像Windows的其它版本,Windows CE要求hWnd必須是一個有效的窗口句柄。

設備環境
設備環境經常被簡稱爲DC,它被Windows用於管理對顯示器和打印機的訪問,當然在本章我將只討論顯示器。除非特別說明,下面的討論適合所有Windows,而並不具體針對Windows CE。

Windows應用程序從不直接寫屏幕。相反,它們爲適當的窗口請求一個顯示設備環境句柄,之後用該句柄在設備環境裏繪製。接下來Windows作爲中間人將像素從DC操縱到屏幕上。

只應該在WM_PAINT消息裏調用BeginPaint,它爲窗口返回一個顯示DC句柄。通常應用程序在處理WM_PAINT消息時在屏幕上繪製東西。Windows將繪製作爲一個低優先級的任務,這樣做是適當的,因爲將繪製作爲高優先級會導致爲每個小的顯示改變都產生一個繪圖消息,這將使繪圖消息氾濫。而通過處理所有正在等待的消息,允許應用程序先完成所有未完成的事務,這樣使所有無效區域能夠被有效的一次性繪製完成。用戶並不會注意到由WM_PAINT消息低優先級所帶來的微小延遲。

當然,有些時候是需要立即繪製的。字處理器就是一個例子,當鍵盤被按下後,字處理器需要立即顯示對應的字符。爲了在WM_PAINT消息以外的時刻進行繪製,可以用GetDC函數來獲得DC句柄。GetDC原型如下:HDC GetDC (HWND hWnd);
GetDC返回窗口客戶區DC句柄。接下來可以在窗口客戶區的任何地方進行繪製,因爲這個過程不像WM_PAINT消息的處理過程,沒有裁減區域來限制您只能在一個無效區域裏繪製。

Windows CE支持另一個獲得DC的函數,該函數如下:
HDC GetDCEx (HWND hWnd, HRGN hrgnClip, DWORD flags);
GetDCEx允許您對返回的設備環境有更多的控制。新參數hrgnClip使您可以定義用來限制繪製區域的裁減區域。flags指出當您在DC上繪製的時候,DC如何反應。注意Windows CE不支持下面的標誌:DCX_PARENTCLIP, DCX_NORESETATTRS, DCX_LOCKWINDOWUPDATE, 和DCX_VALIDATE。

當繪製完成後,必須調用ReleaseDC來釋放設備環境。ReleaseDC原型如下:

int ReleaseDC (HWND hWnd, HDC hDC);

GetDC用於在客戶區內繪製,有時應用程序需要訪問窗口非客戶區,比如標題欄。爲了獲得整個窗口的DC,使用以下函數:HDC GetWindowDC (HWND hWnd);

如前所述,當繪製完成後,要調用ReleaseDC。

Windows CE下的DC函數同XP下的設備環境函數是一樣的。這是可以預料到的,因爲DC是Windows 繪圖體系裏的核心。對這個領域的API進行改變將導致Windows CE程序與它的桌面程序嚴重的不兼容。

發佈了2 篇原創文章 · 獲贊 1 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章