Вертикально (только) изменяемого размера окна формы в C # - PullRequest
34 голосов
/ 26 января 2010

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

Ответы [ 6 ]

74 голосов
/ 26 января 2010

Вам необходимо установить свойства формы 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
}
12 голосов
/ 26 января 2010

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

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);
    }
}

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

7 голосов
/ 26 января 2010

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

3 голосов
/ 26 января 2010

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

Исправление

this.MinimumSize = new Size(this.Width, 0);
this.MaximumSize = new Size(this.Width, Int32.MaxValue);
1 голос
/ 26 января 2010

Да, это возможно. Просто установите вашу форму. Минимум. Размер. Ширина = форма. Максимум. Ширина = 100 (или любой другой ширины)

0 голосов
/ 26 января 2010

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

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

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

...