C++/GDI+ 學習筆記(三)——基礎

GDI+ 的主要畫刷

SolidBrush 單色畫刷
 
SolidBrush(const Color& color );
 


HatchBrush 網格畫刷
 
HatchBrush(
  HatchStyle hatchStyle,
  const Color& foreColor,
  const Color& backColor);
 foreColor和backColor用來指定陰影線顏色和填充的背景顏色,背景色可以不指定。hatchStyle用來指定陰影線的樣式。
 
預定義樣式:
HatchStyleHorizontal (水平線)
HatchStyleVertical(垂直線)
HatchStyleForwardDiagonal(上斜線)
HatchStyleBackwardDiagonal(下斜線)
HatchStyleCross(十字線)
HatchStyleDiagonalCross (交叉線)
HatchStyle30Percent(30%填充)
HatchStyleSolidDiamond (實心菱形)
 

 

LinearGradientBrush 直線漸變
 
LinearGradientBrush(
  Point & point1,
  Point & point2,
  Color & color1,
  Color & color2);

LinearGradientBrush(
  Rect & rect,
  Color & color1,
  Color & color2,
  REAL angle,
  BOOL isAngleScalable );

LinearGradientBrush(
  Rect & rect,
  Color & color1,
  Color & color2,
  LinearGradientMode mode);
 point1和point2分別用來指定矩形區域的左上角和右下角點座標。

color1和color2分別用來指定 漸變起始和終止的顏色。

rect用來指定一個矩形區域的大小和位置,angle用來指定漸變的方向角度,正值爲順時針。

isAngleScalable是一個即將廢除的參數。mode用來指定漸變的方法。
 
預定義樣式:
LinearGradientModeHorizontal (水平方向)
LinearGradientModeVertical (垂直方向)
LinearGradientModeForwardDiagonal (從左下到右上的對角線方向)
LinearGradientModeBackwardDiagonal (從左上到右下的對角線方向)
 

 

PathGradientBrush 路徑漸變
 
PathGradientBrush(
  const GraphicsPath* path);

PathGradientBrush(
  const  Point * points,
  INT count,
  WrapMode wrapMode);
 path用來指定一個路徑指針,points和count分別用來指定組成路徑的一系列直線端點的數組及其大小, wrapMode是一個可選項,用來指定填充的包圍模式。一個包圍模式用來決定是否在區域內部、在區域外部以及所有區域都填充。默認時,其值爲 WrapModeClamp,即在區域內部填充。
 

 

TextureBrush 圖像畫刷
 
TextureBrush(Image*, WrapMode);
 

 

矩陣

圖形變換一般是對圖形的幾何信息經過幾何變換後產生新的圖形。常見二維圖形的變換有平移、比例、對稱、旋轉、錯切 等。圖形幾何變換最有效的手段是採用矩陣變換,GDI+就有這樣的矩陣類Matrix,它爲我們提供了許多變換的方法,如Invert(轉置)、 Multiply(矩陣相乘)、Rotate(旋轉)等。

需要說明的是,除了使用Matrix進行圖形變換外,Graphics本身提供相應的變換方法,如RotateTransform(旋轉變換)、ScaleTransform(比例變換)和TranslateTransform(平移變換)等。

基本繪圖函數


繪圖函數 功能描述
 
DrawArc 繪製一條圓弧曲線,範圍由起止角大小決定,大小由矩形或長寬值指定
 
DrawBezier 繪製一條由一系列型值頂點決定的三次Bezier曲線
 
DrawBeziers 繪製一系列的三次Bezier曲線
 
DrawClosedCurve 繪製一條封閉的樣條曲線
 
DrawCurve 繪製一條樣條曲線
 
DrawEllipse 繪製一條橢圓輪廓線,大小由矩形或長寬值指定
 
DrawLine 繪製一條直線
 
DrawPath 繪製由GraphicsPath定義的路徑輪廓線
 
DrawPie 繪製一條扇形(餅形)輪廓線
 
DrawPolygon 繪製一個多邊形的輪廓線
 
DrawRectangle 繪製一個矩形
 
FillEllipse 填充一個橢圓區域
 
FillPath 填充一個由路徑指定的區域
 
FillPie 填充一個扇形(餅形)區域
 
FillPolygon 填充一個多邊形區域
 
FillRectangle 填充一個矩形區域
 
FillRectangles 用同一個畫刷填充一系列矩形區域
 
FillRegion 填充一個區域(Region)的內部
 

 

文字


Font( FontFamily* ,  REAL ,  INT ,  Unit )            字體的主要構造函數

FontFamily fontFamily(L"幼圓");      //定義字型
Font font(&fontFamily, 12, FontStyleRegular, UnitPoint);   //定義字體
 

FontFamily * : 指向用來定義字型的類的指針。

REAL : 字號,這裏的字號可以使用小數定義。而且字號的單位也是由第4個參數指定的。

INT : 字體風格,FontStyleRegular(正常)、FontStyleBold(加粗)、 FontStyleItalic(斜體)、FontStyleBoldItalic (粗斜體)、FontStyleUnderline(下劃線) 和FontStyleStrikeout(刪除線)。

Unit : GDI+爲用戶提供了UnitDisplay(1/75英寸)、UnitPixel(像素)、UnitPoint(點)、UnitInch(英寸)、UnitDocument(1/300英寸)、UnitMillimeter(毫米)等字體尺寸單位。

 

爲了兼容GDI 字體還有其他的幾個構造函數

Font( HDC hdc, const LOGFONTW* logfont) 是其中比較常用的構造函數之一,可以看出是完全與GDI兼容的。

GDI+只有一個輸出文本的函數DrawString,原型如下

DrawString( const WCHAR* string, INT length, const Font* font,
const RectF& layoutRect, const StringFormat* stringFormat,
const Brush* brush );

DrawString( const WCHAR* string, INT length, const Font* font,
const PointF& origin, const Brush* brush );

DrawString( const WCHAR* string, INT length, const Font* font,
const PointF& origin, const StringFormat* stringFormat,
const Brush* brush);
 

其中,string用來指定要輸出的字符串,length表示該字符串的長度,font用來指定字體, layoutRect用來指定一個字符串所輸出的矩形區域,stringFormat用來指定文本輸出格式化屬性,origin用來指定字符串輸出的起 點。需要注意的是,PointF和RectF類與Point和Rect類基本相同,所不同的是數據類型是浮點而後者是INT型。brush用來指定一個畫 刷,這個畫刷既可以是SolidBrush和HatchBrush,也可以是TextureBrush(紋理畫刷),甚至是漸變畫刷。

在GDI+中,我們還可以通過SetTextRenderingHint來控制文本輸出的質量。

文本的格式屬性通常包括對齊方式、字符間隔以及文本調整等。GDI+提供StringFormat類來控制這些格式屬性,通常我們調用以下幾個函數來進行相關屬性設置。

Status SetAlignment ( StringAlignment align );
Status SetLineAlignment ( StringAlignment align );

上面的兩個函數是用來定義文本對齊方式的,align可以是StringAlignmentNear(左對齊或右對齊,取決於書寫方向是從左到右還是從右到左)、StringAlignmentCenter(居中)或StringAlignmentFar(兩端對齊)。

Status SetFormatFlags( INT flags );

該函數用來設置文本格式化標誌,flags可以是

StringFormatFlagsDirectionRightToLeft (水平閱讀方向是從右向左) 和

StringFormatFlagsDirectionVertical(垂直文本)等值。

 圖像


GDI+的Image類封裝了對BMP、GIF、JPEG、PNG、TIFF、WMF(Windows元文件)和 EMF(增強WMF)圖像文件的調入、格式轉換以及簡單處理的功能。而Bitmap是從Image類繼承的一個圖像類,它封裝了Windows位圖操作的常用功能。例如,Bitmap::SetPixel和Bitmap::GetPixel分別用來對位圖進行讀寫像素操作,從而可以爲圖像的柔化和銳化處理提供一種可能。

Metafile類別通過提供記錄和檢驗矢量圖像的其它方法,增強Image類別的功能。

DrawImage是GDI+的Graphics類顯示圖像的核心方法,它的重載函數有許多個。常用的一般重載函數有:

Status DrawImage( Image* image, INT x, INT y);
Status DrawImage( Image* image, const Rect& rect);
Status DrawImage( Image* image, const Point* destPoints, INT count);
Status DrawImage( Image* image, INT x, INT y, INT srcx, INT srcy,
INT srcwidth, INT srcheight, Unit srcUnit);
 

其中,(x,y)用來指定圖像image顯示的位置,這個位置和image圖像的左上角點相對應。rect用來指定被圖像填充的矩形區域, destPoints和count分別用來指定一個多邊形的頂點和頂點個數。若count爲3時,則表示該多邊形是一個平行四邊形,另一個頂點由系統自動給出。此時,destPoints中的數據依次對應於源圖像的左上角、右上角和左下角的頂點座標。srcx、srcy、srcwidth 和srcheight用來指定要顯示的源圖像的位置和大小,srcUnit用來指定所使用的單位,默認時使用PageUnitPixel,即用像素作爲度量單位。

需要注意的是,在不指定範圍的情況下,DrawImage會拉伸圖像鋪滿整個設備。

Image還提供GetThumbnailImage的方法用來獲得一個縮略圖的指針,調用DrawImage後可將該縮略圖顯示,這在圖像預覽時極其有用。

Status DrawImage( Image* image, const Point* destPoints, INT count);
裏面的destPoints和count用來指定一個數組和數組的大小。這個重載可以用來旋轉圖像。destPoints中的第一個點是用來定義座標原點的,第二點用來定義X軸的方法和圖像X方向的大小,第三個是用來定義Y軸的方法和圖像Y方向的大小。若destPoints定義的新座標系中兩軸方向不垂直,就能達到圖像拉伸的效果。當然,對於圖像旋轉還可直接使用Graphics::RotateTransform來進行,例如下面的代碼。但這樣設置後,以後所有的繪圖結果均會旋轉,有時可能感覺不方便。

當圖像進行縮放時,需要對圖像像素進行插補,不同的插補算法其效果是不一樣的。Graphics:: SetInterpolationMode可以讓我們根據自己的需要使用不同質量效果的插補算法。當然,質量越高,其渲染時間越長。

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/eplanet/archive/2007/10/10/1817952.aspx

發佈了49 篇原創文章 · 獲贊 8 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章