最近用了WeifenLuo.WinFormsUI.Docking的控件,界面相当好看。但带来一个问题:
一个子窗体A是基于WeifenLuo.WinFormsUI.Docking的,改变其dock状态后,窗体句柄也变化了,估计是在鼠标拖曳完成过程中重新show时生成了新的句柄。但因为我在子窗体A中内嵌了另外一个程序的窗体,当子窗体A的句柄变化时,另一个程序窗体因找不到原句柄而退出。想了很多招也不能解决。包括:限制子窗体A不能改变dock状态(为fill状态),但双击其标题仍然可变为悬浮状态,句柄一样变了;也找不到鼠标拖曳改变dock状态的这个事件。请各位帮我想想办法。谢谢。

解决方案 »

  1.   

    子窗体A.show后 动态内嵌另外一个程序的窗体,比如movewindow
      

  2.   

    你说的是前期工作,这里已经实现了的。最后解决:
    找到weifenluo的源码,将其中双击标题的函数修改,禁止变为浮动窗口,另外 不允许该窗体拖动改变dock状态。show的时候为fill方式。
    虽然不完美,但总算部分实现。
      

  3.   

    但仍然希望有人能够找到拖动改变dock状态时句柄变化的内在原因。
      

  4.   

    因为改变DockState时候,它会调用 DockPanel.DockPaneFactory.CreateDockPane 方法在不同停靠位置创建不同的子窗口,所以窗口句柄会变。
    你可以注册它的DockStateChanged事件,在停靠位置改变的时候,重新设置下你自己的窗体所记录的窗口句柄。
      

  5.   

    是上、下、左、右、浮动各有一个窗口,你停靠到哪个位置,它就把对应的窗口显示出来。
    停靠的时候,会触发DockStateChanged事件,在这个事件里你可以知道该停靠位置对应的窗口句柄。
      

  6.   

    你reflect翻编译一下那个控件
    为什么会handle改变,有可能是那个控件重新创建了
      

  7.   

    不能绑定控件句柄么,From里添个Panel
      

  8.   

    窗体存在是不用Show,用Activate
      

  9.   

    说的有道理,现在的情况是这样:
    有一款商业软件,用户需求是对其进行封装,简单的操作就能实现其复杂的功能。我用该软件自带的VBA语言实现了封装,但是想把它的运行限制到我的form中。
    不知道您有什么好办法?
      

  10.   

    刚刚研究发现,禁止标题栏双击弹出悬浮窗体,可修改窗体的DockAreas属性,不让其包含WeifenLuo.WinFormsUI.Docking.DockAreas.Float即可。