【GDI+編程】--匯總+實戰

來源:互聯網
上載者:User



        上篇部落格說了些題外話,為什麼偏偏在這時候討論事件和委託。對於事件和委託是.NET程式猿必須掌握的一堂課,是程式猿踏入設計而不是編寫的裡程碑,瞭解了事件的形成就能夠使用代碼編寫動態建立的事件,而學會了委託才能真正的踏入設計的階段。

       好了回到我們文章的正題,從番外篇回來要開始我們GDI+的旅程啦,今天我們對GDI+的基本架構屢屢,並利用GDI+的幾個基本的類來繪製一個圓柱形,重點在於通過執行個體來區分Graphics和GraphicsPath兩個類之間的關係。

       GDI+常用類的劃分,通過你還不能瞭解GDI+的奧秘,好戲在後頭……



       也許你要問為什麼會有Graphics和GraphicsPath兩種類的劃分,是啊為什麼呢?要從根本上區分兩者,首先要看它們的作用,Graphics是在System.Drawing命名空間下的一個類,主要用於圖形介面的顯示,另外也封裝了多種圖形的繪製方法,而且還包括了圖形的剪輯。
 
       接著來看GraphicsPath類,該類和Graphics類最大的區別是兩者分屬的命名空間不同,GraphicsPath類是System.Drawing.Drawing2D命名空間下的類,提供了一系列相互串連的直線和曲線,它在繪圖功能比Graphics類更優,而且靈活。
     



        為什麼會有兩種Brush類和SolidBrush類顏色類?因為SolidBrush是Brush類的一個子類,Brush是一個抽象類別,所以在具體的方法中使用時只能通過執行個體化SolidBrush類來實現顏色的填充。
      相同Bitmap和image也是一種父子關係,Bitmap繼承了抽象的父類image,為使用者提供了處理由像素資料定義的映像。
      Note:在編程時,我們往往把需要把繪製的映像儲存在一個Bitmap對象中,使映像保持不變。                                                                                   
 


       這裡為什麼要說地區類,它並不屬於圖形繪製類,是的它指定了一個路徑地區,使得我們可以對地區進行操作,靈活的使用該類可以在原圖中擷取我們想要的地區,另外也提供了地區的放大和縮放等功能。
      
 
      上面把常用的GDI+編程中使用的類分類匯總了下, 但有些類沒有涉及到,如 Rectangle 和 Point 等類可封裝 GDI+ 基元, Pen 類用於繪製直線和曲線。


        上面我們總結了幾種類,接下來做一個執行個體,使用GDI+繪製一個圓柱形,在實戰中深入體會幾種類的使用方法。

        繪製思路:首先使用GraphicsPath類來繪製一個閉合的圖形,然後繪製圓柱的上底和下底的橢圓。

        清單一:繪製圓柱的閉合地區,使用GraphicsPath類繪製閉合地區,並使用CloseFigure方法閉合該地區,最後使用Graphics類來填充顯示該地區。


private void DrawClosedFigure(PaintEventArgs e){    Graphics g = e.Graphics;                GraphicsPath gp = new GraphicsPath();    Point p = new Point(20, 20);    //矩形所在的正方形的起始點座標    Size s = new Size(540, 380);    //圓柱所在的正方形的大小    float flaHeight = (float)s.Width / (float)6.75;         //擷取上方橢圓的高    float flaRecHeight = (float)s.Height / (float)2.62;     //擷取上方橢圓所在矩形的高的一半    int intHeight = Convert.ToInt16(Math.Round(flaHeight, 0));    int intRecHeight = Convert.ToInt16(Math.Round(flaRecHeight, 0));    Rectangle rect = new Rectangle(p, s);                   //建立一個矩形地區,用來繪製圓柱    gp.AddArc(rect.X, rect.Y + intHeight, s.Width, intRecHeight, 180, 180); //繪製圓柱形的上半圓    gp.AddArc(rect.X, rect.Y + rect.Height, s.Width, intRecHeight, 0, 180); //繪製圓柱形的下半圓    gp.CloseFigure();   //閉合該地區                                                 g.SmoothingMode = SmoothingMode.HighQuality;    //設定邊框圓滑    g.DrawPath(new Pen(Color.FromArgb(213, 204, 186), 6), gp);     //在繪畫板上繪製該畫板地區,繪製出想要的邊界    g.FillPath(new SolidBrush(Color.FromArgb(245, 237, 229)), gp);  //填充畫板地區的內部}

      清單二:繪製圓柱形的上底和下底的橢圓,這裡繪製的上底沒有填充,並且不是閉合的橢圓,這樣看起來更形象。

                                                   

private void DrawBottom(PaintEventArgs e){    Graphics g = e.Graphics;    Point p = new Point(20, 20);    //矩形所在的正方形的起始點座標    Size s = new Size(540, 380);    //圓柱所在的正方形的大小    float flaHeight = (float)s.Width / (float)6.75;         //擷取上方橢圓的高    float flaRecHeight = (float)s.Height / (float)2.62;     //擷取上方橢圓所在矩形的高的一半    int intHeight = Convert.ToInt16(Math.Round(flaHeight, 0));    int intRecHeight = Convert.ToInt16(Math.Round(flaRecHeight, 0));    Rectangle rect = new Rectangle(p, s);                   //建立一個矩形地區,用來繪製圓柱    g.FillEllipse(new SolidBrush(Color.FromArgb(213, 204, 186)), rect.X - 2, rect.Y + rect.Height, s.Width + 3, intRecHeight);      //繪製圓柱形的底    g.DrawArc(new Pen(Color.FromArgb(213, 204, 186), 3), new Rectangle(rect.X, rect.Y + intHeight, s.Width, intRecHeight), 170, 10);    //繪製圓柱形上底出來的左邊    g.DrawArc(new Pen(Color.FromArgb(213, 204, 186), 3), new Rectangle(rect.X, rect.Y + intHeight, s.Width, intRecHeight), 0, 10);      //繪製圓柱形上底出來的右邊     }
          上面的繪製方法最重要的部分沒有說明,是關於圓柱的高和底的橢圓比的問題,這個比值相當重要,有了這個比值繪製出來的橢圓才美觀……


         上文中從GDI+的基礎出發,匯總了GDI+編程過程中常用的幾種類,通過分類能夠使我們更加清晰的分清幾種類的用法,能達到靈活的使用幾種類來建立圖形。另外還有多實踐,在實戰中深刻的體會它們之間的用法,這樣才能做到遊刃有餘。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.