C# 绘制直线 圆形 矩形(工业上位机)

📅 2026/7/7 18:14:28 👁️ 阅读次数 📝 编程学习
C# 绘制直线 圆形 矩形(工业上位机)

一、WinForms 工业绘图

适合:设备状态图、工艺流程、实时数据可视化

1、基础绘图(无闪烁)

usingSystem.Drawing;usingSystem.Windows.Forms;publicpartialclassMainForm:Form{publicMainForm(){InitializeComponent();DoubleBuffered=true;// 工业画面必开:防闪烁}protectedoverridevoidOnPaint(PaintEventArgse){base.OnPaint(e);Graphicsg=e.Graphics;// 高质量绘图(工业画面必须)g.SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.AntiAlias;g.TextRenderingHint=System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;// 1. 画直线(管道、连接线)using(PenlinePen=newPen(Color.DodgerBlue,2)){g.DrawLine(linePen,50,50,300,50);}// 2. 画矩形(设备、阀门)using(PenrectPen=newPen(Color.LimeGreen,3)){g.DrawRectangle(rectPen,50,80,200,100);}// 3. 画实心矩形(状态指示)using(SolidBrushbrush=newSolidBrush(Color.Orange)){g.FillRectangle(brush,60,90,180,80);}// 4. 画圆形(泵、电机)using(PencirclePen=newPen(Color.Red,3)){g.DrawEllipse(circlePen,350,80,100,100);}// 5. 画实心圆(指示灯)using(SolidBrushbrush=newSolidBrush(Color.Green)){g.FillEllipse(brush,360,90,80,80);}// 6. 画文字(设备编号)using(Fontfont=newFont("微软雅黑",12,FontStyle.Bold)){g.DrawString("PUMP-01",font,Brushes.White,365,120);}}}

2、工业设备示意图

protectedoverridevoidOnPaint(PaintEventArgse){Graphicsg=e.Graphics;g.SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.AntiAlias;inttankX=50,tankY=50,tankW=200,tankH=300;// 储罐(矩形)g.DrawRectangle(Pens.SteelBlue,tankX,tankY,tankW,tankH);// 液位(动态高度)intliquidHeight=180;g.FillRectangle(Brushes.DeepSkyBlue,tankX+2,tankY+tankH-liquidHeight,tankW-4,liquidHeight);// 管道(直线)g.DrawLine(newPen(Color.DimGray,6),tankX+tankW/2,tankY+tankH,tankX+tankW/2,tankY+tankH+100);// 泵(圆形)g.DrawEllipse(Pens.Red,tankX+tankW/2-40,tankY+tankH+120,80,80);g.FillEllipse(Brushes.LightCoral,tankX+tankW/2-38,tankY+tankH+122,76,76);// 阀门(矩形)g.DrawRectangle(Pens.DarkOrange,tankX+tankW/2-25,tankY+tankH+220,50,40);}

3、实时刷新(绑定传感器数据)

publicclassDevice{publicfloatLiquidLevel{get;set;}}Devicedevice=newDevice();privatevoidtimer1_Tick(objectsender,EventArgse){device.LiquidLevel=GetSensorValue();// 从PLC/Modbus读取Invalidate();// 触发重绘}protectedoverridevoidOnPaint(PaintEventArgse){// 根据液位动态绘制inth=(int)(300*device.LiquidLevel/100f);e.Graphics.FillRectangle(Brushes.Blue,52,348-h,196,h);}

二、WPF 工业绘图

适合:高端上位机、触摸屏、大屏监控

1、XAML 绘图

<Windowx:Class="WpfDrawing.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"><Canvas><!-- 直线 --><LineX1="50"Y1="50"X2="300"Y2="50"Stroke="DodgerBlue"StrokeThickness="3"/><!-- 矩形 --><RectangleCanvas.Left="50"Canvas.Top="100"Width="200"Height="120"Stroke="LimeGreen"StrokeThickness="3"Fill="#8032CD32"/><!-- 圆形 --><EllipseCanvas.Left="350"Canvas.Top="100"Width="120"Height="120"Stroke="Red"StrokeThickness="3"Fill="LightCoral"/></Canvas></Window>

2、WPF 动态绑定

<EllipseWidth="100"Height="100"Fill="{Binding PumpStatus, Converter={StaticResource StatusToColor}}"/>
publicboolPumpStatus{get;set;}// true=绿色,false=红色

参考代码 C# 绘制直线/圆形/矩形 示例源码www.youwenfan.com/contentcsu/62731.html

三、工业绘图核心技巧

问题解决方案
画面闪烁DoubleBuffered = true
实时卡顿定时刷新,不在 Paint 里做计算
坐标不准使用逻辑坐标 → 屏幕坐标转换
图形选中记录图形边界矩形
图层混乱背景层 / 设备层 / 动态层
性能差只刷新变化区域