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);
Почему эта комбинация кажется необходимой? Сначала я, вероятно, хочу 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
не задано, кнопки с минимальным/максимальным образом не отображаются).
Итак, что делать?
Ответы
Ответ 1
Программы удаляют неклиентскую область (панель заголовков) и имеют кучу пользовательской обработки для воспроизведения оконных кнопок, значков, системного меню и т.д. Преимущество этого заключается в том, что они могут рисовать новую строку заголовка ", который фактически является частью стандартной клиентской области, добавлением вкладок или других настраиваемых элементов управления.
Следующие две статьи покажут вам, как это сделать в Vista и выше (с использованием DWM):
Это очень сложно сделать и получить право, поэтому эти две статьи неоценимы. Автор, должно быть, вложил в них много работы! Обе ссылки имеют пример кода, написанный в Delphi, но его должно быть достаточно легко перевести на С++ - понятия идентичны, это просто синтаксис.
Вы также можете быть заинтересованы в общих ресурсах по Glass и DWM, так как все это тесно связано. Вы увидите две приведенные выше ссылки: >
Ответ 2
Вы можете создать окно с надписью или без нее - все, что более уместно с точки зрения желаемой настройки (то есть "без", вы хотите сделать это "без заголовка", как вы говорите), и важный бородавка - это то, что вы берете живопись неклиентской области - это ключевая вещь.
На этом этапе уже некому рисовать ваши кнопки mimimize/maximize. Это, однако, не означает, что вы должны делать картину прямо с нуля и имитировать стандартный интерфейс. Существует API DrawFrameControl
и друзей, в котором вы можете использовать аргумент DFCS_CAPTIONMIN
и кнопку "Свернуть" для вас. Вы также захотите ответить на другие сообщения неклиентской области, например. дескриптор WM_NCHITTEST
, чтобы указать Windows, где находятся ваши новые кнопки окна.
Вы также можете проверить ссылку на Visual Styles Reference, чтобы использовать API рисования с поддержкой темы, например DrawThemeBackground
.
Простым примером этой операции является добавление дополнительной кнопки в заголовок, например, подробно описанный здесь: CCaptionButton (кнопки для заголовка).
Ответ 3
Я считаю, что они создают нормальное окно, а затем рисуют над заголовком свои пользовательские виджеты/вкладки. Это видно в Firefox, так как когда он зависает, вы можете видеть, что обычная строка заголовка Windows отображается на вкладках.