C# GDI+程式設計(一)

高洛峰
發布: 2016-12-17 10:20:02
原創
1109 人瀏覽過

雖然是C++的,但總是有一些相通的地方。

視窗刷新的時候,會產生Paint事件,那麼我們就為這個事件增加一個處理函數。然後在這個函數裡畫圖。就能保證所畫的圖不會被刷新掉,

它可以總是顯示。 Paint事件對應的委託是:public delegate void PaintEventHandler(object sender, PaintEventArgs e);

先來個最簡單的繪製,在窗口上畫一條線。 (建立WindowsForms應用程式)

   public partial class Form1 : Form
    {
          InitializeComponent();

          //增加Paint事件處理函數

       

        private void formPaint(Object sender, PaintEventArgs e)
        {
            2像素寬
            Pen pen=new Pen(Color.FromArgb(0,255,0),2);
       畫一條線,兩點是0,0和100,100
            graphics.DrawLine(pen,new Point(0,0),new Point(
像繪製直線,長方形,圓形,還有圖片,都可以透過Graphics類別來完成。

範例2:一個填滿矩形

 Graphics graphics = e.Graphics;
 //藍色畫刷

 SolidBrush brush = new SolidB5(For.F1Argb(0,55 rect = new Rectangle(0, 0, 100, 100);

 //填滿一個矩形

 graphics.FillRectangle(brush, rect);

範例3:畫一張NGpng範例3:畫一張圖片可以顯示用照片,GIF圖片也有這個功能)


        private void formPaint(Object sender, PaintEventArgs e)
    e.Graphics;
            //載入圖片
            \Image img=mage.FromFile( png");
            //圖片顯示起始位置
            Point strPoint=new Point(50,50,500150

            graphics.DrawImage(img, strPoint);

            //縮小圖繪製,以限制於一個長方形內

            Rectangle rect=new Rectangle(50,50,100,100);

        }

用DrawString顯示文字

DrawString在Grahpics類別裡有好幾個重載,有的可以讓字串在一個矩形內顯示,有的可以使用特定的顯示格式。這裡就不做詳細介紹了。

只講比較常用的。

看例子吧,處理鍵盤輸入字元事件,在視窗顯示輸入的字元。如下:

    public partial class Form1 : Form
    {
        public static String      {
            InitializeComponent();
          Press += formKeyPress;
          
        }
private void formPaint(Object sender, PaintEventArgs e)
        {
          //創建畫刷
            SolidBrush brush=new SolidBrush(Color.FromArgb(0,255,0));    Font font=new Font("宋體",20f);
            //顯示字串,且在一個長方形內
               
        }
        private void formKeyPress(object sender, KeyPressEventArgs e)
        {
             strText +=          this.Invalidate();
        }
    }

還有graphics.DrawString(strText, font, brush

也有graphics.DrawString(strText, font, brush,
還有graphics.DrawString(strText, font, brush,,1001Point( ));顯示方式,這個只是指定了文字顯示的起始位置。

關於顯示格式看下例:

 //顯示字串,在一個矩形內

 StringFormat strFormat = new StringFormat(StringFormatFlags.DirectionRightToLeft);new StringFormat(StringFormatFlags.DirectionRightToLeft);🠎,Clrush錶graphics.Draw.Form ;

StringFormatFlags是一個枚舉類型,自己一個一個試吧,看看每個枚舉成員表示什麼樣的格式。

接下來,我們來看看。 Form類別中預設處理事件的方法,和你的新增的事件處理方法,這兩者有什麼關係。


一個範例:處理滑鼠左鍵事件

   public partial class Form1 : Form
    {
        private Color prBackColor; {
            InitializeComponent();
            
            //增加事件處理
            this. MouseDown += formMouseDown;
            this.MouseUp += formMouseUp;
        private void formMouseDown(object sender, MouseEventArgs e)
        {
      if ( e.Button == MouseButtons.Right)
            {
                    //改變背景顏色
                form1.BackColor = Color.
        }
        //滑鼠鍵彈起(鬆開)事件處理方法
        private void formMouseUp(object sender, MouseEventArgs e)
  useButtons.Right)
            {
            Form1 )1 = prBackColor;
            }

        }

}

像滑鼠鍵鍵為鍵定型滑鼠

protected virtual void OnMouseDown(MouseEventArgs e);和protected virtual void OnMouseUp(MouseEventArgs e);

處理方法就可以加上事件處理方法,也不必透過滑鼠事件處理了來實現上面的例子。

而在查MSDN可以發現,像這些預設的事件處理方法,呼叫都能引發其對應的事件。例如,我呼叫了OnMouseDown就能引發滑鼠左鍵按下事件,其實也就是執行了我們加入的事件處理方法(委託)。而且我們還是多播委託的,因為我們是用"+="添加委託方法的。

這樣的話,如果你重寫了OnMouseDown一定要在裡面調用基類的OnMouseDown方法,

不然我們添加的MouseDown方法就不會被執行(如果有)

那麼知道了上面那些,我就來做一個實際例子吧。重寫OnPaintBackground繪製背景的方法。

  public partial class Form1 : Form
    {
        public Form1()🎠  ();
        }
        //重寫OnPaintBackground方法
        {
            //禁止基底類處理,我們自己繪製背景
            //base.OnPaintBackground(e);
           idBrush(Color.Transparent);
            //以整個窗口中填
            e.Graphics.FillRectangle(brush.   ClientRectangle);
            //再畫一個圓
                    e.Graphics.DrawEllipse(pen, this.ClientRectangle);
        }
    }

TextureBursh圖片畫刷

可以用圖片來填滿一個形狀,例如長方形,圓形。圖片不夠大則平鋪顯示。

範例:

   private void formPaint(Object sender, PaintEventArgs e)

       

            //創建圖片畫筆

            Rectangle rect  new); TextureBrush brush = new TextureBrush(Image.FromFile("d:\Image\345.jpg"),rect);

               }


建構子最後一個參數,rect表示要用圖片的哪一部分進行填充,10,10表示圖片起始位置(左上角),70,70表示寬度和高度,注意不能超出圖片原有範圍。整張圖片填滿的話,則不需要指定rect。建構函式裡填一個參數就行了。

LinearGradientBursh線性漸變畫刷(這個類別存在於System.Drawing.Drawing2D命名空間裡)

LinearGradientBursh類別有一個建構函式重載,它有四個參數,是兩個點,和兩種顏色。

這四個參數指定了起始點的顏色,和結束點的顏色。還有位置。

看下例:

    public partial class Form1 : Form

    {

            InitializeComponent();

            this.Paint += formPaint;

        }
        private void formPaint(Object sender, PaintEventArg graphics = e.Graphics;
            LinearGradientBrush lineBrush = new LinearGradientBrush(new Point(0, ),                                   Color.FromArgb (255, 255, 255), Color.FromArgb(0, 0, 0));
            //填angle);
        }
    }

起始點為0,0結束點是0,50的效果圖。從白色到黑色的漸層顏色段。超過50的部分,又開始重新漸層。

就好比在使用PS的時候,漸層顏色是白到黑,然後拉一條線。起始點是0,0,結束點是0,50。

那麼如果我用這個屬性的漸變畫刷在窗口隨便畫一個矩形是什麼樣的呢,看上面效果圖就可以知道。

例如 graphics.FillRectangle(lineBrush, 0, 0, 100, 100);

這個矩形的畫筆填滿跟第一張效果的對應的矩形區域是一樣的。

如果改變起始點和結束點的值,也可以看得出來。這其中是按著什麼方式來填充的。

例如起始點改成0,0,結束點改變50,50。

 private void formPaint(Object sender, PaintEventArgs e)

        {

       LinearGradientBrush lineBrush = new LinearGradientBrush(new Point(0, 0), new Point(50, 50),                     Color.FromArgb( 255, 255, 255), Color.FromArgb(0, 0, 0));

            //填ectangle);

            Pen pen = new Pen(Color.FromArgb(0, 255,0));
            graphics.DrawRectangle(pen, 0, 0, 50, 50);
     這個視窗並沒有禁止掉最大化功能,可以改變視窗大小以便更進一步的觀察。

多種顏色漸變

LinearGradientBrush類有個InterpolationColors屬性成員可以指定多種顏色漸變,這個成員是一個ColorBlend類型,像之前的漸變,都只能限於兩種顏色的漸變,使用了InterpolationColors後,就可以使用多種,如從紅到綠的漸變,然後綠色到藍。

看範例:

   private void formPaint(Object sender, PaintEventArgs e)
        {
         ColorBlend color_blend=new ColorBlend();
            //指定幾種顏色
        //指定幾種顏色
   ]{Color.Red,Color.Green,Color.Blue};
            //指定顏色的範圍
                     Rectangle rect=new Rectangle(0,0,200,100);
            //創建漸進式畫刷
             new LinearGradientBrush(new Point(0,0),new Point(200,0),Color.White,Color.White);
        .InterpolationColors=color_blend;
            e.Graphics.FillRectangle(brush,rect);
      到綠漸變,然後從綠色到藍漸變。

color_blend.Positions指定顏色的範圍,如把那上面那個矩形寬度看作整體1的話,那麼紅到綠漸變,是從0/3f至2/3f完成的,也就是在這個

範圍內完成了紅到綠的漸變,那麼綠色到藍漸變的範圍就是2/3f至3/3f。

如果要各佔一半的話,那就是color_blend.Positions=new float[]{0/2f,1/2f,2/2f};


文章請關注PHP中文網!


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!