链接两个关于z-index的表格

时间:2014-02-28 15:35:28

标签: c# winforms focus z-index

我有两种形式,它们的业务逻辑相互连接。我希望第二个跟在第一个后面,每当我专注于第一个,反之亦然。

为了使我的问题更清楚,我将描述我想要这个链接的原因。 第一种形式表示数据库对象的形式,第二种形式表示链接到该特定对象的PDF文档的查看者。您可以理解,我想避免混淆,如果用户打开两对表单(两个数据库对象),并且如果第一个对象的第一个表单显示在旁边第二个对象的PDF文档。

到目前为止,我已经创建了一个名为FormPair的类,它包含两个表单作为属性,我在每个表单的Focus事件上添加了一个事件处理程序,它执行以下操作:

  1. 专注于其他形式
  2. 再次关注触发事件的表单
  3. 它有点工作,但它看起来不太好(闪烁,它失去了特定子控件的焦点等)。我可以以某种方式使用辅助形式的z-index并获得更好的结果吗?

1 个答案:

答案 0 :(得分:0)

BringToFront()是一个很好的解决方案,但是当我调用它两次时(第二种形式再次在第一种形式上)它会闪烁一点。我终于使用了一个名为user32.dll的{​​{1}}的外部方法来制作一个我自己的新的bringToFront方法,它根本不会闪烁,让我觉得两种形式都是相互关联的。在这里它(Everything with X是一个自定义类/ enum / struct):

SetWindowPos

,其中

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