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 里做计算 |
| 坐标不准 | 使用逻辑坐标 → 屏幕坐标转换 |
| 图形选中 | 记录图形边界矩形 |
| 图层混乱 | 背景层 / 设备层 / 动态层 |
| 性能差 | 只刷新变化区域 |
