Windows API一日一練(16)BeginPaint和EndPaint函數

來源:互聯網
上載者:User
 當人們使用軟體時,大多數是想看到自己所需要的結果,比如玩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是顯示的視窗大小。
fRestorefIncUpdatergbReserved是保留使用的參數。

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。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.