Минимизация/восстановление со скрытой панелью заголовка приводит к увеличению окна формы окна

Я столкнулся с этой проблемой в Windows Forms после использования PInvoke из SetWindowLongPtr для удаления заголовка (WS_CAPTION) из окна Sizable. После этого всякий раз, когда окно свернуто или развернуто, а затем восстановлено до нормального, оно увеличивается (на CaptionHeight + границу).

Похоже, что механизм компоновки Windows Forms пытается компенсировать полосу заголовка, которая, по его мнению, все еще существует. (Если я начну с FormBorderStyle, равного None, и добавлю то, что хочу, т. е. значительную границу, я столкнусь с противоположной проблемой, окно сожмется).

Я обнаружил, что еще один человек столкнулся с этой проблемой на codeplex, но решения не было опубликовано.

Попытки настроить размер в пользовательском обработчике для одного из событий изменения размера слишком рано, т. е. Windows Forms вносит свои коррективы после запуска событий Layout, Resize и SizeChanged, а ResizeEnd не срабатывает, если нет панели заголовка. В любом случае это будет просто обходной путь, я бы хотел, чтобы Windows Forms поступала правильно. Идеи?

(У меня есть работающий обходной путь, который я вскоре опубликую, но он виден конечному пользователю.)


person crpatton    schedule 12.11.2009    source источник


Ответы (2)


Он отлично работает, если вы делаете это способом Windows Forms. Вставьте этот код в форму:

protected override CreateParams CreateParams {
  get {
    CreateParams parms = base.CreateParams;
    parms.Style &= ~0xC00000;  // Turn off WS_CAPTION
    return parms;
  }
}
person Hans Passant    schedule 13.11.2009
comment
Превосходно! Это намного чище; меньше кода, нет визуальной аномалии. Это не совсем легко обнаружить.... Спасибо. - person crpatton; 17.11.2009
comment
Список возможных значений см. в разделе Стили окон. - person Kevin Haines; 04.06.2012

текст ссылкиМое решение, предложенное Джастином Роджерсом Потрясающе Трюк с насосом сообщений Windows Forms:

    private delegate void VoidMethodInvoker();
    public void ShrinkWindow()
    {
        int widthAdjust = 2 * SystemInformation.BorderSize.Height;
        int heightAdjust = SystemInformation.CaptionHeight + 2 * SystemInformation.BorderSize.Height;
        this.Size = new System.Drawing.Size(Size.Width - widthAdjust, Size.Height - heightAdjust);
    }

// Then in the Resize event:
     case FormWindowState.Normal:
     {
            this.BeginInvoke(new VoidMethodInvoker(this.ShrinkWindow));

            break;
     }

BeginInvoke помещает вызов ShrinkWindow в поток сообщений; вызывать его непосредственно из обработчика события Resize слишком рано, и событие ResizeEnd, кажется, не срабатывает, когда панель заголовка не видна. Конечный пользователь видит, как он растет и сжимается, но это происходит довольно быстро.

person crpatton    schedule 12.11.2009