1. 程式人生 > >關於裝置上下文DC和GDI的理解

關於裝置上下文DC和GDI的理解

一、裝置環境(Device Context)(裝置上下文)

    裝置上下文DC是一個Windows資料結構,它包含了某個裝置的繪製屬性。通常,繪製呼叫都是藉助於上下文物件,而這些裝置上下文物件封裝了用於畫線、形狀、文字等的Windows API。裝置上下文是裝置無關的,所以它既可以用於繪製螢幕,也可以用於繪製印表機甚至元檔案。裝置上下文在記憶體中建立,而記憶體經常受到擾動,所以它的地址是不固定的。因此,一個裝置上下文控制代碼不是直接指向裝置上下文物件,而是指向另外一個跟蹤裝置上下文地址的指標。

 我個人認為裝置上下文相當於畫圖過程中的畫布(畫紙),在VC中,這個畫布可以是顯示器,也可以使印表機,裝置上下文決定了畫布的屬性,而且封裝了在畫布上畫畫的方法,比如畫線,畫點,等等,例如: pDc->LineTo(512,0); //從左下角到右上角的一條紅色直線

 。我們在VC中畫圖時,首先要得到這塊畫布才可以畫畫,所以要進行獲取裝置環境。

     1、常見裝置上下文及區別:CClientDC,CPaintDC,CWindowDC

CClientDC:(客戶區裝置上下文)用於客戶區的輸出,與特定視窗關聯,可以讓開發者訪問目標視窗中客戶區,其建構函式中包含了GetDC,解構函式中包含了ReleaseDC。只能在客戶區繪製圖形。

CPaintDC:只能在客戶區繪製圖形。(1)CPaintDC類是CDC類的一個派生類,該類一般用在響應WM_PAINT訊息的函式OnPaint()中。(2)WM_PAINT訊息是當視窗的某個區域需要重畫時激發的視窗訊息。當程式中的訊息迴圈接到WM_PAINT訊息時就自動呼叫訊息處理函式OnPaint(),如果在OnPaint函式內定義了CPaintDC類的物件,通過這個類物件就可以使用CDC類的成員函式完成檢視客戶區中的圖形繪製操作。

(3)CPaintDC用於響應視窗重繪訊息(WM_PAINT)時的繪圖輸出。CPaintDC在建構函式中呼叫BeginPaint()取得裝置上下文,在解構函式中呼叫EndPaint()釋放裝置上下文。EndPaint()除了釋放裝置上下文外,還負責從訊息佇列中清除WM_PAINT訊息。因此,在處理視窗重畫時,必須使用CPaintDC,否則WM_PAINT訊息無法從訊息佇列中清除,將引起不斷的視窗重畫。CPaintDC也只能用在WM_PAINT訊息處理之中。

CWindowsDC:(1)可在非客戶區繪製圖形,而CClientDC,CPaintDC只能在視窗的客戶區繪製圖形。(2)座標原點是在視窗的左上角,CClientDC,CPaintDC下座標原點是在客戶區的左上角。

     下面介紹一下獲得這塊畫布的方法,即獲取裝置上下文的方法:

    1、通過OnDraw()函式獲得CPaintDC:在OnDraw()函式中入口引數CDC *pDC,傳入這即操作的裝置上下文,這個上下文既是CPaintDC。他是通過OnPaint()構建,並傳入OnDraw(),View類如果沒有過載OnPaint(),則視窗重新整理時自動呼叫MFC底層程式碼的OnPaint()函式,從而呼叫OnDraw()。我們就可以通過OnDraw()在客戶區進行初始化的繪製。

2、通過CClientDC,CPaintDC,CWindowDC定義一個DC。

例如:CClientDC dc(this);建立一個dc,在當前物件的客戶區。建立一個CWindowDC類的物件:CWindowDC dc(this);

3、通過HDC GetDC(HWND hWnd);hWnd:裝置上下文環境被檢索的視窗的控制代碼,如果該值為NULL,GetDC則檢索整個螢幕的裝置上下文環境,返回值是hdc,即一個DC描述符,入口引數是一個視窗型別的控制代碼。

例如: pWnd=GetDlgItem(IDC_STATIC_PIC); //IDC_STATIC_PIC是對話方塊圖片空間的一個標識號
      pWnd->SetWindowPos(NULL,0,0,512,120,SWP_NOZORDER|SWP_NOMOVE); //調整長寬為(512,120)
          pDc=pWnd->GetDC();

二,GDI及GDI函式

    GDI物件就是繪畫時用的工具,比如畫筆,畫刷,字型,點陣圖,調色盤。如果繪圖的時候,需要先把相應的GDI裝置選入裝置環境,就是為畫圖選個畫筆,工具。

注意MFC中,GDI和CDC是兩個獨立的類