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();
}
}
你有没有试着用'最顶层=真;'?或者,至少,'BringToFront()'? – varocarbas