如何将表单居中放置在 form1 的中心?

How to center a form to be in the center of form1?

private void pictureBox1_DoubleClick(object sender, EventArgs e)
        {
            Form editorForm = new Form();
            editorForm.Size = new Size(600, 600);
            editorForm.Location = new Point(this.ClientSize.Width / 2, this.ClientSize.Height / 2);

            var picture = new PictureBox
            {
                Name = "pictureBox",
                Anchor = AnchorStyles.None,
                Size = new Size(500, 500),
            };

            editorForm.Controls.Add(picture);
            Bitmap bmp = new Bitmap(Image.FromFile(@"D:\test.jpg"));
            CenterPictureBox(picture, bmp);
            editorForm.Show();
        }

        private void CenterPictureBox(PictureBox picBox, Bitmap picImage)
        {
            picBox.Image = picImage;
            picBox.Location = new Point((picBox.Parent.ClientSize.Width / 2) - (picImage.Width / 2),
                                        (picBox.Parent.ClientSize.Height / 2) - (picImage.Height / 2));
            picBox.Refresh();
        }

为了将 pictureBox(picture) 设置在新表单 (editorForm) 的中心,它工作正常。

现在我想将 editorForm 的位置设置在 form1 的中心。我试过了

editorForm.Location = new Point(this.ClientSize.Width / 2, this.ClientSize.Height / 2);

但它不起作用,editorForm 在 form1 的左侧

试一试

Point point = new Point();
Form editorForm = new Form();
point.X = this.Location.X;
point.Y = this.Location.Y;
editorForm.Location = point;

经过进一步审查,这比图片框比较中出现的要多。 1) “包含”图片框的表单……知道它的左上角 Location 在哪里……并且 2) 它知道图片框的大小。

如果您创建一个要显示的新表单,那么为了按照您的描述将其居中,您将需要知道该表单的大小……在显示该表单之前您不一定知道。

此外,即使您确实知道这些事情……您也可以将第二种形式 Location 设置为……

EditorForm editorForm = new EditorForm();
editorForm.Location = new Point(this.ClientSize.Width / 2, this.ClientSize.Height / 2);

一整天,由于未显示表单,因此无法设置。换句话说,为了使第二个表格居中,我们需要它显示出来,这将是第一个表格的挑战。

所以很明显我们需要第二种形式来进行居中。然而,它不会知道有关父表单的任何信息……除非……我们将该信息传递给第二个表单。如果第二种形式知道父形式的 width 和 heigh 以及左上角的 x 和 y 值是什么......那么我们可以计算第二种形式的左上角 x 和 y 值。

因此,一个简单的解决方案是将第一个表单 LocationSize 传递给第二个表单,并让它在加载时设置位置。我们需要在其 Load 事件中设置第二种形式 Location。如果我们将代码放在窗体的构造函数中,那么如前所述,此设置将被忽略,因为它尚未显示。因此我们需要创建两个全局变量来保存传入的值。然后我们可以在第二个表单加载事件中使用这些变量。

您唯一需要查找的是如果 Size 中的第二种形式比第一种形式大。如果我们忽略这一点,那么第二个表单可能会显示在屏幕边界之外,用户可能无法使用它。一个简单的修复方法是检查计算出的左上角 x 和 y 值,如果任一值小于 0,则只需将其设置为零。

下面是上述内容的示例……

Point ParentTopLeft;
Size ParentSize;

public Form2(Point parentTopLeft, Size parentSize) {
  InitializeComponent();
  ParentTopLeft = parentTopLeft;
  ParentSize = parentSize;
}

private void Form2_Load(object sender, EventArgs e) {
  int tempY = (ParentSize.Height - this.Height) / 2;
  int tempX = (ParentSize.Width - this.Width) / 2;
  int newX = ParentTopLeft.X + tempX;
  int newY = ParentTopLeft.Y + tempY;
  if (newX < 0) {
    newX = 0;
  }
  if (newY < 0) {
    newY = 0;
  }
  this.Location = new Point(newX, newY);
}

用法...

Form2 f2 = new Form2(this.Location, this.Size);