为什么CenterToScreen方法会将窗体居中显示在鼠标所在的屏幕上,而不是具有焦点应用程序的屏幕?

18
我正在使用Visual Studio 2010、C# .NET 4和WinForms。我的电脑有2个显示器。
当我调用一个窗体的CenterToScreen方法时,这个窗体会在光标所在的屏幕上自动居中。有没有人知道为什么会这样?
2个回答

40

根据文档

不要直接从代码中调用此方法。相反,将StartPosition属性设置为CenterScreen。

CenterToScreen方法使用以下优先级列表来确定用于居中窗体的屏幕:

  1. 窗体的Owner属性。
  2. 窗体的HWND所有者。
  3. 当前拥有鼠标光标的屏幕。

因此,它有效地用于窗体的初始显示。 不打算以后再使用。

您可以像这样编写自己的居中方法:

protected void ReallyCenterToScreen()
{
    Screen screen = Screen.FromControl(this);

    Rectangle workingArea = screen.WorkingArea;
    this.Location = new Point() {
        X = Math.Max(workingArea.X, workingArea.X + (workingArea.Width - this.Width) / 2),
        Y = Math.Max(workingArea.Y, workingArea.Y + (workingArea.Height - this.Height) / 2)
    };   
}

我已将 StartPosition 设置为 CenterScreen,但当数据加载时,窗体大小可能会自动更改,因此我希望重新居中它。感谢上面的文档片段。现在一切都很清楚了。=) - Welton v3.62
@Welton - 添加了一个示例,展示如何始终将内容居中于当前屏幕。该示例改编自通过ILSpy获取的CenterToScreen函数。 - CodeNaked
太好了!感谢@CodeNaked。在我发现CenterToScreen方法之前,我曾尝试过类似的逻辑(高度和宽度除以2等等),但我无法确定应用程序当前所在的屏幕。'Screen.FromControl'就是解决问题的关键!现在一切都按预期工作了。=) - Welton v3.62

4

正确,但那不是问题的关键 :-) - CodeNaked
你问有没有人知道为什么一个窗体会居中显示在屏幕上,而光标也在其中;p MSDN 知道为什么……这是因为它是按设计来实现的,这是链接中的第三点。(当前拥有鼠标光标的屏幕。) - JonAlb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接