Свернуть / Восстановить со скрытой панелью надписей, чтобы окна форм росли - PullRequest
2 голосов
/ 12 ноября 2009

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 13 ноября 2009

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

protected override CreateParams CreateParams {
  get {
    CreateParams parms = base.CreateParams;
    parms.Style &= ~0xC00000;  // Turn off WS_CAPTION
    return parms;
  }
}
0 голосов
/ 12 ноября 2009

текст ссылки Мое решение, спровоцированное Джастином Роджерсом Удивительный трюк с обработкой сообщений 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, похоже, не срабатывает, когда строка заголовка не видна. Конечный пользователь видит, что это растет и уменьшается, но это довольно быстро.

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