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

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

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

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

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

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

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

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


person SLaks    schedule 02.10.2009    source источник
comment
Это связано с программированием. Если из вопроса не понятно, спрашиваю, как сделать такой свес.   -  person SLaks    schedule 02.10.2009
comment
Кто-то должен это сказать: зачем тебе это? Я бы предпочел, чтобы окно ограничивало минимальную ширину, чтобы этого вообще не произошло.   -  person MusiGenesis    schedule 02.10.2009
comment
Очевидно, не для оконных кнопок, но это может быть полезно для чего-то вроде индикатора состояния. Кроме того, мне любопытно.   -  person SLaks    schedule 02.10.2009
comment
Мне пришлось удалить изображение из вашего сообщения, потому что ImageShack удалил его и заменил рекламным. См. meta.stackexchange.com/q/263771/215468 для получения дополнительной информации. Если возможно, было бы здорово повторно загрузить их. Спасибо!   -  person Undo    schedule 22.09.2015
comment
@Undo: Ой. Я не могу легко найти исходное изображение.   -  person SLaks    schedule 22.09.2015


Ответы (1)


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

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

По умолчанию 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, и последнее сообщение тоже не нужно было переопределять).

person MaxVT    schedule 04.01.2010
comment
Это не ответ на мой вопрос. Я не спрашиваю, как сделать очень маленькое окно; Спрашиваю, как сделать свес. - person SLaks; 04.01.2010
comment
Мне это кажется ошибкой - когда окно слишком мало для кнопок, они будут выступать ... Вы пытались реализовать это, и кнопки обрезались? - person MaxVT; 05.01.2010