摘要
對於機器視覺來講,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位置(點坐標) } } }