设置子窗体的尺寸规格,以及绘制窗体XY坐标轴,绘制轴线参数款式。
//定义公共类型主窗体变量,供子窗体调用
public static Form1 MainForm = null;
//系统初始化事件
public Form1()
{
InitializeComponent();
//串口接收支持中文显示
serialPort1.Encoding = Encoding.GetEncoding("GB2312"); //串口1的解码支持GB2312汉字
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;//检查跨线程出错解决方法
//主窗体赋给变量,随后可通变量访问主窗体的内容
MainForm = this;
}
加载窗体事件
//点坐标偏移量
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;//显示高度为显示高度-工作区矩形
效果:只剩下菜单栏
第一次打开窗体时会调用此函数
//默认绘制单位
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);
}
//主窗体程序
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);
}
}
}
功能实现:
1.子窗体始终在主窗体右边
2.子窗体大小设置
3.子窗体跟随主窗体移动
4.子窗体内的坐标系规格参数设置
参考自B站硬件家园