Подтвердить что ты не робот

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

Итак, что делать?

4b9b3361

Ответ 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 отображается на вкладках.