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 里做计算
坐标不准 使用逻辑坐标 → 屏幕坐标转换
图形选中 记录图形边界矩形
图层混乱 背景层 / 设备层 / 动态层
性能差 只刷新变化区域
相关推荐
cndes14 分钟前
给Miniconda换源,让包下载更迅速
开发语言·python
唐青枫30 分钟前
看懂 IL 的关键:C#.NET 栈机执行模型实战拆解
c#·.net
LuminousCPP32 分钟前
C 语言集中实践全记录:顺序表 + 单链表原理实现与通讯录项目实战【附可运行源码】
c语言·开发语言·数据结构·经验分享·笔记
兰令水35 分钟前
hot100【acm版】【2026.7.13打卡-java版本】
java·开发语言·数据结构·算法·leetcode·面试
铅笔侠_小龙虾1 小时前
Rust 学习(4)-函数与注释
开发语言·学习·rust
我才是银古1 小时前
从零构建 Windows 桌面 RPA 框架:Go 与 .NET 的跨语言协奏
c#·go·rpa
tiana_1 小时前
写了个零依赖的 Go 版本管理器,curl | bash 完事
开发语言·golang·bash
嘘嘘出差1 小时前
Python 爬虫入门实战:爬取豆瓣电影 Top 250
开发语言·爬虫·python
爱写代码的倒霉蛋2 小时前
实现协程的三种方式
开发语言·python
CS创新实验室2 小时前
NumPy数组的C风格和Fortran风格
c语言·开发语言·numpy