Странное поведение в FormBorderStyle между Fixed и Sizable - PullRequest
1 голос
/ 13 мая 2009

Я создал простую тестовую форму с FormBorderStyle = FixedToolWindow по умолчанию и добавил кнопку, которая будет переключаться между FixedToolWindow и SizableToolWindow при нажатии мыши.

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

Например, вот код кнопки:

private void button1_Click(object sender, System.EventArgs e) {
    if(FormBorderStyle == FormBorderStyle.FixedToolWindow) {
        System.Diagnostics.Debug.WriteLine("SWITCHING: FIXED -> SIZABLE");
        FormBorderStyle = FormBorderStyle.SizableToolWindow;
    } else {
        System.Diagnostics.Debug.WriteLine("SWITCHING: SIZABLE -> FIXED");
        FormBorderStyle = FormBorderStyle.FixedToolWindow;
    }
}

И для отладки я использую это:

private void Settings_SizeChanged(object sender, System.EventArgs e) {
    System.Diagnostics.Debug.WriteLine(this.Size);
}

А вот, когда я нажимаю кнопку переключателя, вывод:

SWITCHING: FIXED -> SIZABLE
{Width=373, Height=169}
{Width=383, Height=179}
SWITCHING: SIZABLE -> FIXED
{Width=383, Height=179}
{Width=373, Height=169}

Как я могу исправить это поведение? И под словом «исправить» я имею в виду, если это возможно, предотвратить это. Я хочу иметь возможность указать размер моей формы и оставаться таким, независимо от типа стиля рамки.

Кроме того, решение подкласса класса Form было бы для меня идеальным решением в случае, если у кого-либо возникнут идеи решить эту проблему с помощью такого метода.

EDIT:
Я сделал небольшое видео, чтобы продемонстрировать проблему. Первый тест показывает, что размер формы на самом деле не изменяется (визуально), только местоположение формы немного меняется; но значения для свойства Size изменяются, как вы можете видеть на выходных данных отладки. Во втором тесте, который вы увидите в выходных данных отладки, изменяются значения свойств формы Size и сам размер окна.

Пожалуйста, посмотрите здесь:
http://screencast.com/t/0vT1vCoyx2u

Ответы [ 4 ]

2 голосов
/ 14 мая 2009

Ваша проблема связана с изменением местоположения, а не размера. Этот код решает проблему с видео.

        private void Form1_DoubleClick(object sender, EventArgs e)
        {
            Point _location = this.PointToScreen(this.ClientRectangle.Location);
            if (this.FormBorderStyle == FormBorderStyle.SizableToolWindow)
            {
                this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
            }
            else
            {
                this.FormBorderStyle = FormBorderStyle.SizableToolWindow;
            }
            Point _newloc = this.PointToScreen(this.ClientRectangle.Location);
            Size _diff = new Size(_newloc) - new Size(_location);
            this.Location -= _diff;
        }

Мне кажется, что проблема с отображаемой формой, перемещающейся при переключении между этими двумя стилями границ, является ошибкой в ​​DWM.

1 голос
/ 13 мая 2009

Я подозреваю, что Windows Forms сохраняет размер клиента (т.е. внутреннюю область) одинаковым, пока изменяется размер границы. Как правило, это хорошая вещь, потому что это гарантирует, что окно все еще может корректно соответствовать содержимому, которое вы на него поместили.

Если вы хотите сохранить те же самые внешние размеры, вы можете обойти их, сохранив размер в переменной перед изменением типа границы, а затем восстановив его обратно. Они, вероятно, будут слегка мерцать, хотя.

0 голосов
/ 17 января 2011

У меня была такая же проблема. Размер клиента изменяется, когда вы устанавливаете FormBorderStyle, но, похоже, он сразу не помещается в свойство clientrectangle. Вышеприведенный код почти работал для меня, но не просто размер магазина, убедитесь, что он хранит размер клиента. Конечно, в приведенном выше примере, возможно, «this» было ссылкой на размер клиента - я не был уверен. Купи в любом случае, у меня это сработало:

_frmFilter.Height = 300 Dim _size As Size = .ClientSize _frmFilter.FormBorderStyle = FormBorderStyle.FixedToolWindow _frmFilter.ClientSize = _size

0 голосов
/ 13 мая 2009

Для меня это работало нормально:

    private Size _size;
    private void Form1_DoubleClick(object sender, EventArgs e)
    {
        _size = this.Size;
        if (this.FormBorderStyle == FormBorderStyle.SizableToolWindow)
        {
            this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
        }
        else
        {
            this.FormBorderStyle = FormBorderStyle.SizableToolWindow;
        }
        this.Size = _size;
    }
...