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

來源:互聯網
上載者:User

什麼是GDI?

  GDI是Graphics Device Interface的縮寫,含義是圖形裝置介面,它的主要任務是負責系統與繪圖程式之間的資訊交換,處理所有Windows程式的圖形輸出。

  在Windows作業系統下,絕大多數具備圖形介面的應用程式都離不開GDI,我們利用GDI所提供的眾多函數就可以方便的在螢幕、印表機及其它輸出裝置上輸出圖形,文本等操作。GDI的出現使程式員無需要關心硬體裝置及裝置驅動,就可以將應用程式的輸出轉化為硬體裝置上的輸出,實現了程式開發人員與硬體裝置的隔離,大大方便了開發工作。

GDI是如何?輸出的?

  要想在螢幕或者其它輸出裝置上輸出圖形或者文字,那麼我們就必須先獲得一個稱為裝置描述表( DC:Device Context)的對象的控制代碼,以它為參數,調用各種GDI函數實現各種文字或圖形的輸出。
裝置描述表是GDI內部儲存資料的一種資料結構,此結構中的屬性內容與特定的輸出裝置(顯示器,印表機等)相關,屬性定義了GDI函數的工作細節,在稍後我們將看到如何使用TextOut函數輸出文字,在這裡屬性確定了文字的顏色,x座標和y座標映射到視窗顯示地區的方式等。

  裝置描述表控制代碼一旦獲得,那麼系統將使用預設的屬性值填充裝置描述表結構。

  如果有必要,我們可以使用一些GDI函數擷取和改變裝置描述表中的屬性值。

什麼是有效矩形什麼是無效矩形?

  當應用程式接受到WM_PAINT訊息後通常就準備更新正個顯示地區,但是通常只需要更新一個比較小的地區而不是整個地區,這種情況通常出現在當應用程式的主視窗的一部分被一個對話方塊覆蓋,需要重畫的只是被覆蓋的矩形地區(見)。

  EXE樣本程式下載:點擊這裡下載(90K, winzip壓縮檔)

  陰影以下的部分就是需要更新的矩形地區,該地區就是我們所說的無效地區,正是因為此地區的存在,系統才會向訊息佇列中放入一個WM_PAINT訊息。

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

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

如何擷取或釋放裝置描述表控制代碼?

   當應用程式需要繪圖的時候,必須先擷取裝置描述表控制代碼,繪圖操作結束後必須釋放裝置描述表控制代碼。我們有兩種方法擷取和釋放裝置描述表控制代碼。

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函數的詳細舉例,我們將在以後的章節中看到。

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訊息。

  未完待續……

相關文章

聯繫我們

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