?? sy03.htm
字號:
<html>
<HEAD>
<TITLE>Visual C++與計算機接口</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=gb2312" >
</HEAD>
<body>
<H3><a name='01'>圖形設備接口(GDI)</a></H3>
<p>
圖形設備接口(GDI)是一個可執行程序,它接受Windows應用程序的繪圖請求(表現為GDI函數調用),并將它們傳給相應的設備驅動程序,完成特定于硬件的輸出,象打印機輸出和屏幕輸出。<BR>
GDI負責Windows的所有圖形輸出,包括屏幕上輸出像素、在打印機上輸出硬拷貝以及繪制Windows用戶界面。<BR><BR>
1、三種圖形輸出類型<BR>
應用程序可以使用GDI創建三種類型的圖形輸出:矢量輸出、位圖圖形輸出和文本輸出。<BR><BR>
<b>矢量圖形輸出</b><BR>
矢量圖形輸出指的是創建線條和填充圖形,包括點、直線、曲線、多邊形、扇形和矩形的繪制。<BR>
<b>位圖輸出</b><BR>
位圖圖形的輸出是指位圖圖形函數對以位圖形式存儲的數據進行操作,它包括各種位圖和圖標的輸出。<BR>
在屏幕上表現為對若干行和列的像素的操作,在打印機上則是若干行和列的點陣的輸出。<BR>
位圖圖形輸出的優點是速度很快,它是直接從內存到顯存的拷貝操作。缺點是需要額外的內存空間。<BR>
<b>文本輸出</b><BR>
與DOS字符方式下的輸出不同,Windows是按圖形方式輸出的。<BR>
這樣,在輸出文本時,必須以邏輯坐標為單位計算文本的輸出位置,而不是象DOS下以文本行為單位輸出文本。這比DOS下的文本輸出要難一些。<BR>
按圖形方式輸出文本給文本輸出帶來很大的靈活性。用戶可以通過調用各種GDI函數,制造出各種文本輸出效果,包括加粗、斜體、設置顏色等。<BR>
Windows還提供了一種TrueType(寫真字體)。TrueType字體用一組直線和曲線命令及一些參數來描述字體的輪廓。Windows可以通過參數來調整直線的長度和曲線的形狀,從而實現對字體的自由縮放。<BR><BR>
2、MFC中與GDI有關的類<BR>
為了支持GDI繪圖,MFC提供了兩種重要的類:<BR>
·設備上下文類,用于設置繪圖屬性和繪制圖形;<BR>
·繪圖對象類,封裝了各種GDI繪圖對象,包括畫筆、刷子、字體、位圖、調色板和區域。<BR><BR>
<b>(1)設備上下文類</b><BR>
設備上下文類包括CDC和它的派生類CClientDC、CPaintDC、CWindowDC、CMetaFileDC。<BR>
·CDC是設備上下文類的基類,除了一般的窗口顯示外,還用于基于桌面的全屏幕繪制和非屏幕顯示的打印機輸出。CDC類封裝了所有圖形輸出函數,包括矢量、位圖和文本輸出。<BR>
·CClientDC(客戶區設備上下文)用于客戶區的輸出,它在構造函數中封裝了GetDC(),在析構函數中封裝了ReleaseDC()函數。一般在響應非窗口重畫消息(如鍵盤輸入時繪制文本、鼠標繪圖)繪圖時要用到它。<BR>
CClientDC dc(this);//this一般指向本窗口或當前活動視圖<BR>
dc.TextOut(10,10,str,str.GetLength());<BR>
·CPaintDC用于響應窗口重繪消息(WM_PAINT)時的繪圖輸出。CPaintDC在構造函數中調用BeginPaint()取得設備上下文,在析構函數中調用EndPaint()釋放設備上下文。EndPaint()除了釋放設備上下文外,還負責從消息隊列中清除WM_PAINT消息。因此,在處理窗口重畫時,必須使用CPaintDC,否則WM_PAINT消息無法從消息隊列中清除,將引起不斷的窗口重畫。CPaintDC也只能用在WM_PAINT消息處理之中。<BR>
·CWindowDC用于窗口客戶區和非客戶區(包括窗口邊框、標題欄、控制按鈕等)的繪制。除非要自己繪制窗口邊框和按鈕(如一些CD播放程序等),否則一般不用它。<BR>
·CMetaFileDC專門用于圖元文件的繪制。圖元文件記錄一組GDI命令,可以通過這一組GDI命令重建圖形輸出。使用CMetaFileDC時,所有的圖形輸出命令會自動記錄到一個與CMetaFileDC相關的圖元文件中。 <BR><BR>
<b>(2)圖形對象類</b><BR>
圖形對象類包括CGdiObject、畫筆、刷子、字體、位圖、調色板、區域等。<BR>
CGdiObject是圖形對象類的基類,但該類不能直接為應用程序所使用。<BR>
要使用GDI對象,必須使用它的派生類:畫筆、刷子、字體、位圖、區域等等。<BR>
使用圖形對象要注意兩點:<BR>
a.同其他MFC對象一樣,GDI對象的創建也要分為兩步:第一步,是定義一個GDI繪圖對象類的實例;第二步調用該對象的創建方法真正創建對象。<BR>
b.創建對象:使用該對象,首先要調用CDC::SelectObject()將它選入到設備上下文中,同時保存原來的設置到一個GDI對象指針比如說pOldObject中。在使用完后,再用SelectObject(pOldObject)恢復原來的設置。<BR>
<h4>畫筆(CPen)</h4>
封裝GDI畫筆,可被選中設備上下文中當前所用的筆。<BR>
畫筆用于繪制對象的邊框以及直線和曲線。缺省畫筆畫一條與一個像素等寬的黑色實線。<BR>
要使用畫筆,首先要定義一個畫筆(CPen pen;)然后創建畫筆。<BR>
創建畫筆有兩種方法:<BR>
(1)使用CPen::CreatePen(int nPenStyle,int nWidth,DWORD crColor)進行初始化。<BR>
第一個參數是筆的風格。nPenStyle可選值有:PS_SOLID 實線、PS_DOT 虛線等。<BR>
第二個參數是線的寬度,按邏輯單位。若線寬設為0,則不管是什么映射模式下,線寬始終為一個像素。<BR>
第三個參數是線的顏色,可以選16種VGA顏色中的一種。顏色的設置用一個RGB宏(COLORREF RGB(cRed,cGreen,cBlue))來指定。<BR>
(2)創建筆的另一個方法是使用庫存對象。<BR>
SelectStockObject可從以下庫存筆中選擇一個:BLACK_PEN 黑筆N、ULL_PEN 空筆(不畫線或邊框)、WHITE_PEN 白筆等。<BR>
<h4>刷子(CBrush)</h4>
封裝GDI刷子,可用作設備上下文中當前刷子。<BR>
刷子用來填充一個封閉圖形對象(如矩形、橢圓)的內部區域。缺省的刷子將封閉圖形的內部填充成全白色。<BR>
可以用以下幾種方法創建刷子:<BR>
(1)CreateSolidBrush(DWORD crColor)創建一個實心刷子,用一種顏色填充一個內部區域。<BR>
(2)CreateHatchBrush(int nIndex,DWORD crColor);創建一個帶陰影的刷子,nIndex代表一種影線模式。<BR>
(3)用CreatePatternBrush(CBitmap* pBitmap)用一個位圖作刷子,一般采用8X8的位圖,因為刷子可以看作8X8的小位圖。<BR>
(4)同樣可以使用SelectStockObject()從庫存刷子中選取一個:BLACK_BRUSH 黑色刷子、WHITE_BRUSH 白色刷子、GRAY_BRUSH 灰色刷子等<BR>
<h4>字體(CFont)</h4>
封裝了GDI字體對象,用戶可以建立一種GDI字體,并使用CFont的成員函數來訪問它。<BR>
<h4>位圖(CBitmap)</h4>
封裝了GDI位圖,它提供成員函數裝載和操作位圖。<BR>
<h4>調色板(CPalette)</h4>
封裝GDI調色板,它保存著系統可用的色彩信息,是應用程序和彩色輸出設備上下文的接口。<BR><BR>
3、常見的繪圖任務<BR>
<h4>輸出文本</h4>
GetTextMetrics(); 返回當前使用字體的尺寸描述,用于進行字體大小計算。<BR>
SetTextColor(int nColor); 設置前景色。<BR>
SetBkColor(int nColor); 設置背景色。<BR>
TextOut:文字輸出。<BR>
TabbedTextOut:象TextOut一樣顯示正文,可以使用制表鍵Tab。<BR>
ExtTextOut:在指定的矩形中顯示正文。可以用該函數刪去超出矩形的正文,用正文背景填充矩形,調整字符間隔。<BR>
DrawText:在指定矩形種顯示正文,可以使用制表鍵Tab。在格式化矩形時調整正文左對齊、右對齊或居中;還可以在一個詞中斷開以適應矩形邊界。<BR>
<h4>畫點</h4>
SetPixel:在指定坐標處按指定色彩畫一點。
<h4>畫線</h4>
MoveToEx將直線起點移動到指定坐標處,LineTo從起點開始畫直線到終點處。使用的線型由當前所用畫筆指定。
<h4>畫弧</h4>
Arc(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4);
<h4>封閉圖形</h4>
矩形:Rectangle<BR>
圓角矩形:RoundRect<BR>
橢圓:Ellipse<BR>
餅形圖:Pie<BR>
封閉的多邊形:Polygon<BR>
<h4>其它繪圖函數</h4>
FillRect:用指定顏色填充矩形且不畫邊線。<BR>
FloodFill:用給定的顏色,利用當前所選的刷子填充顯示的底面被一個邊線所包圍的區域,如多邊形區域的填充。<BR>
ExtFloodFill:用給定的顏色,利用當前刷子填充表面被一個邊線包圍的區域,用戶可以有選擇地填充一個由指定顏色組成的區域。<BR>
InvertRect:在某一矩形區域內反顯現有顏色。<BR>
</p>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -