C#winform上位机开发学习笔记10-串口助手的绘制显示窗体与坐标功能添加

发布时间:2024年01月24日

1.功能描述

设置子窗体的尺寸规格,以及绘制窗体XY坐标轴,绘制轴线参数款式。

2.代码部分

?功能1:声明主窗体变量并赋值,用于子窗体调用主窗体内容

        //定义公共类型主窗体变量,供子窗体调用
        public static Form1 MainForm = null;

//系统初始化事件
        public Form1()
        {
            InitializeComponent();
            //串口接收支持中文显示
            serialPort1.Encoding = Encoding.GetEncoding("GB2312");  //串口1的解码支持GB2312汉字
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;//检查跨线程出错解决方法

            //主窗体赋给变量,随后可通变量访问主窗体的内容
            MainForm = this;
        }

?功能2:绘制子窗体尺寸规格样式

加载窗体事件

        //点坐标偏移量
        private const int StartPrint = 40;
        //单位格大小
        private const int Unit_length = 32;


//加载子窗体事件
        private void WaveForm_Load(object sender, EventArgs e)
        {
            //重新设定波形显示窗体尺寸
            int Width = Screen.GetWorkingArea(this).Width - Form1.MainForm.Width;//显示宽度为屏幕尺寸-主窗体尺寸
            int Heigth = this.Height - this.ClientRectangle.Height;//显示整个高度 - 工作区矩形 = 只剩下菜单栏
            Heigth += Unit_length * 16;//32*16
            Heigth += StartPrint * 2;

            this.Size = new Size(Width, Heigth);
        }

其中有段代码需要解释一下:

显示整个高度 - 工作区矩形 = 只剩下菜单栏

int Heigth = this.Height - this.ClientRectangle.Height;//显示高度为显示高度-工作区矩形

效果:只剩下菜单栏

功能3:绘制子窗体坐标样式

第一次打开窗体时会调用此函数

        //默认绘制单位
        private int DrawStep = 8;//每一单元格的成分格子长度为8,影响横轴数字宽度,此处参数设置是4倍
        //绘制单位最大值
        private const int MaxStep = 32;
        //绘制单位最小值
        private const int MinStep = 1;
        //轴线颜色
        private Pen TablePen = new Pen(Color.FromArgb(0x00,0x00,0x00));//00 00 00 为黑色
        //波形颜色
        private Pen LinesPen = new Pen(Color.FromArgb(0xFF,0x00,0x00));


//子窗体绘制事件
        private void WaveForm_Paint(object sender, PaintEventArgs e)
        {
            String Str = "";
            System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath();
            //绘制横轴线
            for(int i = 0; i < (this.ClientRectangle.Height - StartPrint) / Unit_length; i++)
            {
                //画横线-----画笔颜色,起始坐标,终点坐标
                e.Graphics.DrawLine(TablePen, StartPrint, StartPrint + i * Unit_length, this.ClientRectangle.Width, StartPrint + i * Unit_length);
                //绘制纵坐标
                Str = ((16 - i) * 16).ToString("X");
                Str = "0x" + (Str.Length == 1 ? Str + "0" : Str);
                if(i == 0)
                    Str = "0xFF";
                //添加文字
                gp.AddString(Str, this.Font.FontFamily, (int)FontStyle.Regular, 13, new RectangleF(0, StartPrint + i * Unit_length - 8, 400, 50), null);                        
            }
            //绘制纵轴线
            for(int i = 0; i <=(this.ClientRectangle.Width - StartPrint) / Unit_length; i++)
            {
                //画纵线
                e.Graphics.DrawLine(TablePen, StartPrint + i * Unit_length, StartPrint, StartPrint + i * Unit_length, StartPrint + Unit_length * 16);
                //绘制横坐标
                gp.AddString((i * (Unit_length / DrawStep)).ToString(), this.Font.FontFamily,(int)FontStyle.Regular,13,new RectangleF(StartPrint + i * Unit_length - 7,this.ClientRectangle.Height - StartPrint + 4, 400, 50),null);
            }
            //绘制文字
            e.Graphics.DrawPath(Pens.Black, gp);
        }

3.完整代码

//主窗体程序
    public partial class Form1 : Form
    {
        //定义子窗体变量,供主窗体使用
        private static WaveForm WaveForm;
        //定义公共类型主窗体变量,供子窗体调用
        public static Form1 MainForm = null;

        //系统初始化事件
        public Form1()
        {
            InitializeComponent();
            //串口接收支持中文显示
            serialPort1.Encoding = Encoding.GetEncoding("GB2312");  //串口1的解码支持GB2312汉字
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;//检查跨线程出错解决方法

            //主窗体赋给变量,随后可通变量访问主窗体的内容
            MainForm = this;
        }
    }


//子窗体程序
namespace 上位机初始界面
{
    public partial class WaveForm : Form
    {
        //点坐标偏移量
        private const int StartPrint = 40;
        //单位格大小
        private const int Unit_length = 32;

        //默认绘制单位
        private int DrawStep = 8;//每一单元格的成分格子长度为8,影响横轴数字宽度,此处参数设置是4倍
        //绘制单位最大值
        private const int MaxStep = 32;
        //绘制单位最小值
        private const int MinStep = 1;
        //轴线颜色
        private Pen TablePen = new Pen(Color.FromArgb(0x00,0x00,0x00));//00 00 00 为黑色
        //波形颜色
        private Pen LinesPen = new Pen(Color.FromArgb(0xFF,0x00,0x00));

        public WaveForm()
        {
            InitializeComponent();
        }

//加载子窗体事件
        private void WaveForm_Load(object sender, EventArgs e)
        {
            //重新设定波形显示窗体尺寸
            int Width = Screen.GetWorkingArea(this).Width - Form1.MainForm.Width;//显示宽度为屏幕尺寸-主窗体尺寸
            int Heigth = this.Height - this.ClientRectangle.Height;//显示整个高度 - 工作区矩形 = 只剩下菜单栏
            Heigth += Unit_length * 16;//32*16
            Heigth += StartPrint * 2;

            this.Size = new Size(Width, Heigth);
        }

//子窗体绘制事件
        private void WaveForm_Paint(object sender, PaintEventArgs e)
        {
            String Str = "";
            System.Drawing.Drawing2D.GraphicsPath gp = new System.Drawing.Drawing2D.GraphicsPath();
            //绘制横轴线
            for(int i = 0; i < (this.ClientRectangle.Height - StartPrint) / Unit_length; i++)
            {
                //画横线-----画笔颜色,起始坐标,终点坐标
                e.Graphics.DrawLine(TablePen, StartPrint, StartPrint + i * Unit_length, this.ClientRectangle.Width, StartPrint + i * Unit_length);
                //绘制纵坐标
                Str = ((16 - i) * 16).ToString("X");
                Str = "0x" + (Str.Length == 1 ? Str + "0" : Str);
                if(i == 0)
                    Str = "0xFF";
                //添加文字
                gp.AddString(Str, this.Font.FontFamily, (int)FontStyle.Regular, 13, new RectangleF(0, StartPrint + i * Unit_length - 8, 400, 50), null);                        
            }
            //绘制纵轴线
            for(int i = 0; i <=(this.ClientRectangle.Width - StartPrint) / Unit_length; i++)
            {
                //画纵线
                e.Graphics.DrawLine(TablePen, StartPrint + i * Unit_length, StartPrint, StartPrint + i * Unit_length, StartPrint + Unit_length * 16);
                //绘制横坐标
                gp.AddString((i * (Unit_length / DrawStep)).ToString(), this.Font.FontFamily,(int)FontStyle.Regular,13,new RectangleF(StartPrint + i * Unit_length - 7,this.ClientRectangle.Height - StartPrint + 4, 400, 50),null);
            }
            //绘制文字
            e.Graphics.DrawPath(Pens.Black, gp);
        }
    }
}

4.测试结果

功能实现:

1.子窗体始终在主窗体右边

2.子窗体大小设置

3.子窗体跟随主窗体移动

4.子窗体内的坐标系规格参数设置

参考自B站硬件家园

文章来源:https://blog.csdn.net/weixin_49048045/article/details/135756638
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。