Подтвердить что ты не робот

Вертикально (только) изменяемые размеры окон в С#

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

4b9b3361

Ответ 1

Вам нужно задать свойства формы MinimumSize и MaximumSize для двух размеров с разной высотой, но равной ширине.

Если вы не хотите, чтобы курсор горизонтального изменения размера отображался вообще, вам нужно обработать сообщение WM_NCHITTEST, например это:

protected override void WndProc(ref Message m) {
    base.WndProc(ref m);
    switch (m.Msg) {
        case 0x84: //WM_NCHITTEST
            var result = (HitTest)m.Result.ToInt32();
            if (result == HitTest.Left || result == HitTest.Right)
                m.Result = new IntPtr((int)HitTest.Caption);
            if (result == HitTest.TopLeft || result == HitTest.TopRight)
                m.Result = new IntPtr((int)HitTest.Top);
            if (result == HitTest.BottomLeft || result == HitTest.BottomRight)
                m.Result = new IntPtr((int)HitTest.Bottom);

            break;
    }
}
enum HitTest {
    Caption = 2,
    Transparent = -1,
    Nowhere = 0,
    Client = 1,
    Left = 10,
    Right = 11,
    Top = 12,
    TopLeft = 13,
    TopRight = 14,
    Bottom = 15,
    BottomLeft = 16,
    BottomRight = 17,
    Border = 18
}

Ответ 2

Просто идея...

public partial class Form1 : Form {
    int _width;

    public Form1() {
        _width = this.Width;
        InitializeComponent();
    }

    protected override void OnResize(EventArgs e) {
        this.Width = _width;
        base.OnResize(e);
    }
}

РЕДАКТИРОВАТЬ: обратите внимание, что решения размера min/max работают намного лучше, чем этот хак:)

Ответ 3

Задайте максимальный и минимальный размер только для ширины формы.

Ответ 4

Да, это возможно. Просто установите форму .MinimumSize.Width = form.MaximumSize.Width = 100 (или любую другую ширину).

Ответ 5

Позволяет FormBorderStyle изменять размер и устанавливать MaximumSize и MinimumSize = new Size (this.Width, 0)

Коррекция

this.MinimumSize = new Size(this.Width, 0);
this.MaximumSize = new Size(this.Width, Int32.MaxValue);

Ответ 6

Чтобы избежать эффекта "резиновой ленты" решения @orsogufo:

public Form1()
{
    InitializeComponent();
    this.MinimumSize = new Size(500, 0);
    this.MaximumSize = new Size(500, Screen.AllScreens.Max(s => s.Bounds.Height));
}

Он не будет правильно настраивать максимальную высоту, чтобы разместить больший экран, если вы изменяете размер экрана, но для статических размеров экрана он отлично работает.