这个例子是利用netMarketing类库组建MDI多文档窗口界面。这种多文档界面的好处是面板可以任意依靠位置,有点像VS开发环境中的那种面板剥离停靠效果。
对于大部分应用来说,这种效果可以有效的解决用户在界面上的需求变更。
变态的客户经常希望程序的各种面板按他们的想法出现在指定的位置,而面板固定不变的程序就只能傻眼。
    
    
创建一个winform工程
引用netMarketing类库,详细见:netMarketing类库: 类库说明
全部重新编译一下工程,可以看到组件面板多出了sharClass组件,UserUI组件,其控件都是netMarketing类库的专用控件,另外还有一个控件叫DockPanel,它用来构建Docking界面。
    
    
所谓的Docking界面,类似于VS开发环境那样,可以剥离子窗体并且在主窗体任意停靠,它是一种MDI多文档视图,主窗体是子窗体的容器,子窗体可以任意关闭或者重新打开。
DockPanel控件就是用来构建Docking界面的关键控件。
    
在Form窗体上放入menuStrip控件构建顶部菜单、statusStrip控件构建底状态栏、DockPanel控件构建Docking界面。
DockPanel控件的Dock属性设置为Fill
Form窗体的IsMdiContainer属性设置为True
    
人工把菜单设置好,如下:
    
    
创建一个work类,如下:
其中dockingHelper类封装了docking的一些简化后的使用方法。
dynMenuHelper,statusStripHelper,configSetting这三个对象分别是动态菜单,状态条对象,配置文件对象,在本例子里面它们没有作用。但完整的程序都会有这三个对象。
    {
        /// <summary>
        /// 顶菜单
        /// </summary>
        public static dynMenuHelper topMenu = null;
        /// <summary>
        /// 状态条
        /// </summary>
        public static statusStripHelper status = null;
        /// <summary>
        /// docking支持
        /// </summary>
        public static dockingHelper dock = null;
        /// <summary>
        /// 系统设定项目
        /// </summary>
        public static configSetting gConfig = new configSetting("gconfig");
    }
    public class configSetting : Settings
    {
        [Config, Category("光源控制器配置"), DisplayName("是否为TCP通讯方式"), Description("光源控制器是否为网络TCP通讯方式 例如: True为网络通讯 false为串口通讯")]
        public bool isTcpComm { get; set; }
        public configSetting(string name)
          : base(name)
        {
        }
        /// <summary>
        /// 保存参数
        /// </summary>
        /// <returns></returns>
        public override bool Save()
        {
            if (PropertiesToSettings(this, this))
                return base.Save();
            return false;
        }
        /// <summary>
        /// 加载参数
        /// </summary>
        /// <returns></returns>
        public override bool Load()
        {
            if (base.Load())
                return SettingsToProperties(this, this);
            return false;
        }
    }
    
把Form1的继承对象由Form改为myForm。
myForm封装了记录窗体位置、大小等信息,以及统一化字休颜色风格, 以及继承DockContent(docking的具体功能的类)等功能
在程序中你应该将所有Form都应该继承myForm以提供Form功能及以上额外的好处。
然后在form1构造函数里面初始化dock窗口的信息。
其中visionForm面板是我们自己创建的,在后面勇哥会继续说明。
面下面4个面板是netMarketing类库的视觉模块自带的面板,可以直接使用。
    
 public partial class Form1 : myForm
    {
        
        public Form1()
        {
            InitializeComponent();
            try
            {
                work.dock = new dockingHelper("docking1", this.dockPanel1, new List<myForm>()
                {
                    new visionForm("视觉信息面板"),
                    new netMarketing.vision.halcon.RectangleCaliForm("标定面板"),
                    new netMarketing.vision.halcon.FrmFitLine("找线参数面板"),
                    new netMarketing.vision.halcon.FrmFindCircle("找圆参数面板"),
                    new netMarketing.vision.halcon.FrmFindPoints("找点参数面板")
                });
            }
            catch (ArgumentException ex)
            {
                MessageBox.Show(ex.Message);
            }
           
        }
    
visionForm面板是我们自己创建的,只是一个空白form窗体,上面放一个groupbox控件,dock属性改为fill。
    
把这个窗体修改成继承myForm类,这个原因上面已经提到过。
然后在构造函数里面初始化一个multiVisionWin对象,它是一个四窗口的视觉窗体对象。
最后把这个multiVisionWin对象塞到groupBox里面去。
this.groupBox3.Controls.Add(mwin);
    
using netMarketing.vision.halcon;
using sharClass;
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 WindowsFormsApp1
{
    public partial class visionForm : myForm
    {
        private multiVisionWin mwin;
        private string dlgName = string.Empty;
        public visionForm(string Name)
        {
            InitializeComponent();
            base.myFormName = this.dlgName = this.Text = this.myFormName = Name;
            mwin = new multiVisionWin(
               null, null, null, null,
                true, true, true, true,
                "", "", "", "")
            {
                Dock = DockStyle.Fill,
            };
        }
        private void visionForm_Load(object sender, EventArgs e)
        {
            this.groupBox3.Controls.Add(mwin);
        }
    }
}
    
程序完整的源代码如下:
using netMarketing.winformHelper;
using sharClass;
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 WeifenLuo.WinFormsUI.Docking;
namespace WindowsFormsApp1
{
    public partial class Form1 : myForm
    {
        
        public Form1()
        {
            InitializeComponent();
            try
            {
                work.dock = new dockingHelper("docking1", this.dockPanel1, new List<myForm>()
                {
                    new visionForm("视觉信息面板"),
                    new netMarketing.vision.halcon.RectangleCaliForm("标定面板"),
                    new netMarketing.vision.halcon.FrmFitLine("找线参数面板"),
                    new netMarketing.vision.halcon.FrmFindCircle("找圆参数面板"),
                    new netMarketing.vision.halcon.FrmFindPoints("找点参数面板")
                });
            }
            catch (ArgumentException ex)
            {
                MessageBox.Show(ex.Message);
            }
           
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                work.dock.loadDockingInfo();
                base.FormloadEvent(sender, e);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            try
            {
                work.dock.saveDockingInfo();
                base.FormcloseEvent(sender, e);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        private void 视觉窗口ToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            work.dock.show("视觉信息面板", DockState.DockLeft, null);
        }
        private void 标定面板ToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            work.dock.show("标定面板", DockState.Document);
        }
        private void 找线参数面板ToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            work.dock.show("找线参数面板", DockState.Document, null);
        }
        private void 找圆参数面板ToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            work.dock.show("找圆参数面板", DockState.Document);
        }
        private void 找点参数面板ToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            work.dock.show("找点参数面板", DockState.Document);
        }
    }
    public class work
    {
        /// <summary>
        /// 顶菜单
        /// </summary>
        public static dynMenuHelper topMenu = null;
        /// <summary>
        /// 状态条
        /// </summary>
        public static statusStripHelper status = null;
        /// <summary>
        /// docking支持
        /// </summary>
        public static dockingHelper dock = null;
        /// <summary>
        /// 系统设定项目
        /// </summary>
        public static configSetting gConfig = new configSetting("gconfig");
    }
    public class configSetting : Settings
    {
        [Config, Category("光源控制器配置"), DisplayName("是否为TCP通讯方式"), Description("光源控制器是否为网络TCP通讯方式 例如: True为网络通讯 false为串口通讯")]
        public bool isTcpComm { get; set; }
        public configSetting(string name)
          : base(name)
        {
        }
        /// <summary>
        /// 保存参数
        /// </summary>
        /// <returns></returns>
        public override bool Save()
        {
            if (PropertiesToSettings(this, this))
                return base.Save();
            return false;
        }
        /// <summary>
        /// 加载参数
        /// </summary>
        /// <returns></returns>
        public override bool Load()
        {
            if (base.Load())
                return SettingsToProperties(this, this);
            return false;
        }
    }
 }
    
运行效果如下图:
    
    
    
本文视频讲解如下:
    
    
本文源码资料下载:
    
扫码收费2元,勇哥用以支付本站服务器费用。
    
    
    
    
    
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!
    


少有人走的路

















