Windows API-GDI入門基礎知識詳解 & 無效矩形 & GetDC 和 BeginPaint

來源:互聯網
上載者:User
網站:
http://www.pconline.com.cn/pcedu/empolder/gj/c/0506/651420.html

Windows內部為每個視窗都保留了一個繪圖結構(PAINTSTRUCT),它包含了包圍無效地區的最小矩形的座標和一些其它資訊,需要注意的是當視窗訊息處理函數在處理WM_PAINT訊息之前顯示地區中出現了另一個無效地區,那麼Windows會計算出一個包圍兩個無效地區的新無效地區,並把這種變化儲存在繪圖結構(PAINTSTRUCT)中,Windows是不會同時把多個WM_PAINT訊息同時放到訊息佇列中的。

  視窗訊息處理函數是通過調用InvalidateRect函數使視窗顯示地區內的矩形變為無效的,如果訊息佇列中已經存在一個WM_PAINT訊息,那麼Windows將計算出新的無效矩形,在接收到WM_PAINT訊息的時候,視窗訊息處理函數可以獲得無效矩形的座標,通過調用GetUpdateRect,可以在任何時候獲得這些座標。

GetDC 和 BeginPaint 擷取HDC的區別:

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
);

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來完成。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.