摘要
对于机器视觉来讲,winform界面必不可少。前面几篇对winform编程做了简单介绍,本篇在其基础上总结一下机器视觉基础界面的配置。
1️⃣主题界面的设定
先来讲解一下,如何使用SunnyUI.Net 主题界面?
然后收索SunnyUI并安装,最后将Form1主窗体继承sunnyUI的窗体即可。
public partial class Form1 : Sunny.UI.UIForm
然后就可以使用SunnyUI主题界面了!!
2️⃣基本框架设定以及图标设置
用两个panel容器以及4个button按钮布置基本框架。如图:
对于button按钮,可以通过BackColor属性设置背景颜色。通过FlatAppearance属性设置复选状态下以及鼠标状态下的边框外观和颜色。
🧡那么如何设置图标呢?
- 首先需要打开iconfont-阿里巴巴矢量图标库获取想要的图标(下载图标时候要注意设定下载尺寸)。
- 设置button的image属性导入本地资源(即下载好的图标路径)
- 设置button的TextImageRelation属性修改为ImageBeforeText即可。
如图,简单的图标设定就完成了!!😄(该尺寸为32)
3️⃣通过按钮切换子界面
在完成基本框架以后,我们需要通过不同功能的按钮去切换对应的子界面,因此我们需要将子界面嵌套到主容器内。
💜💜💜💜💜
首先添加子界面,以本篇为例:(添加VisionEditor和Configur)编写界面功能。设置其FormBorderStye属性为None(即无边界窗体)。
然后创建嵌入子界面函数,通过视觉和参数按钮的click事件去调用该函数即可实现切换界面功能。
//创建嵌入子界面函数
public void openform(Form form)
{
form.TopLevel = false;//关闭顶级窗口。(即可以被嵌套在其他页面中)
form.TopMost = false;//关闭最顶层窗体。(该窗体不显示为最顶层窗体)
this.Mainpanel1.Controls.Clear();//清空主容器的显示内容(方便切换窗体)
this.Mainpanel1.Controls.Add(form);//在该容器内添加窗体
form.Show();//显示窗体
}
最后我们还需要借用panel容器滚动显示我们当前点击了哪个按钮。
- 用panel容器设置成滚动条,背景颜色为紫色
- 创建函数获取panel的位置
//创建获取滚动panel位置函数
public void panelBarLocation(Button btn)
{
this.panelBar.Location = new Point(btn.Location.X, btn.Location.Y+btn.Size.Height);//通过点击按钮的位置获取滚动panel位置(点坐标)
}
通过click事件调用这两个函数即可。(完整代码如下)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 视觉基础界面
{
public partial class Form1 : Sunny.UI.UIForm
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
panelBarLocation(btnMain);//默认主界面
}
private void btnVision_Click(object sender, EventArgs e)
{
openform(new VisionEditor());
panelBarLocation(btnVision);
}
private void btnConfig_Click(object sender, EventArgs e)
{
openform(new Configur());
panelBarLocation(btnConfig);
}
//创建嵌入子界面函数
public void openform(Form form)
{
form.TopLevel = false;//关闭顶级窗口。(即可以被嵌套在其他页面中)
form.TopMost = false;//关闭最顶层窗体。(该窗体不显示为最顶层窗体)
this.Mainpanel1.Controls.Clear();//清空主容器的显示内容(方便切换窗体)
this.Mainpanel1.Controls.Add(form);//在该容器内添加窗体
form.Show();//显示窗体
}
//创建获取滚动panel位置函数
public void panelBarLocation(Button btn)
{
this.panelBar.Location = new Point(btn.Location.X, btn.Location.Y+btn.Size.Height);//通过点击按钮的位置获取滚动panel位置(点坐标)
}
}
}
实现效果:
问题分析以及如何解决
通过上面的代码运行,突然发现一个问题:
private void btnConfig_Click(object sender, EventArgs e)
{
openform(new Configur());
panelBarLocation(btnConfig);
}
以该代码为例,每次click事件都会去new一个新的窗体,对于后续的子界面功能实现很不友好。因此我们需要进一步改进代码。
解决办法:(通过创建子窗体的属性,通过调用属性避免每次去初始化子窗体)
- 先在子窗体中定义子窗体属性(以Configur窗体和VisionEditor窗体为例)
Configur窗体完整代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace 视觉基础界面
{
public partial class Configur : Form
{
public Configur()
{
InitializeComponent();
}
public static Configur instance;//定义字段
public static Configur Instance//定义属性
{
get
{
//如果字段为空或被释放,则初始化该窗体,否则返回
//避免多次重复初始化Configur窗体
if (instance == null|| instance.IsDisposed)
{
instance = new Configur();
}
return instance;
}
}
}
}
VisionEditor窗体主要代码:
public static VisionEditor instance;//定义字段
public static VisionEditor Instance//定义属性
{
get
{
//如果字段为空或被释放,则初始化该窗体,否则返回
//避免多次重复初始化VisionEditor窗体
if (instance == null || instance.IsDisposed)
{
instance = new VisionEditor();
}
return instance;
}
}
- 在主窗体Form1中修改切换子界面函数(通过调用属性切换)
//创建嵌入子界面函数
public void openform(String names)
{
//names点击按钮的名字
switch (names)
{
default:
break;
case "btnVision":
VisionEditor.Instance.TopLevel = false;//关闭顶级窗口。(即可以被嵌套在其他页面中)
VisionEditor.Instance.TopMost = false;//关闭最顶层窗体。(该窗体不显示为最顶层窗体)
this.Mainpanel1.Controls.Clear();//清空主容器的显示内容(方便切换窗体)
this.Mainpanel1.Controls.Add(VisionEditor.Instance);//在该容器内添加窗体
VisionEditor.Instance.Show();//显示窗体
break;
case "btnConfig":
Configur.Instance.TopLevel = false;//关闭顶级窗口。(即可以被嵌套在其他页面中)
Configur.Instance.TopMost = false;//关闭最顶层窗体。(该窗体不显示为最顶层窗体)
this.Mainpanel1.Controls.Clear();//清空主容器的显示内容(方便切换窗体)
this.Mainpanel1.Controls.Add(Configur.Instance);//在该容器内添加窗体
Configur.Instance.Show();//显示窗体
break;
}
}
- 最后用功能按钮的click事件调用该函数即可
Form1完整代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 视觉基础界面
{
public partial class Form1 : Sunny.UI.UIForm
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
panelBarLocation(btnMain);//默认主界面
}
private void btnVision_Click(object sender, EventArgs e)
{
openform(btnVision.Name);
panelBarLocation(btnVision);
}
private void btnConfig_Click(object sender, EventArgs e)
{
openform(btnConfig.Name);
panelBarLocation(btnConfig);
}
//创建嵌入子界面函数
public void openform(String names)
{
//names点击按钮的名字
switch (names)
{
default:
break;
case "btnVision":
VisionEditor.Instance.TopLevel = false;//关闭顶级窗口。(即可以被嵌套在其他页面中)
VisionEditor.Instance.TopMost = false;//关闭最顶层窗体。(该窗体不显示为最顶层窗体)
this.Mainpanel1.Controls.Clear();//清空主容器的显示内容(方便切换窗体)
this.Mainpanel1.Controls.Add(VisionEditor.Instance);//在该容器内添加窗体
VisionEditor.Instance.Show();//显示窗体
break;
case "btnConfig":
Configur.Instance.TopLevel = false;//关闭顶级窗口。(即可以被嵌套在其他页面中)
Configur.Instance.TopMost = false;//关闭最顶层窗体。(该窗体不显示为最顶层窗体)
this.Mainpanel1.Controls.Clear();//清空主容器的显示内容(方便切换窗体)
this.Mainpanel1.Controls.Add(Configur.Instance);//在该容器内添加窗体
Configur.Instance.Show();//显示窗体
break;
}
}
//创建获取滚动panel位置函数
public void panelBarLocation(Button btn)
{
this.panelBar.Location = new Point(btn.Location.X, btn.Location.Y+btn.Size.Height);//通过点击按钮的位置获取滚动panel位置(点坐标)
}
}
}