利用netMarketing类库组建MDI多文档窗口界面

这个例子是利用netMarketing类库组建MDI多文档窗口界面。这种多文档界面的好处是面板可以任意依靠位置,有点像VS开发环境中的那种面板剥离停靠效果。

对于大部分应用来说,这种效果可以有效的解决用户在界面上的需求变更。

变态的客户经常希望程序的各种面板按他们的想法出现在指定的位置,而面板固定不变的程序就只能傻眼。



创建一个winform工程

引用netMarketing类库,详细见:netMarketing类库: 类库说明

全部重新编译一下工程,可以看到组件面板多出了sharClass组件,UserUI组件,其控件都是netMarketing类库的专用控件,另外还有一个控件叫DockPanel,它用来构建Docking界面。

image.png

image.png

所谓的Docking界面,类似于VS开发环境那样,可以剥离子窗体并且在主窗体任意停靠,它是一种MDI多文档视图,主窗体是子窗体的容器,子窗体可以任意关闭或者重新打开。

DockPanel控件就是用来构建Docking界面的关键控件。


在Form窗体上放入menuStrip控件构建顶部菜单、statusStrip控件构建底状态栏、DockPanel控件构建Docking界面。

DockPanel控件的Dock属性设置为Fill

Form窗体的IsMdiContainer属性设置为True

image.png

人工把菜单设置好,如下:

image.png


创建一个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类库的视觉模块自带的面板,可以直接使用。

image.png

 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。

image.png

把这个窗体修改成继承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;
        }
    }
 }


运行效果如下图:


image.png


本文视频讲解如下:



本文源码资料下载:


扫码收费2元,勇哥用以支付本站服务器费用。


支付2元或购买VIP会员后,才能查看本内容!立即支付升级会员查询订单





--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864