WinAPI: создание окна с изменяемыми размерами без заголовка, но с кнопками сворачивания / разворачивания / закрытия (как Firefox / Chrome / Opera) - PullRequest
19 голосов
/ 06 октября 2011

Если вы посмотрите на окна браузеров 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);

Почему эта комбинация кажется необходимой? Сначала я, вероятно, хочу WS_MAXIMIZEBOX | WS_MINIMIZEBOX, так как я хочу эти кнопки.

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

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

Ответы [ 3 ]

13 голосов
/ 06 октября 2011

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

В следующих двух статьях будет показано, как это сделать в Vista и более поздних версиях (с использованием DWM):

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

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

6 голосов
/ 06 октября 2011

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

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

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

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

0 голосов
/ 06 октября 2011

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

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