• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 基于VC.NET的GDI+編程入門之畫刷

    發表于:2007-05-25來源:作者:點擊數: 標簽:編程VC.NETGDI+之畫基于
    基于線條的、封閉的圖形需要畫筆來表現,封閉的形狀的典型的特點在于它可以用圖形、顏色或模式來填充。 畫刷是具有顏色,圖形或模式的對象,它用來填充圖形內部,這種定義也意味著根據不同的目的有不同的畫刷。為了滿足這一目標,.NET框架在不同的名字空間中
     基于線條的、封閉的圖形需要畫筆來表現,封閉的形狀的典型的特點在于它可以用圖形、顏色或模式來填充。

      畫刷是具有顏色,圖形或模式的對象,它用來填充圖形內部,這種定義也意味著根據不同的目的有不同的畫刷。為了滿足這一目標,.NET框架在不同的名字空間中使用不同的類來支持畫刷。所有畫刷的基類是Brush類,它定義在System::Drawing名字空間中。

      一、使用畫刷

      因為畫刷的主要工作是填充封閉的圖形,Graphics類為每一中圖形都提供了一個填充方法。這些方法是:

      ·FillRectangle: 填充一個矩形或一個正方形;
      ·FillRectangle: 填充一系列的矩形;
      ·FillEllipse: 填充橢圓或圓
      ·FillPolygon: 填充多邊形
      ·FillPie: 填充餅圖
      ·FillPath:填充圖形路徑

      為了填寫一個圖形,調用上述的一個方法,給它傳遞一個刷子值,然后是圖形的位置和尺寸,例如,如果想繪制一個矩形并用一個畫刷來填充它,可以使用與下面相似的代碼:

    clearcase/" target="_blank" >cc66" width="90%" align="center" bgcolor="#dadacf" border="1">
    private: System::Void Form1_Paint(System::Object * sender,PaintEventArgs * e)
    {
    e->Graphics->FillRectangle(SomeBrush, 20, 20, 200, 160);
    }

      總共有四種畫刷。

     ?。ㄒ唬嵭漠嬎?br/>
      最簡單的畫刷就是實心的,這種畫刷只提供了一種顏色,習慣于用它來填充一個區域。為了獲得實心畫刷,可以使用System.Drawing 名字空間中的SolidBrush類。它只有一個構造函數,語法如下:

    public: SolidBrush(Color color);

      color參數必須是有效定義的顏色值,這里是一個例子:

    private: System::Void Form1_Paint(System::Object * sender,
    System::Windows::Forms::PaintEventArgs * e)
    {
    SolidBrush *brushBlue = new SolidBrush(Color::Blue);
    e->Graphics->FillRectangle(brushBlue, 20, 20, 200, 160);
    }


    圖一、代碼運行效果圖

      如果想用不同的顏色填充不同的圖形,不必為每一個圖形創建一個新的畫刷,任何時候,在對一個已經定義的畫刷進行重用之前,只需要簡單地更改顏色,正式基于這個原因,SolidBrush類提供了顏色屬性,例子代碼如下:

    private: System::Void Form1_Paint(System::Object * sender,
    System::Windows::Forms::PaintEventArgs * e)
    {
    SolidBrush *colorizer = new SolidBrush(Color::Lime);
    e->Graphics->FillRectangle(colorizer, 10, 10, 120, 120);
    colorizer->Color = Color::Salmon;
    e->Graphics->FillRectangle(colorizer, 140, 10, 120, 120);

    colorizer->Color = Color::Aqua;
    e->Graphics->FillRectangle(colorizer, 10, 140, 120, 120);

    colorizer->Color = Color::Navy;
    e->Graphics->FillRectangle(colorizer, 140, 140, 120, 120);
    }


    圖二、代碼運行效果圖

      與在圖形編程中使用的絕大部分對象一樣,畫刷消耗計算機的資源,所以,使用過它以后,需要調用 Dispose()方法來釋放它使用的資源。例子代碼如下:

    private: System::Void Form1_Paint(System::Object * sender,
    System::Windows::Forms::PaintEventArgs * e)
    {
    SolidBrush *colorizer = new SolidBrush(Color::Lime);
    e->Graphics->FillRectangle(colorizer, 10, 10, 120, 120);

    colorizer->Color = Color::Salmon;
    e->Graphics->FillRectangle(colorizer, 140, 10, 120, 120);

    colorizer->Color = Color::Aqua;
    e->Graphics->FillRectangle(colorizer, 10, 140, 120, 120);

    colorizer->Color = Color::Navy;
    e->Graphics->FillRectangle(colorizer, 140, 140, 120, 120);

    colorizer.Dispose();
    }
    ?。ǘ┚W格畫刷

      網格畫刷根據已畫或已設計的模式來設置它的填充類型。為了支持網格畫刷,.NET框架提供了畫刷可以使用的各種模式,這些預先設計的模式對應于網格畫刷的類型。這意味著在使用網格畫刷時,必須在可用的各種類型中選擇想要使用的模式,為了使填充區域更生動,還需要說明所使用的顏色。

      為了獲取一個網格畫刷,可以使用HatchBrush類,它的其中一個構造函數使用以下語法:

    public: HatchBrush(HatchStyle style, Color foreColor);

      參數foreColor是用來繪制模式的顏色,style參數是想使用的網格類型,一些可用的類型是:

    private: System::Void Form1_Paint(System::Object * sender,
    System::Windows::Forms::PaintEventArgs * e)
    {
    using namespace System::Drawing::Drawing2D;
    HatchBrush *brushBackDiag = new HatchBrush(HatchStyle::BackwardDiagonal,
    Color::FromArgb(0, 0, 255));
    HatchBrush *brushCross = new HatchBrush(HatchStyle::Cross,
    Color::FromArgb(200, 0, 0));
    HatchBrush *brushDarkDown =
    new HatchBrush(HatchStyle::DarkDownwardDiagonal, Color::Salmon);
    HatchBrush *brushDarkHorz = new HatchBrush(HatchStyle::DarkHorizontal,
    Color::Navy);
    HatchBrush *brushDarkUpDiag = new HatchBrush(HatchStyle::DarkUpwardDiagonal,
    Color::Pink);
    HatchBrush *brushVertical = new HatchBrush(HatchStyle::DarkVertical,
    Color::FromArgb(255, 0, 255));
    HatchBrush *brushDashDnDiag = new HatchBrush(
    HatchStyle::DashedDownwardDiagonal, Color::FromArgb(255, 128, 0));
    HatchBrush *brushDashHorz = new HatchBrush(HatchStyle::DashedHorizontal,
    Color::FromArgb(0, 128, 192));
    HatchBrush *brushDashUpDiag = new
    HatchBrush(HatchStyle::DashedUpwardDiagonal, Color::Green);
    HatchBrush *brushDashVert = new HatchBrush(HatchStyle::DashedVertical,
    Color::Firebrick);
    HatchBrush *brushDiagBrisk = new HatchBrush(HatchStyle::DiagonalBrick,
    Color::Fuchsia);
    HatchBrush *brushDiagCross = new HatchBrush(HatchStyle::DiagonalCross,
    Color::Moccasin);
    HatchBrush *brushDivot = new HatchBrush(HatchStyle::Divot,
    Color::Goldenrod);
    HatchBrush *brushDotDiamond = new HatchBrush(HatchStyle::DottedDiamond,
    Color::Gainsboro);
    HatchBrush *brushDottedGrid = new HatchBrush(HatchStyle::DottedGrid,
    Color::Khaki);
    HatchBrush *brushForDiag = new HatchBrush(HatchStyle::ForwardDiagonal,
    Color::Maroon);
    HatchBrush *brushHorz = new HatchBrush(HatchStyle::Horizontal,
    Color::Red);
    HatchBrush *brushHorzBrick = new HatchBrush(HatchStyle::HorizontalBrick,
    Color::SaddleBrown);
    HatchBrush *brushLgChkBoard = new HatchBrush(HatchStyle::LargeCheckerBoard,
    Color::RoyalBlue);
    HatchBrush *brushLgConfetti = new HatchBrush(HatchStyle::LargeConfetti,
    Color::MistyRose);
    HatchBrush *brushLgGrid = new HatchBrush(HatchStyle::LargeGrid,
    Color::Purple);
    HatchBrush *brushLtDnDiag = new HatchBrush(
    HatchStyle::LightDownwardDiagonal, Color::DarkCyan);
    HatchBrush *brushLtHorz = new HatchBrush(HatchStyle::LightHorizontal,
    Color::PowderBlue);
    HatchBrush *brushUpDiag = new HatchBrush(
    HatchStyle::LightUpwardDiagonal, Color::SeaGreen);
    HatchBrush *brushLtVert = new HatchBrush(HatchStyle::LightVertical,
    Color::Olive);
    e->Graphics->FillRectangle(brushBackDiag, 20, 20, 80, 60);
    e->Graphics->FillRectangle(brushCross, 120, 20, 80, 60);
    e->Graphics->FillRectangle(brushDarkDown, 220, 20, 80, 60);
    e->Graphics->FillRectangle(brushDarkHorz, 320, 20, 80, 60);
    e->Graphics->FillRectangle(brushDarkUpDiag, 420, 20, 80, 60);

    e->Graphics->FillRectangle(brushVertical, 20, 100, 80, 60);
    e->Graphics->FillRectangle(brushDashDnDiag, 120, 100, 80, 60);
    e->Graphics->FillRectangle(brushDashHorz, 220, 100, 80, 60);
    e->Graphics->FillRectangle(brushDashUpDiag, 320, 100, 80, 60);
    e->Graphics->FillRectangle(brushDashVert, 420, 100, 80, 60);

    e->Graphics->FillRectangle(brushDashVert, 20, 180, 80, 60);
    e->Graphics->FillRectangle(brushDiagBrisk, 120, 180, 80, 60);
    e->Graphics->FillRectangle(brushDiagCross, 220, 180, 80, 60);
    e->Graphics->FillRectangle(brushDivot, 320, 180, 80, 60);
    e->Graphics->FillRectangle(brushDotDiamond, 420, 180, 80, 60);

    e->Graphics->FillRectangle(brushDottedGrid, 20, 260, 80, 60);
    e->Graphics->FillRectangle(brushForDiag, 120, 260, 80, 60);
    e->Graphics->FillRectangle(brushHorz, 220, 260, 80, 60);
    e->Graphics->FillRectangle(brushHorzBrick, 320, 260, 80, 60);
    e->Graphics->FillRectangle(brushLgChkBoard, 420, 260, 80, 60);

    e->Graphics->FillRectangle(brushLgGrid, 20, 340, 80, 60);
    e->Graphics->FillRectangle(brushLtDnDiag, 120, 340, 80, 60);
    e->Graphics->FillRectangle(brushLtHorz, 220, 340, 80, 60);
    e->Graphics->FillRectangle(brushUpDiag, 320, 340, 80, 60);
    e->Graphics->FillRectangle(brushLtVert, 420, 340, 80, 60);
    }


    圖三、各種網絡格畫刷效果圖

      如果使用上面的構造函數來填充一個圖形,選擇的模式將繪制在黑色背景上,如果想使用不同的背景,使用下面的構造函數來初始化畫刷。

    public: HatchBrush(HatchStyle hatchstyle, Color foreColor, Color backColor);

      參數backColor是將用于背景的顏色。

      任何時候,為了得到繪制模式的顏色,可以操作畫刷的ForegroundColor屬性;為了了解背景顏色,可以操作畫刷的BackgroundColor屬性;為了知道當前畫刷的類型,可以操作它的HatchStyle類型。
    ?。ㄈ┘y理畫刷

      網格畫刷依賴于已經預先設計的模式來填充圖形,在某些情況下,需要設計自己的圖案來填充一個圖形。要這么做,必須執行兩個步驟,首先設計一個圖形并存儲為一個文件,然后創建一個紋理畫刷,并將圖案傳遞給它。

      紋理畫刷擁有圖案,并且通常使用它來填充封閉的圖形。為了對它初始化,可以使用一個已經存在的別人設計好了的圖案,或使用常用的設計程序設計的自己的圖案,同時應該使圖案存儲為常用圖形文件格式,如BMP格式。這里有一個設計好的位圖,被存儲為Papers.bmp文件。


    圖四、位圖效果圖

      有了圖案,這時候就可以使用TextureBrush類,它有多種構造函數,最簡單的構造函數只有一個Image對象做為參數,這個構造函數的語法是:

    public: TextureBrush(Image *bitmap);

      這個構造函數使用位圖作為參數。初始化畫刷后,你可以使用它來填充封閉的圖形。例如你可以調用Fill...方法。下面是例子:

    private: System::Void Form1_Paint(System::Object * sender,
    System::Windows::Forms::PaintEventArgs * e)
    {
    Bitmap *bmpPapers = new Bitmap(S"Papers.bmp");
    TextureBrush *brushPapers = new TextureBrush(bmpPapers);
    e->Graphics->FillRectangle(brushPapers, 5, 5, 430, 280);
    }


    圖五、代碼運行效果圖

      如果使用這個構造函數,編譯器自身將對圖案的尺寸和位置進行定位,盡管位置必須在(0,0)處,但長和寬必須小于或等于設計的圖形尺寸,例如,有一個圖案是48x48像素,你使用的圖形的寬度和高度必須小于等于48,這樣就允許只使用圖形的一部分,為此需要使用下面的構造函數:

    public: TextureBrush(Image *bitmap, Rectangle destination);

      這個函數的第二個參數規定了圖案的尺寸,如果愿意使用十進制的矩形參數,可以使用如下構造函數:

    public: TextureBrush(Image *bitmap, RectangleF destination);

      這有一個例子:

    private: System::Void Form1_Paint(System::Object * sender,
    System::Windows::Forms::PaintEventArgs * e)
    {
    Bitmap *bmpPapers = new Bitmap(S"Papers.bmp");
    TextureBrush *brushPapers = new TextureBrush(bmpPapers,
    new Rectangle(0, 0, 40, 42));
    e->Graphics->FillRectangle(brushPapers, 5, 5, 438, 290);
    }


    圖六、代碼運行效果圖

      目前為止我們使用的構造函數都是以平鋪的方式在每個定位的矩形內繪制圖案。為了更有趣,TextureBrush類提供了一個參數用來指定覆蓋模式,可以使用下面的構造函數,

    public: TextureBrush(Image *bitmap, WrapMode wrapMode);
    public: TextureBrush(Image *bitmap, WrapMode wrapMode, Rectangle destination);
    public: TextureBrush(Image *bitmap, WrapMode wrapMode, RectangleF destination);

      位圖和尺寸參數與上述含義一樣,wrapMode參數是枚舉WrapMode的一個成員,枚舉WrapMode定義在System::Drawing::Drawing2D名字空間中。

      它有下面的成員:

      ·Clamp:在分配的矩形內只繪制一個圖案。

    private: System::Void Form1_Paint(System::Object * sender,
    System::Windows::Forms::PaintEventArgs * e)
    {
    Bitmap *bmpPapers = new Bitmap(S"Papers.bmp");
    TextureBrush *brushPapers = new TextureBrush(bmpPapers, WrapMode::Clamp);
    e->Graphics->FillRectangle(brushPapers, 5, 5, 438, 290);
    }


    圖七、Clamp方式效果圖

      ·Tile:以平鋪方式繪圖

    private: System::Void Form1_Paint(System::Object * sender,
    System::Windows::Forms::PaintEventArgs * e)
    {
    Bitmap *bmpPapers = new Bitmap(S"Papers.bmp");
    TextureBrush *brushPapers = new TextureBrush(bmpPapers,
    WrapMode::Tile, Rectangle(0, 0, 40, 42));
    e->Graphics->FillRectangle(brushPapers, 5, 5, 438, 290);
    }


    圖八、Tile方式效果圖

      ·TileFlipX:水平方向交差對稱方式

    private: System::Void Form1_Paint(System::Object * sender,
    System::Windows::Forms::PaintEventArgs * e)
    {
    Bitmap *bmpPapers = new Bitmap(S"Papers.bmp");
    TextureBrush *brushPapers = new TextureBrush(bmpPapers, WrapMode::TileFlipX);
    e->Graphics->FillRectangle(brushPapers, 5, 5, 430, 290);
    }


    圖九、TileFlipX方式效果圖

      ·TileFlipXY:水平豎直方向均交叉對稱

    private: System::Void Form1_Paint(System::Object * sender,
    System::Windows::Forms::PaintEventArgs * e)
    {
    Bitmap *bmpPapers = new Bitmap(S"Papers.bmp");
    TextureBrush *brushPapers = new TextureBrush(bmpPapers,
    WrapMode.TileFlipXY, Rectangle(0, 0, 42, 42));
    e->Graphics->FillRectangle(brushPapers, 5, 5, 412, 244);
    }


    圖十、TileFlipXY方式效果圖
    ?。ㄋ模u變畫刷

      漸變畫刷類似與實心畫刷,因為它也是基于顏色的,與實心畫刷不同的是,漸變畫刷使用兩種顏色,它的主要特點是,在使用過程中,一種顏色在一端,而另外一種顏色在另一端。在中間,兩種顏色融合產生過渡或衰減的效果。

      漸變畫刷有兩種:線性畫刷和路徑畫刷

      1、線性漸變畫刷
     
      線性漸變畫刷在封閉的區域內的兩端使用兩種顏色,如左端和右端。

      為了支持線性漸變畫刷,.NET框架在名字空間System::Drawing::Drawing2D 中對LinearGradientBrush類進行了定義,為了規定填充圖形的起點和終點,可以使用下面的構造函數:

    public: LinearGradientBrush(Point point1, Point point2, Color color1, Color color2);
    public: LinearGradientBrush(PointF point1, PointF point2, Color color1, Color color2);

      第一個參數point1是繪制的起點,第三個參數color1是對應該點的顏色,第二個參數point2對應著繪制的終點,color2是該點的顏色。例子代碼如下:

    private: System::Void Form1_Paint(System::Object * sender,
    System::Windows::Forms::PaintEventArgs * e)
    {
    using namespace System::Drawing::Drawing2D;
    LinearGradientBrush *lgb = new LinearGradientBrush(Point(20, 20),
    Point(450,20), Color::DarkGreen, Color::LightBlue);
    e->Graphics->FillRectangle(lgb, 20, 20, 430, 180);
    }


    圖十一、線性漸變畫刷效果

      默認情況下,漸變畫刷按照水平漸變的方式填充圖形,如果想讓顏色按照不同的方向漸變,如垂直或對角線方向,可以使用下面的構造函數:

    public: LinearGradientBrush(Rectangle rect, Color color1, Color color2,
    LinearGradientMode factor);
    public: LinearGradientBrush(RectangleF rect, Color color1, Color color2,
    LinearGradientMode factor);

      第一個參數rect是所要填充顏色的矩形,第二個參數是起點的顏色,第三個參數是終點的顏色,第四個參數factor用來決定顏色融合的方向。它可以取以下值:

      Vertical:垂直方向漸變:

    private: System::Void Form1_Paint(System::Object * sender,
    System::Windows::Forms::PaintEventArgs * e)
    {
    using namespace System::Drawing::Drawing2D;
    Rectangle rect(10, 10, 470, 300);
    LinearGradientBrush *lgb = new LinearGradientBrush(rect,
    Color::DarkRed,Color::White, LinearGradientMode::Vertical);
    e->Graphics->FillRectangle(lgb, 10, 10, 450, 280);
    }


    圖十二、代碼運行效果圖

      Horizontal:水平漸變; BackwardDiagonal:反向對角線漸變; ForwardDiagonal:正向對角線漸變。

      用來指定漸變方向的構造函數有局限性,它只有四個選項,如果需要,可以使用下面的構造函數來指定任意角度的漸變。

    public: LinearGradientBrush(Rectangle rect, Color color1, Color color2, float angle);
    public: LinearGradientBrush(RectangleF rect, Color color1, Color color2, float angle);

      第一個參數rect指的是所要畫顏色的區域,最后一個參數angle(按順時針方向計算),定義了顏色融合的方向。參數color1是開始點的顏色,參數color2是終點的顏色。這里有個例子:

    private: System::Void Form1_Paint(System::Object * sender,
    System::Windows::Forms::PaintEventArgs * e)
    {
    using namespace System::Drawing::Drawing2D;
    Rectangle rect(10, 10, 470, 300);
    LinearGradientBrush *lgb = new LinearGradientBrush(rect,
    Color::DarkRed, Color::White, -65.24F);
    e->Graphics->FillRectangle(lgb, 10, 10, 450, 280);
    }


    圖十三、代碼運行效果圖

      2、路徑漸變畫刷

      第二種可用的漸變畫刷就是路徑漸變畫刷,這種畫刷用在路徑上,來產生漸變效果。.NET 框架在System.Drawing.Drawing2D名字空間中提供了 PathGradientBrush,這個類比有兩個構造函數:

    public: PathGradientBrush(Point points[]);
    public: PathGradientBrush(PointF points[]);

      傳遞給這個構造函數的參數是Point類型的數組,這里有一個例子:

    private: System::Void Form1_Paint(System::Object * sender,
    System::Windows::Forms::PaintEventArgs * e)
    {
    using namespace System::Drawing::Drawing2D;
    Point ptGraph[] = { Point(10, 10),
    Point(450, 10),
    Point(450, 250),
    Point(10, 250) };
    PathGradientBrush *pgb = new PathGradientBrush(ptGraph);
    e->Graphics->FillRectangle(pgb, 10, 10, 450, 280);
    }


    圖十四、代碼運行效果圖

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>