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

一、WinForms 工业绘图

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

1、基础绘图(无闪烁)

csharp 复制代码
using System.Drawing;
using System.Windows.Forms;

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
        DoubleBuffered = true; // 工业画面必开:防闪烁
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        Graphics g = e.Graphics;

        // 高质量绘图(工业画面必须)
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
        g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;

        // 1. 画直线(管道、连接线)
        using (Pen linePen = new Pen(Color.DodgerBlue, 2))
        {
            g.DrawLine(linePen, 50, 50, 300, 50);
        }

        // 2. 画矩形(设备、阀门)
        using (Pen rectPen = new Pen(Color.LimeGreen, 3))
        {
            g.DrawRectangle(rectPen, 50, 80, 200, 100);
        }

        // 3. 画实心矩形(状态指示)
        using (SolidBrush brush = new SolidBrush(Color.Orange))
        {
            g.FillRectangle(brush, 60, 90, 180, 80);
        }

        // 4. 画圆形(泵、电机)
        using (Pen circlePen = new Pen(Color.Red, 3))
        {
            g.DrawEllipse(circlePen, 350, 80, 100, 100);
        }

        // 5. 画实心圆(指示灯)
        using (SolidBrush brush = new SolidBrush(Color.Green))
        {
            g.FillEllipse(brush, 360, 90, 80, 80);
        }

        // 6. 画文字(设备编号)
        using (Font font = new Font("微软雅黑", 12, FontStyle.Bold))
        {
            g.DrawString("PUMP-01", font, Brushes.White, 365, 120);
        }
    }
}

2、工业设备示意图

csharp 复制代码
protected override void OnPaint(PaintEventArgs e)
{
    Graphics g = e.Graphics;
    g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

    int tankX = 50, tankY = 50, tankW = 200, tankH = 300;

    // 储罐(矩形)
    g.DrawRectangle(Pens.SteelBlue, tankX, tankY, tankW, tankH);

    // 液位(动态高度)
    int liquidHeight = 180;
    g.FillRectangle(Brushes.DeepSkyBlue, tankX + 2, tankY + tankH - liquidHeight, tankW - 4, liquidHeight);

    // 管道(直线)
    g.DrawLine(new Pen(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、实时刷新(绑定传感器数据)

csharp 复制代码
public class Device
{
    public float LiquidLevel { get; set; }
}

Device device = new Device();

private void timer1_Tick(object sender, EventArgs e)
{
    device.LiquidLevel = GetSensorValue(); // 从PLC/Modbus读取
    Invalidate(); // 触发重绘
}

protected override void OnPaint(PaintEventArgs e)
{
    // 根据液位动态绘制
    int h = (int)(300 * device.LiquidLevel / 100f);
    e.Graphics.FillRectangle(Brushes.Blue, 52, 348 - h, 196, h);
}

二、WPF 工业绘图

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

1、XAML 绘图

xml 复制代码
<Window x:Class="WpfDrawing.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
    <Canvas>
        <!-- 直线 -->
        <Line X1="50" Y1="50" X2="300" Y2="50"
              Stroke="DodgerBlue" StrokeThickness="3"/>

        <!-- 矩形 -->
        <Rectangle Canvas.Left="50" Canvas.Top="100"
                   Width="200" Height="120"
                   Stroke="LimeGreen" StrokeThickness="3"
                   Fill="#8032CD32"/>

        <!-- 圆形 -->
        <Ellipse Canvas.Left="350" Canvas.Top="100"
                 Width="120" Height="120"
                 Stroke="Red" StrokeThickness="3"
                 Fill="LightCoral"/>
    </Canvas>
</Window>

2、WPF 动态绑定

xml 复制代码
<Ellipse Width="100" Height="100"
         Fill="{Binding PumpStatus, Converter={StaticResource StatusToColor}}"/>
csharp 复制代码
public bool PumpStatus { get; set; } // true=绿色,false=红色

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

三、工业绘图核心技巧

问题 解决方案
画面闪烁 DoubleBuffered = true
实时卡顿 定时刷新,不在 Paint 里做计算
坐标不准 使用逻辑坐标 → 屏幕坐标转换
图形选中 记录图形边界矩形
图层混乱 背景层 / 设备层 / 动态层
性能差 只刷新变化区域
相关推荐
小码编匠13 小时前
C# 工控上位机必备:数据转换工具类与十个核心模块
后端·c#·.net
唐青枫3 天前
别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
c#·.net
Artech3 天前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
ai·c#·agent·memory·maf
Scout-leaf5 天前
C#摸鱼实录——IoC与DI案例详解
c#
咕白m6255 天前
使用 C# 在 Excel 中应用多种字体样式
后端·c#
Artech5 天前
[MAF预定义的AIContextProvider-02]AgentSkillsProvider——将Agent Skills引入MAF
ai·c#·agent·agent skills·maf
LDR0065 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术5 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园5 天前
C++20 Modules 模块详解
java·开发语言·spring
swordbob5 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio