繁体   English   中英

C#MDI WinForms子激活

[英]C# MDI WinForms child activation

我的问题是,当一个从一种子窗体切换到另一种窗体时,会发生一件奇怪的事情:要显示的窗体以一种奇怪的方式出现,就好像它已被最小化,还原然后再最大化一样,造成了类似几次绘图事件的效果。与此同时。

在以下情况下,问题不会出现(即,一切正常):

  • 当使用CTRL + TABCTRL + SHIFT + TAB在表格之间切换时
  • 当子表单未最大化且仅更改子表单的顺序/位置时

可能相关; 有很多方法可以用来显示表单,包括(和相关):

  • child.Focus()
  • child.Show()
  • child.Activate()
  • child.Select()
  • child.BringToFront()

我的问题是,我到底应该打什么电话?

编辑:

就我而言,我的以下代码有效,但仍会导致上述怪异效果:

private void tabForms_MouseClick(object sender, MouseEventArgs e)
{
    // handle middle-mouse-button click (close)
    if (e.Button == System.Windows.Forms.MouseButtons.Middle)
    {
        // See: http://stackoverflow.com/a/745361
        TabPage tab = tabForms.TabPages.Cast<TabPage>().Where((t, i) => tabForms.GetTabRect(i).Contains(e.Location)).FirstOrDefault();
        if (tab != null && tab.Tag != null) (tab.Tag as Form).Close();
    }
    // handle left-mouse-button click (show)
    if ((tabForms.SelectedTab != null) && (tabForms.SelectedTab.Tag != null) && (ActiveMdiChild != tabForms.SelectedTab.Tag))
    {
        (tabForms.SelectedTab.Tag as Form).Select();
        (tabForms.SelectedTab.Tag as Form).Show();
    }
}

PS:如果没有.Select()它将无法正常工作。 尽管似乎如果将.Select().Show()替换为.Focus() ,它仍然可以工作。

现在这可能已经很老了,但是对于这个问题的任何其他人来说,都有一个简单的解决方案。 您可以调用Win32方法LockWindowUpdate ,为窗体提供窗口句柄,创建并打开/最大化窗体,然后再次调用LockWindowUpdate并提供IntPtr.Zero值(如下所示)。

try
{
    LockWindowUpdate(this.Handle);

    // Open your form, maximise it etc
}
catch (Exception ex)
{
    // Handle any errors
}
finally
{
    LockWindowUpdate(IntPtr.Zero);
}

LockWindowUpdate会为您提供的任何窗口句柄禁用绘图,第二次调用IntPtr为零时,它将继续绘图。 一次只能锁定一个窗口。

您将需要另外两件事: DLL导入,以及System.Runtime.InteropServices的使用参考。 这是DLL导入:

[DllImport("user32.dll", EntryPoint = "LockWindowUpdate", SetLastError = true,
        ExactSpelling = true, CharSet = CharSet.Auto,
        CallingConvention = CallingConvention.StdCall)]
public static extern long LockWindowUpdate(IntPtr hWndLock);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM