WinAPI: создание изменяемого размера окна без строки заголовка, но с помощью кнопок свернуть/развернуть/закрыть (как Firefox / Chrome / Opera)

если вы посмотрите на окна браузеров Firefox, Chrome или Opera, вы заметите, что их окна

  • имеют минимизировать/максимизировать / закрыть кнопки
  • изменяемого размера
  • но нет заголовка

мне интересно: как я могу создать такое окно?

что я уже пробовал:

Я посмотрел вокруг на StackOverflow (и гуглил тоже), и нашел это: открытие окно, которое не имеет строки заголовка с win32

к несчастью, это не поможет полностью:

первым шагом было расширение предложенного решения на открытие окна без строки заголовка с win32

hWnd = CreateWindow(szWindowClass, szTitle, WS_BORDER, 
  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
  NULL, NULL, hInstance, NULL);

SetWindowLong(hWnd, GWL_STYLE, WS_SIZEBOX);
// See remarks on http://msdn.microsoft.com/en-us/library/windows/desktop/ms633545.aspx
SetWindowPos(hWnd, 0, 
   0, 0, 0, 0, // Position + Size
   SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);

конечно, это не обеспечивает кнопки минимизации / максимизации, но, с другой стороны, если я хочу минимизировать/максимизировать кнопки, я должен сделать:

SetWindowLong(hWnd, GWL_STYLE, WS_SIZEBOX | WS_MAXIMIZEBOX | 
    WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION);

почему эта комбинация кажется необходимой? Сначала я, наверное, хочу!--2--> так как я хочу, чтобы эти кнопки.

но http://msdn.microsoft.com/en-us/library/ms632600.aspx говорит, что если я установлю один из WS_MAXIMIZEBOX и WS_MINIMIZEBOX, Я также должен установить WS_SYSMENU. И когда я установил WS_SYSMENU, Я также должен установить WS_CAPTION но это не то, что я хочу, потому что я хотел избежать заголовке (в самом деле: если WS_CAPTION не установлен, не отображаются кнопки минимизации / максимизации).

так что же делать?

3 ответов


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

следующие две статьи покажут вам, как это сделать на Vista и выше (с помощью DWM):

Это очень сложно сделать и получить право, поэтому вышеупомянутые две статьи бесценны. Должно быть, автор вложил в них много труда! Обе ссылки имеют пример кода, написанный на Delphi, но его достаточно легко перевести на C++ - понятия идентичны, это просто синтаксис.

вы также можете быть заинтересованы в общие ресурсы по стеклу и DWM, так как все это тесно связано. Вы увидите две ссылки, включенные в этот список:)


вы можете создать окно С или без заголовка-все, что более уместно с точки зрения желаемой настройки (то есть " без "Вы хотите сделать это "без заголовка", как вы говорите), и важным бородавкой является то, что вы берете на себя живопись не-клиентской области - это ключевая вещь.

на данный момент нет никого, чтобы нарисовать ваши кнопки mimimize/maximize уже. Это не означает, однако, что вы должны сделать картину прямо с нуля и имитировать стандартный пользовательский интерфейс. Есть DrawFrameControl и друзья API, где вы можете использовать DFCS_CAPTIONMIN аргумент и имеют кнопку минимизации, нарисованную для вас. Вы также захотите ответить на другие сообщения неклиентской области, например handle WM_NCHITTEST чтобы сообщить Windows, где находятся ваши новые кнопки окна.

вы также можете проверить Ссылка На Визуальные Стили чтобы использовать API рисования с поддержкой темы, например DrawThemeBackground.

простой пример этой активности дополнительно кнопка на подпись, например, подробно описано здесь:CCaptionButton (кнопки для заголовка).


Я считаю, что они создают обычное окно, а затем закрашивают строку заголовка своими пользовательскими виджетами/вкладками. Это очевидно в Firefox, так как, когда он зависает, вы можете увидеть обычную строку заголовка Windows над вкладками.