用 C# picturebox 控件画图
【日志】
2019/7/18
今天介紹一下 C# 用 picturebox 畫坐標系
2020/6/13
這篇文章是在去年發的,沒想到幫助了很多朋友。這段時間又用到 PictureBox 控件繪圖了,覺得有必要把自己最近學到的補充一下,分享給大家,所以下面來個補充好了(之前的 雖然很low 但是就不刪了,畢竟也是滿滿的回憶,嘿嘿)
一、19/7/18版本
編譯環境:VS2010
1.首先建立一個 Windows窗體應用程序 如下圖1所示
建好后,就會出現一個窗體設計界面,可以在屬性欄更改其名字,圖標,Text……如下圖2所示:
2.添加控件 “picturebox” 和 “button” 如圖3所示(可根據需要更改名字):
3.雙擊 “繪圖” 按鈕添加事件響應函數;
在此之前,首先要明白如何從繪圖坐標系轉換為我們常用的坐標系,如下圖3所示:
黑色的是繪圖坐標系,紅色的是我們常用的坐標系,簡單畫下圖就可得到圖中所示公式
本來想畫個寫輪眼,可最后成了下圖4的樣子(笑哭):
要畫好看一點要仔細研究點在哪里,這里就簡單介紹一下在 picturebox 中怎樣畫線,畫橢圓,“繪圖按鈕”點擊函數中有:
4.雙擊“清空畫布”按鈕,添加響應事件:
private void button2_Click(object sender, EventArgs e){Graphics g = pictureBox1.CreateGraphics();g.Clear(Color.White);}點擊運行,OK!
二、20/6/13版本
還是用的 VS2010,首先說明一點,不論是在PictureBox 上畫圖,還是在窗體上直接畫,都要用到 Graphics,個人感覺他們是一樣的,不信我們下面我們一起來看。
1.首先新建個窗體,在加一個pictureBox:
名字啥的隨便區,但是要拉的大一點(不然一會畫不下)可見我拉的很長,pictureBox (我取名為pB)占據了右邊半壁江山
2.添加 Paint 響應事件:
同樣為pB 添加Paint 響應事件:
下面我們要做的就是在這倆Paint 里面碼代碼畫東西了。這樣,我先簡單介紹一下 Graphics 里面畫圖的方法有哪些,之后再來畫個“全景圖”。
我覺得我下面介紹的東西應該叫“對Graphics類的介紹”,PictureBox 也好,窗體也好,我們想在上面畫圖都得用:Graphics g = e.Graphics;其中e為:PaintEventArgs e 是由上面的Paint 事件搞出來的。所以:
Graphics 的屬性和方法有很多,可以看看:
MSDN:https://docs.microsoft.com/zh-cn/dotnet/api/system.drawing.graphics?view=netcore-3.1
本來想截個長圖放這里的,可是那實在是太長遼,朋友們可以自己去讀一讀。這里就簡單介紹幾個常用的繪圖方法吧
1.預備知識
1.1 Color
public struct Color : IEquatable<System.Drawing.Color>表示一種 ARGB 顏色(alpha、紅色、綠色、藍色)。
每個像素的顏色表示為32位數字:8位,分別用于 alpha、紅色、綠色和藍色(ARGB)。 這四個組件都是0到255之間的一個數字,0表示沒有強度,255表示完全強度。 Alpha 分量指定顏色的透明度:0表示完全透明,255表示完全不透明。 若要確定顏色的 alpha、紅色、綠色或藍色分量,請分別使用 A、R、G或 B 屬性。 您可以通過使用其中一個 FromArgb 方法來創建自定義顏色。
系統自帶了好多顏色:
https://docs.microsoft.com/zh-cn/dotnet/api/system.drawing.color?view=netcore-3.1
1.2 GraphicsPath
public sealed class GraphicsPath : MarshalByRefObject, ICloneable, IDisposable表示一系列相互連接的直線和曲線。 無法繼承此類。
詳見:(目前看不懂)
https://docs.microsoft.com/zh-cn/dotnet/api/system.drawing.drawing2d.graphicspath?view=netcore-3.1
1.3 Single
public struct Single : IComparable, IComparable<float>, IConvertible, IEquatable<float>, IFormattable表示單精度浮點數。
Single 值類型表示單精度32位數字,其值范圍從負 3.402823 e 38 到正 3.402823 e 38,以及正或負零、PositiveInfinity、NegativeInfinity,而不是數字(NaN)。 它用于表示非常大的值(例如行星或 galaxies 之間的距離)或極小的值(例如物質的分子質量,以千克為間隔),并且通常不精確(如從地球到另一顆太陽系的距離)。 Single 類型符合二元浮點算術的 IEC 60559:1989 (IEEE 754)標準。
2.一些方法簡介
1.清除整個繪圖面并以指定背景色填充。 public void Clear (System.Drawing.Color color);2.釋放此 Graphics 使用的所有資源。 public void Dispose ();//前面這倆應該是繪圖必用的3.繪制一段弧線,它表示由一對坐標、寬度和高度指定的橢圓部分。 DrawArc //有四個重載,吐槽一下,和我的腦回路很不同,很費解,可以看看我之前寫的一篇博客(鏈接見下)4.繪制由 4 個 Point 結構定義的貝塞爾樣條。 DrawBezier(Pen, Point, Point, Point, Point);//3重載,挺高大上的,目前沒用過5.繪制由 Point 結構的數組定義的閉合基數樣條。 DrawClosedCurve(Pen, Point[], Single, FillMode)6.繪制經過一組指定的 Point 結構的基數樣條。 DrawCurve(Pen, Point[])7.繪制一個由邊框(該邊框由一對坐標、高度和寬度指定)定義的橢圓。 DrawEllipse(Pen, Rectangle)8.在指定坐標處繪制由指定的 Icon 表示的圖像。 DrawIcon(Icon, Int32, Int32)9.在指定位置并且按原始大小繪制指定的 Image。 DrawImage10.繪制一條連接由坐標對指定的兩個點的線條。 DrawLine(Pen, PointF, PointF)11.繪制一系列連接一組 Point 結構的線段。 DrawLines(Pen, PointF[])12.繪制 GraphicsPath。 public void DrawPath (System.Drawing.Pen pen, System.Drawing.Drawing2D.GraphicsPath path);13.繪制一個扇形,該形狀由一個坐標對、寬度、高度以及兩條射線所指定的橢圓定義。 DrawPie(Pen, Single, Single, Single, Single, Single, Single)14.繪制由一組 Point 結構定義的多邊形。 DrawPolygon(Pen, PointF[])15.繪制由坐標對、寬度和高度指定的矩形。 DrawRectangle(Pen, Single, Single, Single, Single)16.繪制一系列由 Rectangle 結構指定的矩形。 DrawRectangles(Pen, Rectangle[])17.在指定位置并且用指定的 Brush 和 Font 對象繪制指定的文本字符串。 DrawString(String, Font, Brush, Single, Single, StringFormat)18.填充邊框所定義的橢圓的內部,該邊框由一對坐標、一個寬度和一個高度指定。 FillEllipse(Brush, Single, Single, Single, Single)19.填充由一對坐標、一個寬度、一個高度以及兩條射線指定的橢圓所定義的扇形區的內部。 FillPie(Brush, Single, Single, Single, Single, Single, Single)20.填充 Point 結構指定的點數組所定義的多邊形的內部。 FillPolygon(Brush, PointF[])21.填充由一對坐標、一個寬度和一個高度指定的矩形的內部。 FillRectangle(Brush, Rectangle)22.填充 Region 的內部。 public void FillRegion (System.Drawing.Brush brush, System.Drawing.Region region);23.測量用指定的 Font 繪制的指定字符串。 MeasureString(String, Font)DrawArc :https://blog.csdn.net/Gou_Hailong/article/details/106715943
3.使用示例
將這些代碼貼到Paint 函數中
Graphics g = e.Graphics;g.Clear(Color.White);//1PointF[] pt = new PointF[4];pt[0] = new PointF(50, 50);pt[1] = new PointF(50, 100);pt[2] = new PointF(70, 110);pt[3] = new PointF(100, 100);// create pen.Pen p = new Pen(Color.Blue, 2);g.DrawBezier(p, pt[0], pt[1], pt[2], pt[3]);//4for (int i = 0; i < 4; i++){ pt[i].Y += 60;}g.DrawClosedCurve(p, pt);//5for (int i = 0; i < 4; i++){ pt[i].Y += 60; }g.DrawCurve(p, pt);//6g.DrawEllipse(p, 100, 100, 60, 100);//7for (int i = 0; i < 4; i++){ pt[i].Y += 60; }g.DrawLine(p, pt[1], pt[3]);//10for (int i = 0; i < 4; i++){ pt[i].Y += 60; }g.DrawPie(p, pt[0].X, pt[0].Y, 60, 50, 60, 250);//13for (int i = 0; i < 4; i++){ pt[i].Y += 60; }g.DrawPolygon(p, pt);//14p.Color = Color.Yellow;for (int i = 0; i < 4; i++){ pt[i].Y -= 60 * 5; pt[i].X += 60; }g.DrawRectangle(p, pt[3].X, pt[3].Y, 100, 50);//15for (int i = 0; i < 4; i++){ pt[i].X += 60; }Font f = new Font("宋體", 15);Brush b = Brushes.Cyan;g.DrawString("Stay Hungry", f, b, pt[2]);//17b = Brushes.DarkOrange;for (int i = 0; i < 4; i++){ pt[i].X += 60; }g.FillEllipse(b, pt[1].X, pt[1].Y, 20, 20);//18for (int i = 0; i < 4; i++){ pt[i].Y += 60; }g.FillPie(b, pt[3].X, pt[3].Y, 60, 50, 60, 250);//19for (int i = 0; i < 4; i++){ pt[i].Y += 60; }g.FillPolygon(b, pt);//20for (int i = 0; i < 4; i++){ pt[i].Y += 60; }g.FillRectangle(b, pt[3].X, pt[3].Y, 100, 50);//21g.Dispose();//2結果:
4.問題
當我將上面的代碼貼到pB_Paint 中時,之后出現問題:
按理說應該沒啥問題,目前解決不了,到時候來填坑。
參考
https://docs.microsoft.com/zh-cn/dotnet/api/system.drawing.graphics?view=netcore-3.1
總結
以上是生活随笔為你收集整理的用 C# picturebox 控件画图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: you_get下载视频报错 don‘t
- 下一篇: __wakeup()绕过