3

我正在使用这段代码:

private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
    this.Show();
    this.WindowState = FormWindowState.Normal;
    //this.Location = new Point(form1_location_on_x, form1_location_on_y);
    //this.StartPosition = FormStartPosition.CenterScreen;

无论是线

this.Location = new Point(form1_location_on_x, form1_location_on_y);

或线

this.StartPosition = FormStartPosition.CenterScreen;

当我使用原始屏幕分辨率 1920x1080 时正在工作,但是一旦我将分辨率更改为 1024x768,表单就在右下角没有隐藏我看到它全部但它不在中心。

form1_location_on_x 和 on_y 是:

form1_location_on_x = this.Location.X;
form1_location_on_y = this.Location.Y;

问题是我应该怎么做才能使其适用于任何其他分辨率,如 1024x768 或任何其他分辨率?我尝试了很多改变,但到目前为止没有任何效果。

4

4 回答 4

4
Size screenSize = Screen.PrimaryScreen.WorkingArea.Size;
Location = new Point(screenSize.Width / 2 - Width / 2, screenSize.Height / 2 - Height / 2);

确保您设置 StartPosition = FormStartPosition.Manual;

经过测试并使用 1920x1080 和 1024 x 768

于 2012-12-21T23:04:59.120 回答
2

您可以使用以下公式计算表单的顶部和左侧位置:

int formWidth = yourForm.Width;
int formHeight = yourForm.Height;
int screenH = (Screen.PrimaryScreen.WorkingArea.Top + 
              Screen.PrimaryScreen.WorkingArea.Height) / 2;
int screenW = (Screen.PrimaryScreen.WorkingArea.Left + 
              Screen.PrimaryScreen.WorkingArea.Width) / 2;

int top = screenH - formWidth / 2;
int left = screenW - formHeight / 2;
yourForm.Location = new Point(top, left);

当然,这些天来,您遇到了双显示器的问题。
我不知道您是否希望您的表单始终出现在主屏幕上,或者您希望表单出现在当前屏幕(当前显示表单的屏幕)中。在第二种情况下,您需要找到表单的显示位置

private void CenterForm(Form yuorForm)
{    
    foreach(var s in Screen.AllScreens)
    {
       if(s.WorkingArea.Contains(yourForm.Location))
       {
            int screenH = s.WorkingArea.Height / 2;
            int screenW = s.WorkingArea.Width / 2;

            int top = (screenH + s.WorkingArea.Top) - formWidth / 2;
            int left = (screenW + s.WorkingArea.Left) - formHeight / 2;
            yourForm.Location = new Point(top, left);
            break;
       }
    }
}

编辑:感谢@alex,我将使用SystemEvents类的信息完成答案

如果您想在用户突然更改屏幕分辨率时收到系统通知,您可以订阅该事件SystemEvents.DisplaySettingsChangedusing Microsoft.Win32;需要)

SystemEvents.DisplaySettingsChanged += new EventHandler(SystemEvents_DisplaySettingsChanged);  

然后在事件中处理表单的重新定位

// This method is called when the display settings change.
void SystemEvents_DisplaySettingsChanged(object sender, EventArgs e)
{
    RecenterForm(yourForm);
}
于 2012-12-21T23:00:14.850 回答
1

在调整大小后尝试使用其中之一:

this.CenterToScreen();

或者

this.CenterToParent();
于 2014-11-13T11:01:18.860 回答
0

您可以使用对象的StartPosition 属性Form它决定了表单的位置CenterScreen如果您希望表单在屏幕中央打开,请将其值设置为

于 2014-02-20T07:08:36.070 回答