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 (изображение) в центр новой формы (editorForm), он работает нормально.

Теперь я хочу установить расположение editorForm в центре form1. я пробовал это

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

Но это не работает, форма редактора находится в левой части формы1

0
Sharo SA 4 Фев 2022 в 01:57
Так почему бы не использовать ту же логику, что и для изображения?
 – 
pm100
4 Фев 2022 в 02:05

2 ответа

Лучший ответ

После дальнейшего рассмотрения это больше, чем кажется в отношении сравнения коробки с картинками. 1) форма, которая «содержит» поле с изображением… ЗНАЕТ, где находится его верхний левый Location… И 2) оно знает РАЗМЕР поля с изображением.

Если вы создаете новую форму для отображения, то для ее центрирования, как вы описываете, вам нужно будет знать, каков размер этой формы… что вы не обязательно узнаете, пока форма не будет отображена.

Кроме того, даже если вы ЗНАЛИ эти вещи… вы можете установить вторые формы Location как…

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

Весь день, и он НЕ будет установлен, так как форма НЕ отображается. Другими словами, чтобы центрировать вторую форму, нам нужно, чтобы она отображалась, и это будет проблемой для первой формы.

Таким образом, должно быть ясно, что нам нужна вторая форма для этого центрирования. Однако он ничего не узнает о родительской форме... ЕСЛИ... мы не передаем эту информацию второй форме. Если бы вторая форма ЗНАЛА ширину и высоту родительской формы, а также значения x и y в верхнем левом углу… тогда мы МОГЛИ вычислить значения x, y в левом верхнем углу для второй формы.

Таким образом, простое решение состоит в том, чтобы передать первые формы Location и Size второй форме и позволить ей установить местоположение при загрузке. Нам нужно будет установить вторую форму Location в ее событии Load. Если мы поместим код в конструктор формы, то, как было сказано ранее, этот параметр будет проигнорирован, так как он еще не отобразился. Поэтому нам нужно будет создать две глобальные переменные для хранения переданных значений. Затем мы можем использовать эти переменные во втором событии загрузки форм.

Единственное, что вам нужно искать, это ЕСЛИ вторая форма больше в 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);
0
JohnG 4 Фев 2022 в 03:38

Попытайся

Point point = new Point();
Form editorForm = new Form();
point.X = this.Location.X;
point.Y = this.Location.Y;
editorForm.Location = point;
0
Junior Plays 4 Фев 2022 в 02:19