Вкладки в строке заголовка: в чем секрет?

Chrome и Firefox 4, среди других приложений, теперь помещают часть своего пользовательского интерфейса в строку заголовка. В Windows ОС обычно контролирует всю строку заголовка. Приложение может создать настраиваемую строку заголовка, удалив строку заголовка ОС и нарисовав вместо нее «фальшивую» строку заголовка (например, WinAmp), но только ОС знает, как рисовать ненастроенные элементы строки заголовка (например, Закрыть / Свернуть / Maximize), которые зависят от версии ОС.

С помощью какого механизма приложения, такие как Chrome и Firefox, «разделяют» строку заголовка с ОС (помещают настраиваемые элементы в строку заголовка, сохраняя при этом исходную визуальную тему ОС)?

введите описание изображения здесь

В Chrome вкладки захватывают строку заголовка, поэтому для текста заголовка не хватает места.


person Qwertie    schedule 05.04.2011    source источник
comment
Не могли бы вы опубликовать картинку, чтобы все, у кого нет хрома, могли видеть, о чем вы говорите?   -  person BlackBear    schedule 06.04.2011
comment
вы можете получить исходный код обеих этих программ   -  person David Heffernan    schedule 06.04.2011
comment
Кстати, я ненавижу, что они это делают. Верни мне мою строку заголовка!   -  person Lightness Races in Orbit    schedule 06.04.2011
comment
Только ОС знает, как рисовать ненастроенные элементы строки заголовка (например, Закрыть / Свернуть / Развернуть), которые зависят от версии ОС. - Не обязательно верно. Вы можете определить версию ОС (и тему / цвета ОС) и создать свои собственные кнопки.   -  person Dan Puzey    schedule 06.04.2011
comment
Можно нарисовать кнопки закрытия / ... в точности как нативные, см. Файл nsNativeThemeWin.cpp в mozilla.   -  person Karl von Moor    schedule 06.04.2011
comment
Я бы изучил источник, если бы мне пришлось ... но, честно говоря, мне было только любопытно. В последний раз, когда я пытался посмотреть исходный код огромной программы, я даже не смог найти исходный файл, содержащий то, что я искал. (Пусть начнутся дразнить!)   -  person Qwertie    schedule 06.04.2011
comment
@LightnessRacesinOrbit forum.macrumors.com/posts/21540623   -  person Graham Perrin    schedule 02.07.2015
comment
@GrahamPerrin: Хорошо, спасибо :)   -  person Lightness Races in Orbit    schedule 02.07.2015


Ответы (4)


У Microsoft есть очень подробное объяснение в статье Custom Window Frame Используя DWM.

person Mark Ransom    schedule 07.04.2011
comment
Я предполагаю, что этот ответ в сочетании с разработкой исходного кода FireFox, чтобы узнать, как он работает с WinXP, позволил бы кому-то изменить строку заголовка во всех популярных версиях Windows. - person Qwertie; 11.04.2011

Строка заголовка и граница окна принадлежат неклиентской области (NC) окна. Если вы пишете приложение на основе перекачки сообщений, вы можете предоставить свою собственную логику и внешний вид этой области, используя оконные сообщения WM_NCPAINT и WM_NCHITTEST (как написал Джон).

Хотя эта область довольно умеренно использовалась в предыдущих версиях Windows, Microsoft недавно (по крайней мере, с Vista) начала делать неклиентскую область более привлекательной и многофункциональной.

В современных приложениях довольно часто полностью игнорируется неклиентская область и вместо этого создается окно, которое не имеет строгой границы окна и, таким образом, состоит ТОЛЬКО из клиентской области. При использовании этого метода окно должно иметь собственную реализацию для рисования заголовка окна и кнопок окна (свернуть, развернуть / восстановить и закрыть). Сочетание этой техники с прозрачностью окна позволяет довольно легко создавать захватывающие пользовательские интерфейсы.

Если вы используете WPF, вам очень полезен класс WindowChrome. для этого. Этот класс является частью платформы .NET 4 и доступен как отдельная библиотека для .NET 3.5.

Изменить

Очевидно, кому-то не нравится такой ответ. Для ясности: я не говорю, что именно так это делает Chrome или любое другое приложение. Я говорю, что, как я описал, это осуществимое решение, которое я и компания, в которой я работаю, использовали в нескольких проектах, и я точно знаю, что несколько других приложений используют тот же подход. Возможно, это не лучший вариант, но это, безусловно, способ решить эту проблему! :-)

person Mårten Wikström    schedule 05.04.2011
comment
Я хотел бы добавить что-то в свою неклиентскую область, но Microsoft.Windows.Shell.dll, который должен содержать WindowChrome, не указан в диалоговом окне добавления ссылки VS2010. Есть идеи, где это взять? - person Qwertie; 25.05.2011
comment
@Qwertie Вы можете скачать его здесь. - person Mårten Wikström; 25.05.2011
comment
Важно отметить, что WindowChrome не работает в Windows 7 Basic Theme или в WinXP (IIRC строка заголовка отображается нормально, поэтому кажется, что она находится поверх ваших настроек). Чтобы узнать, доступен ли он, вызовите свойство Microsoft.Windows.Shell.SystemParameters2.Current.IsGlassEnabled - person Qwertie; 19.02.2014

Я слишком ленив, чтобы смотреть на исходники chrome и firefox, чтобы точно узнать, что они сделали, но, скорее всего, они включают настраиваемую обработку для WM_NCPAINT и WM_NCHITTEST. Они могут позволить ОС выполнить базовую раскраску заголовка, а затем наклеить свои собственные части. Альтернативный вариант - выполнить всю отрисовку самостоятельно, включая вызовы API DWM для обработки всех необычных битов. В любом случае, это уродливо пытаться и делать, и если вы не сделаете это правильно, это будет выглядеть и чувствовать себя ужасно.

person Jon    schedule 05.04.2011
comment
Когда-то давным-давно я пытался обрабатывать WM_NCPAINT и WM_NCHITTEST, но ОС иногда закрашивала то, что я рисовал, и это была серьезная проблема, заключающаяся в том, что я не мог найти какой-либо API, который сообщал бы мне местоположение и размер встроенного в элементах (кнопка свертывания, кнопка закрытия и т. д.) - что вам действительно нужно знать, если вы хотите добавить дополнительную кнопку рядом с ними. У тебя лично есть успех с таким подходом, Джон? Также обратите внимание, что Chrome и FF, похоже, увеличивают область заголовка (в частности, размытый эффект прозрачности Windows 7 Aero), есть идеи, как они это делают? - person Qwertie; 06.04.2011
comment
Как отмечалось выше, вам нужно будет просмотреть код Chrome и FF, если вы хотите понять их конкретную реализацию. В прошлом у меня был ограниченный успех с WM_NCPAINT и WM_NCHITTEST, но обычно это было много усилий с чрезвычайно ограниченными вознаграждениями. В общем, я рекомендую оставить эти биты ОС, если у вас нет особых требований сделать иначе. - person Jon; 07.04.2011
comment
@Qwertie: если вы используете WPF, легко увеличить область заголовка с помощью класса WindowChrome. Они называют область, о которой вы говорите, Стеклянная рамка. Просто измените значение свойства GlassFrameThickness . - person Mårten Wikström; 07.04.2011

Возможно, на это тоже стоит обратить внимание: https://github.com/lstratman/.NETTitleBarTabs

и еще одна ссылка: http://www.nuget.org/packages/TitleBarTabs/

Я сам не пробовал и посмотрю, как и насколько хорошо он работает.

person RooiWillie    schedule 04.04.2014