vs联合halcon——视觉基础界面配置

摘要

对于机器视觉来讲,winform界面必不可少。前面几篇对winform编程做了简单介绍,本篇在其基础上总结一下机器视觉基础界面的配置。


1️⃣主题界面的设定

先来讲解一下,如何使用SunnyUI.Net 主题界面?

  然后收索SunnyUI并安装,最后将Form1主窗体继承sunnyUI的窗体即可。

  public partial class Form1 : Sunny.UI.UIForm

 然后就可以使用SunnyUI主题界面了!!

 2️⃣基本框架设定以及图标设置

 用两个panel容器以及4个button按钮布置基本框架。如图:

 对于button按钮,可以通过BackColor属性设置背景颜色。通过FlatAppearance属性设置复选状态下以及鼠标状态下的边框外观和颜色。

🧡那么如何设置图标呢?

  1. 首先需要打开iconfont-阿里巴巴矢量图标库获取想要的图标(下载图标时候要注意设定下载尺寸)。
  2. 设置button的image属性导入本地资源(即下载好的图标路径)
  3. 设置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容器滚动显示我们当前点击了哪个按钮。

  1. 用panel容器设置成滚动条,背景颜色为紫色
  2. 创建函数获取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位置(点坐标)

        }
    }
}
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值