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