日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

用 C# picturebox 控件画图

發布時間:2023/12/20 C# 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用 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 中怎樣畫線,畫橢圓,“繪圖按鈕”點擊函數中有:

private void button1_Click(object sender, EventArgs e){Graphics g1 = pictureBox1.CreateGraphics();//畫布g1.Clear(Color.White);Pen p = new Pen(Color.Red, 2);//畫筆Pen p1 = new Pen(Color.Black, 2);Pen p2 = new Pen(Color.Brown, 5);Pen p3 = new Pen(Color.Black, 20);Font f = new Font("宋體", 10);//字體int a = pictureBox1.Size.Height;int b = pictureBox1.Size.Width;g1.DrawLine(p1, 0, a, 0, 0);//畫線g1.DrawLine(p1, 0, a, b, a);g1.DrawLine(p1, 0, 0, 5, 10);g1.DrawLine(p1, b, a, b - 10, a - 5);g1.DrawString("O", f, Brushes.Black, 3, a - 20);g1.DrawString("正北X", f, Brushes.Black, 3, 3);g1.DrawString("正東Y", f, Brushes.Black, b - 50, a - 20);Point1[] Pt=new Point1[20];Point1[] Pt1 = new Point1[20];Pt[0] = new Point1("0", 400, 200);Pt[1] = new Point1("1", 250, 250);Pt[2] = new Point1("2", 200, 400);Pt[3] = new Point1("3", 150, 250);Pt[4] = new Point1("4", 0, 200);Pt[5] = new Point1("5", 150, 150);Pt[6] = new Point1("6", 200, 0);Pt[7] = new Point1("7", 250, 150);Pt[9] = new Point1("8",200,a-200);int i = 0;for (i = 0; i < 8; i++){Pt1[i] = new Point1(Pt[i].name, Pt[i].y, a - Pt[i].x);}g1.FillEllipse(Brushes.Black, Pt[9].x-200, Pt[9].y-200, 400, 400);g1.FillEllipse(Brushes.Red, Pt[9].x - 170, Pt[9].y - 170, 340, 340);g1.FillEllipse(Brushes.Brown, Pt[9].x - 120, Pt[9].y - 120, 240, 240);g1.FillEllipse(Brushes.Red, Pt[9].x - 105, Pt[9].y - 105, 210, 210);g1.FillEllipse(Brushes.Black, Pt[9].x - 80, Pt[9].y - 80, 160, 160);g1.FillEllipse(Brushes.Red, Pt[9].x - 65, Pt[9].y - 65, 130, 130);g1.FillEllipse(Brushes.Black, Pt[9].x - 25, Pt[9].y - 25, 50, 50);i = 0;while (Pt1[i + 1] != null){g1.DrawLine(p2, Pt1[i].x, Pt1[i].y, Pt1[i + 1].x, Pt1[i + 1].y);i++;}g1.DrawLine(p2, Pt1[0].x, Pt1[0].y, Pt1[i].x, Pt1[i].y);i = 1;while (i<=7){g1.FillEllipse(Brushes.Black, Pt1[i].x - 25, Pt1[i].y - 25, 60, 60);g1.FillEllipse(Brushes.Red, Pt1[i].x - 20, Pt1[i].y - 20, 40, 40);//g1.DrawString(Pt1[i].name, f, Brushes.Black, Pt1[i].x - 5, Pt1[i].y + 5);i=i+2;}g1.DrawLine(p3, Pt1[0].x, Pt1[0].y, 200, a-280);g1.DrawLine(p3, Pt1[2].x, Pt1[2].y, 280, a - 200);g1.DrawLine(p3, Pt1[4].x, Pt1[4].y, 200, a - 120);g1.DrawLine(p3, Pt1[6].x, Pt1[6].y, 120, a - 200);g1.Dispose();}

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 響應事件:

private void Draft_Paint(object sender, PaintEventArgs e){}private void pB_Paint(object sender, PaintEventArgs e){}

下面我們要做的就是在這倆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 控件画图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。