Установка малой ширины формы приводит к неожиданным результатам - PullRequest
0 голосов
/ 28 февраля 2020

Я работаю над приложением, которое иногда требует отображения небольшого сообщения об ошибке на рабочем столе. По какой-то причине, которую я пока не смог определить, я не смог создать окно с шириной меньше 136 пикселей (но отлично работает с любыми большими ширинами).

Я использую VS Community2019, v16.4.5; используя. NET Framework 4.8 (. Net Framework 4.6.2 имел тот же результат). Вот небольшой пример кода, который воспроизводит мою проблему:

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Diagnostics;

namespace TestWndSize
{
    public static class Program
    {
        public static Form MyForm1;
        public static int RqWidth = 120;

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            MyForm1 = new Form();
            MyForm1.MouseEnter += MyForm1_MouseEnter;
            MyForm1.SizeChanged += MyForm1_SizeChanged;
            MyForm1.AutoSize = false;
            MyForm1.FormBorderStyle = FormBorderStyle.None;
            MyForm1.StartPosition = FormStartPosition.Manual;
            MyForm1.Location = new Point(1400, 100);
            Debug.WriteLine("---  Changing Width to " + RqWidth.ToString());
            MyForm1.Size = new Size(RqWidth, 100);
            Debug.WriteLine("---  Width should be now " + RqWidth.ToString()+"; is "+MyForm1.Width.ToString());
            MyForm1.BackColor = Color.LightBlue;

            Application.Run(MyForm1);
        }

        private static void MyForm1_SizeChanged(object sender, EventArgs e)
        {
            Debug.WriteLine("*** SizeChanged to Width=" + MyForm1.Width.ToString());
        }

        private static void MyForm1_MouseEnter(object sender, EventArgs e)
        {
            Debug.WriteLine("§§§  Current Width is " + MyForm1.Width.ToString());
        }
    }
}

Вывод отладки:

*** SizeChanged to Width=300
---  Changing Width to 120
*** SizeChanged to Width=120
---  Width should be now 120; is 120
*** SizeChanged to Width=136        !!??!!
*** SizeChanged to Width=136        !!??!!
§§§  Current Width is 136       *Execution of MouseEnter*

Ширина изменяется на запрошенное значение, но затем изменяется (???) на (???) 136px, но только если запрошенное значение меньше 136px. Поскольку выходные данные отладки показывают, что событие SizeChanged выполняется два раза для нежелательного размера, но я не вижу никакой причины, почему. У кого-нибудь есть идеи о том, чего мне в итоге не хватает?

1 Ответ

0 голосов
/ 28 февраля 2020

Возможно, во время инициализации рендеринга формы что-то меняет размер до минимально необходимого размера. (Кажется, что пропущенные границы не учитываются).
Однако вы можете просто изменить свой размер в обработчике события «Загрузка формы», и тогда новые значения будут соблюдены

private static void MyForm1_Load(object sender, EventArgs e)
{
    Debug.WriteLine("*** FormLoad to Width=" + MyForm1.Width.ToString());
    MyForm1.Size = new Size(RqWidth, 100);
}

Конечно, вам нужно вручную добавить обработчик события

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...