天天看點

C# GDI+圖形程式設計--看書筆記

一、了解GDI+ 

GDI+是一個庫,它提供了一個接口,此接口允許程式員編寫與列印機、螢幕或檔案等圖形裝置進行互動的windows和web圖形應用程式。其實是由C++編寫的一個類,供我們調用。在程式中使用GDI+需要添加相應的命名空間,主要由 

System.Drawing:基本的GDI+功能的定義,它提供了Graphics類,這個類提供了最重要的繪圖與填充方法。還封裝了矩形,點,畫筆和鋼筆等GDI圖元類。 

System.Drawing.Drawing2D名稱空間。進階二維和矢量圖形應用程式的功能。 

System.Drawing.Imaging:基本圖像處理功能. 

二、GDI+基本應用 

首先要繪圖,要有繪圖的畫布,畫布可以是窗體表面,列印機表面,位圖表面,還要有畫筆,可以是鋼筆,筆刷等。還要有一個畫圖的過程即方法調用。另外還需要知道坐标系統,在窗體表面,坐标是以左上角為(0,0)。 

現在開始進行基本畫圖操作 

1、擷取一個Graphics對象 

可以通過窗體的paint事件擷取 

private void form1_Paint(object sender,PaintEventArgs e) 

Graphics g=e.Graphics; 

} 重載OnPaint 

protected override void OnPaint(PaintEventArgs e) 

Graphics g=e.Graphics; 

}以上兩種方法都是在窗體加載時就得到的,但我們常常需要在别的時候得到并繪圖,是以要使用其它方法。 

Graphics g=this.CreateGraphics();//通過窗體本身方法 

Bitmp bmp=new (600,400); 

Graphics g=Graphics.FromImage(bmp)//通過圖形得到一個 

Graphics g=Graphics.FromHwnd(this.Handle)//通過窗體句柄得到一個。通過圖形得到一個,那麼我們可以在圖形上繪制圖形,我覺得這是我們比較常用的方法。 

有了Graphics對象,我們可以通過這個類的方法進行繪制各種基本圖形。但還需要鋼筆或畫筆才能繪制。 

2、建立鋼筆或畫筆 

Pen redPen=new Pen(Color.Red,3)//建立一個紅色,寬為3象素的鋼筆 

Pen blackPen=Pens.Black //建立一個黑色鋼筆 

SolidBrush greenBrush=new SolidBrush(Color.Green)//建立一個綠色的畫筆有了畫筆或鋼筆我們就可以畫畫了 

3、繪制圖形 

Bitmap bmp = new Bitmap(this.Width, this.Height); 

Graphics g = Graphics.FromImage(bmp); 

g.Clear(Color.White);//設畫布背景為白色 

g.SmoothingMode = SmoothingMode.AntiAlias;//品質為消除齒 

Rectangle rect = new Rectangle(20, 20, 100, 100);//建立一個矩形 

Pen redPen = new Pen(Color.Red, 3); 

Pen blackPen = Pens.Black; 

SolidBrush greenBrush = new SolidBrush(Color.Green); 

g.DrawRectangle(redPen, rect);//通過鋼筆畫矩形 

g.FillEllipse(greenBrush, rect);//用畫筆填充矩形 

g.DrawLine(blackPen, 0, 250, this.Width, 250);//畫線 

g.FillEllipse(Brushes.Blue, 70, 220, 30, 30);//填充圓 

g.FillEllipse(Brushes.SkyBlue, 100, 210, 40, 40); 

g.FillEllipse(Brushes.Green, 140, 200, 50, 50); 

e.Graphics.DrawImage(bmp, 0.0F, 0.0F);//把圖形畫到窗體上 

greenBrush.Dispose();//清除資源 

redPen.Dispose(); 

g.Dispose(); 

這是最基本的GDI+畫圖方法,其實也就是得到一個畫布,畫筆(Pen,SolidBrush),畫圖方法(Graphics.方法).這是畫圖三要素。 

下面加個執行個體,是我轉過來的,本來想寫出一個圖表控件,但有點小問題,我現在把這個例子粘出來,希望有人能做出這個控件 

Bitmap bm = new Bitmap(240, 210); 

//在建立的畫布上畫一個圖 

Graphics bp = Graphics.FromImage(bm); 

//設定bp的背景色為Beige 

bp.Clear(Color.Beige); 

//建立資料源,在此為一個數組 

int[] a1 ={ 20, 40, 60, 80, 100, 120, 140, 160 }; 

int[] a2 ={ 40, 60, 80, 100, 120, 140, 160, 180 }; 

bp.DrawRectangle(Pens.Black, 1, 1, 230, 205); 

//通過循環畫出柱狀圖 

for (int i = 0; i < a1.Length; i++) 

//填充圖(着色,起點X,起點Y,寬,高) 

bp.FillRectangle(new SolidBrush(Color.Blue), (i * 30) + 5, 200 - a1[i], 5, a1[i] + 5); 

//填充邊框(着色,起點X,起點Y,寬,高) 

bp.DrawRectangle(Pens.Black, (i * 30) + 5, 200 - a1[i], 5, a1[i] + 5); 

//柱圖2 

for (int i = 0; i < a2.Length; i++) 

bp.FillRectangle(new SolidBrush(Color.Red), (i * 30) + 10, 200 - a2[i], 5, a2[i] + 5); 

bp.DrawRectangle(Pens.Black, (i * 30) + 10, 200 - a2[i], 5, a2[i] + 5); 

Graphics gg = this.CreateGraphics(); 

gg.DrawImage(bm, 0.0f, 0.0f); 

gg.Dispose(); 

bp.Dispose(); 

c#