2014-02-28 22 views
0

我有两种形式,它们的业务逻辑是相互连接的。我希望第二个在第一个之后,只要我专注于第一个,反之亦然。关于z-index的两种形式链接

为了让我的问题更清楚,我将描述我想要这个链接的原因。 第一种形式表示数据库对象的形式,第二种形式表示链接到此特定对象的PDF文档的查看器。正如你所了解,我想避免的困惑,那会发生,如果用户打开2对形式(两个数据库对象),并在情况下,第一目标的第一种形式显示紧接着第二的PDF文档目的。

到现在为止我已经创建了一个名为FormPair类,它包含两种形式的属性,我添加了一个事件处理程序上Focus事件每种形式,即执行以下操作:在其他形式

  1. 焦点再次
  2. 焦点触发事件

它种工作的形式,但它并不好看(闪烁,它失去了特定的子控件的焦点,等)。我能以某种方式与二级形式的z-index的发挥,获得更好的效果?

+1

你有没有试着用'最顶层=真;'?或者,至少,'BringToFront()'? – varocarbas

回答

0

BringToFront()是一个很好的解决方案,但它闪烁了一下,当我(再次第二种形式,然后第一个窗体上)调用它的两倍。我终于从user32.dll称为SetWindowPos使用的外部方法,让我自己的新bringToFront方法,即完全不闪烁,给了我两种形式相互链接的感觉。这里有云(与X的一切都是自定义类/枚举/结构):

public partial class XForm : Form 
{ 
    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, XWindowPositionFlag uFlags); 

    public void bringToFront() 
    { 
     SetWindowPos(this.Handle, XFormZIndex.Top, 0, 0, 0, 0, 
      XWindowPositionFlag.SWP_NOMOVE | XWindowPositionFlag.SWP_NOSIZE | XWindowPositionFlag.SWP_NOACTIVATE); 
    } 
} 

其中

public struct XFormZIndex 
{ 
    public static IntPtr 
    NoTopMost = new IntPtr(-2), 
    TopMost = new IntPtr(-1), 
    Top = new IntPtr(0), 
    Bottom = new IntPtr(1); 
} 
[Flags] 
public enum XWindowPositionFlag : uint 
{ 
    SWP_ASYNCWINDOWPOS = 0x4000, 
    SWP_DEFERERASE = 0x2000, 
    SWP_DRAWFRAME = 0x0020, 
    SWP_FRAMECHANGED = 0x0020, 
    SWP_HIDEWINDOW = 0x0080, 
    SWP_NOACTIVATE = 0x0010, 
    SWP_NOCOPYBITS = 0x0100, 
    SWP_NOMOVE = 0x0002, 
    SWP_NOOWNERZORDER = 0x0200, 
    SWP_NOREDRAW = 0x0008, 
    SWP_NOREPOSITION = 0x0200, 
    SWP_NOSENDCHANGING = 0x0400, 
    SWP_NOSIZE = 0x0001, 
    SWP_NOZORDER = 0x0004, 
    SWP_SHOWWINDOW = 0x0040, 
} 

,然后在FormPair

public partial class XFormPair 
{ 
    // properties 
    public XForm leftForm { get; set; } 
    public XForm rightForm { get; set; } 

    // events 
    private void rightFormActivated(object sender, EventArgs e) 
    { 
     leftForm.bringToFront(); 
     rightForm.bringToFront(); 
    } 
    private void leftFormActivated(object sender, EventArgs e) 
    { 
     rightForm.bringToFront(); 
     leftForm.bringToFront(); 
    } 

}