關於裝置上下文DC和GDI的理解
一、裝置環境(Device Context)(裝置上下文)
裝置上下文DC是一個Windows資料結構,它包含了某個裝置的繪製屬性。通常,繪製呼叫都是藉助於上下文物件,而這些裝置上下文物件封裝了用於畫線、形狀、文字等的Windows API。裝置上下文是裝置無關的,所以它既可以用於繪製螢幕,也可以用於繪製印表機甚至元檔案。裝置上下文在記憶體中建立,而記憶體經常受到擾動,所以它的地址是不固定的。因此,一個裝置上下文控制代碼不是直接指向裝置上下文物件,而是指向另外一個跟蹤裝置上下文地址的指標。
我個人認為裝置上下文相當於畫圖過程中的畫布(畫紙),在VC中,這個畫布可以是顯示器,也可以使印表機,裝置上下文決定了畫布的屬性,而且封裝了在畫布上畫畫的方法,比如畫線,畫點,等等,例如: pDc->LineTo(512,0);
//從左下角到右上角的一條紅色直線
1、常見裝置上下文及區別:CClientDC,CPaintDC,CWindowDC
CClientDC:(客戶區裝置上下文)用於客戶區的輸出,與特定視窗關聯,可以讓開發者訪問目標視窗中客戶區,其建構函式中包含了GetDC,解構函式中包含了ReleaseDC。只能在客戶區繪製圖形。
CPaintDC:只能在客戶區繪製圖形。(1)CPaintDC類是CDC類的一個派生類,該類一般用在響應WM_PAINT訊息的函式OnPaint()中。(2)WM_PAINT訊息是當視窗的某個區域需要重畫時激發的視窗訊息。當程式中的訊息迴圈接到WM_PAINT訊息時就自動呼叫訊息處理函式OnPaint(),如果在OnPaint函式內定義了CPaintDC類的物件,通過這個類物件就可以使用CDC類的成員函式完成檢視客戶區中的圖形繪製操作。
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是兩個獨立的類