當人們使用軟體時,大多數是想看到自己所需要的結果,比如玩RPG遊戲,就是想看到自己所操作的主角做各種各樣的事情。在2D的RPG遊戲裡,其實做的事情,就是不斷地更新畫面,也就是不斷地顯示BMP的圖片。在普通的程式裡,大多也是顯示各種文本和圖片的,但是有一種類型的應用程式是不怎麼顯示結果的,那就是服務程式。不管怎麼樣,只要我們想看到程式所執行後的結果,就需要在程式裡顯示出來。也就是需要調用BeginPaint和EndPaint函數。BeginPaint函數的作用是告訴Windows系統,要開始向顯示卡輸出內容了,把這次顯示的操作請求放到系統顯示隊列裡。由於系統上的顯示卡往往只有一個,那麼這種資源是獨佔的,所以作業系統會讓顯示操作線性化,保證每個視窗的顯示是獨立進行的,而不是A視窗顯示一部份,或者B視窗顯示一部份,而是A視窗顯示完成後再讓B視窗顯示。因此,BeginPaint函數就是跟作業系統說,我需要顯示了,你安排好吧。當BeginPaint返回時,就擷取到系統的顯示資源控制代碼,這樣就可以調GDI一大堆函數來操作了。顯示完成後,一定要記得調用函數EndPaint,因為使用BeginPaint函數請求了獨佔的顯示資源後,如果不釋放回去,就會讓其它程式永遠擷取不到顯示資源了,這樣系統就死結了。如果你有空仔細地查看一下Windows來源程式,就會發現BeginPaint函數和EndPaint函數怎樣構成的。比如在調用BeginPaint函數時先把游標隱藏起來,接著再顯示使用者顯示的東西,最後調用EndPaint函數後,又把隱藏的游標顯示出來。
函數BeginPaint函數和EndPaint函式宣告如下:
WINUSERAPI
HDC
WINAPI
BeginPaint(
__in HWND hWnd,
__out LPPAINTSTRUCT lpPaint);
WINUSERAPI
BOOL
WINAPI
EndPaint(
__in HWND hWnd,
__in CONST PAINTSTRUCT *lpPaint);
hWnd是視窗控制代碼。
lpPaint是擷取顯示參數。它的結構定義如下:
typedef struct tagPAINTSTRUCT {
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[32];
} PAINTSTRUCT, *PPAINTSTRUCT;
hdc是擷取裝置控制代碼。
fErase是否擦新背景。
rcPaint是顯示的視窗大小。
fRestore、fIncUpdate、rgbReserved是保留使用的參數。
BeginPaint函數的傳回值也是顯示裝置的控制代碼。
調用這個函數的例子如下:
#001 //
#002 // 目的: 處理主視窗的訊息.
#003 //
#004 // 蔡軍生 2007/07/12 QQ:9073204
#005 //
#006 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
#007 {
#008 int wmId, wmEvent;
#009 PAINTSTRUCT ps;
#010 HDC hdc;
#011
#012 switch (message)
#013 {
#014 case WM_COMMAND:
#015 wmId = LOWORD(wParam);
#016 wmEvent = HIWORD(wParam);
#017 // 菜單選項命令響應:
#018 switch (wmId)
#019 {
#020 case IDM_ABOUT:
#021 DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
#022 break;
#023 case IDM_EXIT:
#024 DestroyWindow(hWnd);
#025 break;
#026 default:
#027 return DefWindowProc(hWnd, message, wParam, lParam);
#028 }
#029 break;
#030 case WM_PAINT:
#031 hdc = BeginPaint(hWnd, &ps);
#032 //
#033 EndPaint(hWnd, &ps);
#034 break;
#035 case WM_DESTROY:
#036 PostQuitMessage(0);
#037 break;
#038 default:
#039 return DefWindowProc(hWnd, message, wParam, lParam);
#040 }
#041 return 0;
#042 }
第31行調用函數BeginPaint。
第33行調用函數EndPaint。