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位置(點坐標)

        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM