一、了解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();