Странная роспись окон - PullRequest
       11

Странная роспись окон

0 голосов
/ 02 октября 2009

Если вы измените размер Google Chrome 3.0.195.21 до очень маленькой ширины в Windows 7 (я не пробовал другие версии), кнопки окна свисают с окна.

Размер окна не увеличивается, и вылет не реагирует на мышь.

Предварительный просмотр миниатюры окна показывает только ту часть кнопок, которая находится внутри окна; предварительный просмотр Aero Peek показывает все кнопки.

Выступ не отображается в Spy ++ (насколько я могу судить).

Как это сделать?

Как я могу сделать что-то подобное? (Я пишу на C #, но также отвечаю на C ++)

РЕДАКТИРОВАТЬ : Если неясно, я спрашиваю, как я могу сделать такой перевес в моих собственных программах.

1 Ответ

2 голосов
/ 04 января 2010

При изменении размеров окон на рабочем столе Windows полагается на сообщение WM_GETMINMAXINFO, чтобы получить пределы размера, чтобы окно оставалось пригодным для использования - согласно рекомендациям Microsoft ,

[Resizable windows] Следует установить минимальный размер окна, если есть размер, ниже которого контент больше не может использоваться. Для элементов управления с изменяемым размером установите минимальные размеры элементов с изменяемым размером на их наименьшие функциональные размеры, такие как минимальная ширина функциональных столбцов в представлениях списка.

По умолчанию Windows накладывает ограничение высоты строки заголовка для высоты и около 100 пикселей для ширины (кнопки min / max / close + несколько букв имени). Чтобы снять это ограничение, вы должны самостоятельно обработать сообщение WM_GETMAXINFO и изменить минимальный размер на тот, который необходим.

Пример кода C # можно адаптировать отсюда :

private const long WM_GETMINMAXINFO = 0x24;

public struct POINTAPI
{
    public int x;
        public int y;
}

public struct MINMAXINFO
{
    public POINTAPI ptReserved; 
    public POINTAPI ptMaxSize; 
    public POINTAPI ptMaxPosition;
    public POINTAPI ptMinTrackSize; 
    public POINTAPI ptMaxTrackSize;
}

protected override void WndProc(ref System.Windows.Forms.Message m )
{
    if (m.Msg == WM_GETMINMAXINFO)
    {
        MINMAXINFO mmi = (MINMAXINFO)m.GetLParam(typeof(MINMAXINFO));
        mmi.ptMinTrackSize.x = 0;
        mmi.ptMinTrackSize.y = 0;
        System.Runtime.InteropServices.Marshal.StructureToPtr(mmi, m.LParam, true);
    }

    base.WndProc(ref m);
}

И (исследуя это) я нашел еще один SO вопрос , который касается той же проблемы. Очевидно, вам также нужно переопределить WM_WINDOWPOSCHANGING, чтобы это работало в Vista и / или C #. (Другой пример, который я видел, был в Delphi, и ему также не нужно было переопределять последнее сообщение).

...