WinForm界面布局控件WeifenLuo.WinFormsUI.Docking"的使用 (二)

摘要:
//Sourceforge.net/projects/dockpanelsuite双击关闭标记代码,主要是修改DockPaneStripBase.cs类中的protectedoverridevoidWndProc(refMessagem)函数代码,如DockPaneStripCase.cs中的WndProc方法所示。

WinForm界面布局控件WeifenLuo.WinFormsUI.Docking"的使用

()

编写人:CC阿爸

 

2015-1-29

 

今天我想与大家继续一起分享这一伟大的控件。有兴趣的同学,可以一同探讨与学习一下,否则就略过吧。

1.    DockPanel的一点点改进:

在浏览网上的一些技术文章发现,的确有些地方还是可以进一步改进,如当双击Tab时,原先是直接把当前Tab所表示的这个窗体,从主窗体的框架上分离现来,成为一个浮动的窗体。这不是我们想要的,有些同学修改源代码,把它改成了双击关闭。(测试Ok

以下链接为官方共享代码的出处,大家可以利用svn下载到最新的代码。所有的修改全部建立在源代码基础上的

http://sourceforge.net/projects/dockpanelsuite

 

双击关闭标签代码主要是修改 DockPaneStripBase.cs 类里的protected override void WndProc(ref Message m)函数代码如下

DockPaneStripBase.cs WndProc方法里,对于左键双击消息重新作了处理(下面注释掉的一行是原先的写法,它下面那行是改的):

 [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == (int)Win32.Msgs.WM_LBUTTONDBLCLK)
            {
                base.WndProc(ref m);
                int index = HitTest();
                if (DockPane.DockPanel.AllowEndUserDocking && index != -1)
                {
                    IDockContent content = Tabs[index].Content;
                    //if (content.DockHandler.CheckDockState(!content.DockHandler.IsFloat) != DockState.Unknown)
                        
//content.DockHandler.IsFloat = !content.DockHandler.IsFloat; //这句表示窗口还原初始大小并且脱离任何停靠
                    if (content.DockHandler.HideOnClose)
                        content.DockHandler.Hide();//隐藏
                    else
                        content.DockHandler.Close(); //关闭        
                }
 
                return;
            }
            base.WndProc(ref m);
            return;

        } 

2、很多窗体都在Tab中有个右键菜单,右击的里面有关闭,所以最好继承一下DockContent,让其它窗体只要继承这个就有了这个右键菜单,在里面加入ContextMenuStrip菜单工具并加入关闭全部关闭除此之外全部关闭三个菜单(这个我是从网上其它网友处复制出来的,未作测试)

/// <summary>
    
/// 很多窗体都在Tab中有个右键菜单,右击的里面有关闭,所以最好继承一下DockContent,
    
/// 让其它窗体只要继承这个就有了这个右键菜单
    
/// </summary>
    public class DockContentEx : DockContent
    {
        //在标签上点击右键显示关闭菜单
        public DockContentEx( )
        {
            System.Windows.Forms.ContextMenuStrip cms = new System.Windows.Forms.ContextMenuStrip();
            // 
            
// tsmiClose
            
// 
            System.Windows.Forms.ToolStripMenuItem tsmiClose = new System.Windows.Forms.ToolStripMenuItem();
            tsmiClose.Name = "cms";
            tsmiClose.Size = new System.Drawing.Size(9822);
            tsmiClose.Text = "关闭";
            tsmiClose.Click += new System.EventHandler(this.tsmiClose_Click);
            // 
            
// tsmiALLClose
            
// 
            System.Windows.Forms.ToolStripMenuItem tsmiALLClose = new System.Windows.Forms.ToolStripMenuItem();
            tsmiALLClose.Name = "cms";
            tsmiALLClose.Size = new System.Drawing.Size(9822);
            tsmiALLClose.Text = "全部关闭";
            tsmiALLClose.Click += new System.EventHandler(this.tsmiALLClose_Click);
            // 
            
// tsmiApartFromClose
            
// 
            System.Windows.Forms.ToolStripMenuItem tsmiApartFromClose = new System.Windows.Forms.ToolStripMenuItem();
            tsmiApartFromClose.Name = "cms";
            tsmiApartFromClose.Size = new System.Drawing.Size(9822);
            tsmiApartFromClose.Text = "除此之外全部关闭";
            tsmiApartFromClose.Click += new System.EventHandler(this.tsmiApartFromClose_Click);
            // 
            
// tsmiClose
            
// 
            cms.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
            tsmiClose,tsmiApartFromClose,tsmiALLClose});
            cms.Name = "tsmiClose";
            cms.Size = new System.Drawing.Size(9926);
            this.TabPageContextMenuStrip = cms;
        }
        private void tsmiClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        private void tsmiALLClose_Click(object sender, EventArgs e)
        {
            DockContentCollection contents = DockPanel.Contents;
            int num = 0;
            while (num < contents.Count)
            {
                if (contents[num].DockHandler.DockState == DockState.Document)
                {
                    contents[num].DockHandler.Hide();
                }
                else
                {
                    num++;
                }
            }
        }
        private void tsmiApartFromClose_Click(object sender, EventArgs e)
        {
            DockContentCollection contents = DockPanel.Contents;
            int num = 0;
            while (num < contents.Count)
            {
                if (contents[num].DockHandler.DockState == DockState.Document && DockPanel.ActiveContent != contents[num])
                {
                    contents[num].DockHandler.Hide();
                }
                else
                {
                    num++;
                }
            }
        }

}

以下为其它同学编写有关该控件的技术文档,供大家参考

http://www.cnblogs.com/luomingui/archive/2013/09/19/3329763.html

http://blog.csdn.net/dqvega/article/details/7594923

以下是修改后的dll供大家下载:

http://download.csdn.net/detail/shilei07068124/4506742

欢迎加入技术分享群

免责声明:文章转载自《WinForm界面布局控件WeifenLuo.WinFormsUI.Docking"的使用 (二)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Vue 使用 Element 组件实现前端自己的分页功能Java工具类下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

DEV控件

1、问题:为什么从A窗体中拷贝的控件到B窗体中不能用? 答:这是由于拷贝的控件在A窗体中已经声明了引用,所以在拷贝的时候没有拷贝该控件的声明,在B窗体中没有声明,所以不能用。 2、问题:给DEV控件的RibbonPage添加图片绑定,怎么区分? 答:RibbonPage中有IMage属性和LargeImage属性,第一个是绑定小图片,第二个是绑定大图片,一...

C# 轻松实现对窗体(Form)换肤

打下广告:窗体换肤高级版本可以从这里获取。高级版本可以实现XML文件更换皮肤、实现了用图片绘制皮肤。    一直想写一个比较完整的、容易扩展的窗体换肤的方案,由于时间问题,都没去实现这个想法。现在有朋友提出需要,就把以前写的重新拿出来看了一篇,花了些时间,做出了现在的这个换肤的方案。实现的过程中遇到了不少问题,但还是解决了,虽然也许还有些缺陷,但也算是比...

QT入门-在窗体中添加按钮以及对窗体进行设置

1) QT中,按钮类叫做QPushButton。在mywidget.h的MyWidget类的私有变量中: QPushButton b1; 或者QPushButton* b2;按住F4可以直接跳到.cpp文件。 2) 按钮初始化:在窗口类的构造函数里初始化即可。b2=new QPushButton(…)选中按F1可以查看构造函数以及其参数。 QPushBu...

Delphi 窗体失踪在最上面的代码

unitufrmSysPubMessage;interfaceusesWindows,Forms,Messages,Classes,ExtCtrls,Controls,StdCtrls;typeTfrmSysPubMessage=class(TForm)Image1:TImage;lblMessage:TLabel;procedureFormCreate(...

WPF笔记一

笔记内容: BUG、WPF运行窗体时调用Hide()方法,然后再Show()异常的解决方案 WPF 窗体设置为无边框 选择本地文件 选择文件夹 WPF实现右下角弹出消息窗口 WPF 显示 HTTP 网络图片 获得当前应用软件的版本 获取匿名对象(object)的属性值 WPF *.exe给另一个*.exe传值 C# zip压缩与zip解压,下载地址:点击...

一个简单的MDI示范程序(Delphi)

  http://www.cnblogs.com/pchmonster/archive/2012/01/07/2316012.html 最为一个巩固之前有关窗体和对象的有关知识,下面就建立一个简单的MDI示范程序,这个程序的功能是打开和保存图形文件(包括位图、图标等),为了完成这个任务,我们有一个大概的计划,计划内容如下: (1)建立主窗体...