C#的System.Drawing 命名空間提供了對 GDI+ 基本圖形功能的通路
重點在于擷取Graphics對象,例如:
Graphics g = panel1.CreateGraphics
事實上CreateGraphics繼承自Control, 即基本每一種控件都有這個方法
Control.CreateGraphics
在pannel、form上畫圖都一樣,這裡以pictureBox為例。DrawRectangle函數為例畫矩形,其他形狀不在這裡考慮,自己嘗試很簡單
畫圓是畫橢圓,隻需g.DrawEllipse後兩個int參數width,height要設定相等,同時前兩個int參數并不是圓心而是左上角的坐标,沒有自帶的circle函數隻能自己封裝
回到正題:
網上給的都是MouseDown MouseMove MouseUp Paint事件相關的代碼,非常的簡單。
using System.Drawing;
bool bDrawStart = false;
Point pointStart = Point.Empty;
Point pointContinue = Point.Empty;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (bDrawStart)
{
bDrawStart = false;
}
else
{
bDrawStart = true;
pointStart = e.Location;
}
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (bDrawStart)
{
pointContinue = e.Location;
Refresh();
}
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
if (bDrawStart)
{
dicPoints.Add(pointStart, pointContinue);
}
bDrawStart = false;
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
if (bDrawStart)
{
//實時的畫矩形
Graphics g = e.Graphics;
g.DrawRectangle(pen, pointStart.X, pointStart.Y, pointContinue.X -pointStart.X, pointContinue.Y - pointStart.Y);
}
pen.Dispose();
}
用完就發現很明顯的問題了,一次隻能畫一個圖形
如何才能一次畫多個呢?不少都說的重寫Paint事件,override之類的函數,多麻煩。
試驗修改Paint事件代碼即可,定義一個字典表記錄畫過的矩形(根據對角兩個點确定一個矩形,對應字典表的key, value,不考慮矩形相交重疊之類的情況),如下:
Dictionary<Point, Point> dicPoints = new Dictionary<Point, Point>();
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
System.Drawing.Pen pen = new System.Drawing.Pen(Color.LimeGreen);
pen.Width = 2;
if (bDrawStart)
{
//實時的畫矩形
Graphics g = e.Graphics;
g.DrawRectangle(pen, pointStart.X, pointStart.Y, pointContinue.X - pointStart.X, pointContinue.Y -pointStart.Y);
}
//實時的畫之前已經畫好的矩形
foreach (var item in dicPoints)
{
Point p1 = item.Key;
Point p2 = item.Value;
e.Graphics.DrawRectangle(pen, p1.X, p1.Y, p2.X - p1.X, p2.Y - p1.Y);
}
pen.Dispose();
}