如何将表单居中放置在 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 值。
因此,一个简单的解决方案是将第一个表单 Location
和 Size
传递给第二个表单,并让它在加载时设置位置。我们需要在其 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);
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 值。
因此,一个简单的解决方案是将第一个表单 Location
和 Size
传递给第二个表单,并让它在加载时设置位置。我们需要在其 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);