Windows绘图基础
句柄
在Windows編程中,會經常提到句柄這個名詞。要理解句柄,應注意以下幾點:
句柄是一個4字節的整數,Windows利用它標志應用程序創建和使用的資源,包括應用程序實例、窗口、菜單、控件、內存、外設、文件以及與圖形相關的畫筆、刷子等。
句柄是Windows內部表資源數據存儲的內存索引值,Windows利用它可訪問表中的信息。通常,在程序中,要訪問某個資源時,需要提供該資源的句柄,因此句柄可理解為是內存的索引值。
Windows平臺下,不僅可以運行多個程序,還可以對同一個程序多次加載。每加載一次,Windows會創建一個運行的備份,即實例。同時系統為每個實例分配一個唯一的句柄,該句柄稱為實例句柄。常用句柄類型及其說明如下表所示。
?
圖形設備接口GDI
圖形設備接口(GraphicsDevice Interface,簡稱為GDI),是Windows操作系統的子系統,負責在顯示設備上顯示圖形。顯而易見,GDI子系統是Windows1I常重要的組成部分。不但Windows應用程序顯示圖形時需要使用GDI,就連Windows本身也使用GDI來顯示窗口、菜單和鼠標光標等用戶界面對象。
GDI的主要目標之一是支持在各種輸出設備(如顯示器、打印機和繪圖儀等)上進行與設備無關的圖形輸出。Windows的圖形大部分是由GDI.DLL動態鏈接庫輸出的函數來處理的。GDI動態鏈接庫通過調用在不同設備驅動程序模塊中的例程來控制輸出設備。例如,顯示設備驅動程序用于訪問與視頻顯示器有關的硬件。通過GDI,Windows可以確定驅動程序能夠進行什么工作,并且由于應用程序只與GDI進行交互,所以GDI通過將應用程序與不同的輸出設備隔離,使得應用程序可以在支持Windows的任意圖形輸出設備上工作。這就實現了圖形輸出的與設備無關性。
設備描述表
設備描述表(DeviceContext,簡稱為DC),是GDI保存的數據結構。設備描述表與特定的顯示設備(如顯示器、打印機等)相關,對于顯示器,設備描述表總是與特定的窗口相關。
設備描述表中保存了顯示圖形所需使用的各種參數值,例如,顯示的顏色、顯示的坐標、顯示的方式和背景的顏色等。Windows-GDI函數實際上是在設備描述表里顯示正文及繪圖的。當程序顯示文字或繪圖時,首先必須獲得一個設備描述表句柄,完成輸出文字或繪圖后,還必須釋放該句柄,否則會大大減少Windows存儲單元。釋放之后的句柄就不會再有效了。一般說來,在處理某條消息時,獲取和釋放設備描述表句柄必須成對出現,而且不同設備描述表的獲取與釋放的方法也不同。而這只是所使用的函數不同而已。
DC設備
這個“萬能驅動”就是Windows給我們提供的一個DC。由DC去和設備驅動程序打交道,完成圖形的繪制。至于圖形的效果,就要由所使用的圖形設備來決定了。其實,DC也是一種資源,它也不是什么“萬能驅動”,但是無論是顯示,還是打印,我們都可以獲取DC的句柄,然后在DC上操作,由DC映射到這些物理設備上就行了。
獲取設備描述表句柄
當應用程序需要繪圖的時候,必須先獲得設備描述表句柄,在獲得了該句柄以后,Windows會以默認的屬性值填充內部的屬性表結構。隨后,應用程序需要調用相應的GDI函數,以指定的屬性值代替需要改變的默認值,當繪圖完畢以后,應用程序必須釋放設備描述表句柄,通常,應用程序使用下面幾種方法來獲取設備描述表句柄。
方法一:在處理WM_PAINT消息時
使用BeginPaint來獲得設備描述表句柄
hdc =BeginPaint(hWnd,&ps);
//其他GDI操作
EndPaint(hWnd,&ps);
注意:設備描述表句柄的取得和釋放必須成對使用,否則會引起嚴重問題
方法二:GetDC和ReleaseDC
雖然通常在處理WM_PAINT消息時更新窗口的用戶去,但有時也需要在處理非WM_PAINT消息時繪制用戶區部分或者全部。在處理非WM_PAINT消息時可以通過調用GetDC函數來獲取設備描述表句柄,GetDC函數的定義如下:
HDC GetDC(
HWND hWnd //所屬窗口的句柄
);
該函數僅需要一個參數,即窗口函數所屬窗口的句柄。該函數返回設備描述表句柄。當使用完畢后,應當調用ReleaseDC函數釋放該設備描述表句柄。Release函數定義如下:
Int ReleaseDC(
HWND hWnd,????? //所屬窗口句柄
HDC hDC????? //需要釋放的設備描述表句柄
);
同樣,GetDC與ReleaseDC函數必須成對使用,并且,不應當在處理一個消息時調用GetDC而在處理另一個消息時調用ReleaseDC函數。
方法三:GetWindowDC
GetDC傳回用于寫入窗口顯示區域(客戶區)的設備內容句柄,而GetWindowDC傳回寫入整個窗口設備內容句柄(而不僅限于窗口的客戶區)。例如,您的程序可以使用從GetWindowDC傳回的設備內容句柄在窗口的標題列上寫入文字。然后,程序同樣也應該處理WM_NCPAINT(非顯示區域繪制)的消息。
方法四:獲取設備描述表句柄的更常用的函數是CreateDC
Hdc =CreateDC(pszDriver,pszDevice,pszOutput,pData);
…
…
DeleteDC(hdc);
注意上面的釋放句柄函數是DeleteDC。可以通過下面的調用來取得整個屏幕的設備描述表句柄(可以做出漢王手寫板的效果):
Hdc = CreateDC(TEXT(“DISPLAY”),NULL,NULL,NULL);
?
方法五:使用位圖時,取得一個” 內存設備描述表”:
hdcMem =CreateCompatibleDC(hdc);
…
DeleteDC(hdcMem);
?
GetDC函數與BeginPaint函數的區別
GetDC函數與BeginPaint有兩點不同:
1.通過BeginPaint函數所獲得的操作區域是用戶區中的無效矩形區域,后繼的繪圖操作只能在該無效區域內進行,而該區域以外的操作將被忽略。GetDC所獲得的操作區域則是整個用戶區,其后操作可以在用戶區的任意部分進行,而不只是在無效矩形區域內。
2.BeginPaint函數會自動將無效區域變為有效,如果需要使整個用戶區變為有效,則可以調用ValidateRect函數,并將其第二個參數設為NULL。
設備描述表屬性
Windows使用設備描述表來保存控制GDI函數如何在顯示設備上工作的“當前屬性”。例如,在使用TextOut函數時,應用程序只需指定設備描述表句柄、文本顯示的起始位置坐標、需要顯示的文本及其長度,而不需要指定文本的字體、顏色、背景色、和字符間距等。Window可以從設備描述表中獲取這些信息(默認值)。
當應用程序使用GetDC或BeginPaint函數獲得一個設備描述表句柄時,Windows會自動用默認值設置其所有的屬性。應用程序可以通過相應的GDI函數調用獲取、修改所有的屬性值。
通常,在調用GetDC或BeginPaint函數以獲取設備描述表句柄時,Windows會自動用默認值填充設備描述表的各個字段,應用程序需要隨后修改其中那些希望更改的字段。但是,在應用程序調用ReleaseDC或EndPaint函數以釋放設備描述表句柄時,所作的所有更改都會丟失這就意味著,如果應用程序需要使用非默認的設備描述表屬性,則必須在每次獲取設備描述表句柄時,顯示的初始化設備描述表。通常的操作如下:
HDC hdc;
HWND hwnd;
PAINTSTRUCT ps;
case: WM_PAINT:
hdc = BeginPaint(hwnd,&ps);
//初始化設備描述表屬性
//其他GDI操作
EndPaint(hwnd, &ps);
屬性包括:
背景模式、位圖、畫刷、起始位置、剪裁域、顏色調色板、繪圖方式、字體、字符間距、映射方式、畫筆、多邊形填充方式、縮放模式、文本顏色、視圖范圍、視圖原點、窗口范圍、窗口原點等。
背景色:GetBkColor? SetBkColor
背景模式:GetBkMode? SetBkMode
位圖:CreateBitMap? CreateBitMapIndirectCreateCompatibleBitmap? SelectObject
?
顏色
???? ?R\G\B三色,每種顏色8位, 共24位.
????? 32位顏色:顏色數量24位顏色, 多出來的8位
???????? 表示灰度
????? Win32下,顏色的定義COLORREF(DWORD), RGB宏
????? 定義顏色
????? ? COLORREFnColor = RGB( 0,? 0,? 0 );
??????? COLORREF nColor = RGB( 255,255,255 );
??????? COLORREF nColor = RGB( 255,0,? 0 );
????? 從一個顏色中獲取RGB三色:
??????? int nBlue = GetBValue( nColor );
??????? int nRed? = GetRValue( nColor );
??????? int nGreen= GetGValue( nColor );
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的Windows绘图基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php require 500,thin
- 下一篇: 中断扫描方式子程序c语言,单片机原理及应