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

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

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

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

4 ответа

У Microsoft есть очень подробное объяснение в статье Пользовательский кадр окна с использованием DWM.


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

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

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

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

Edit

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


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


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

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

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

licensed under cc by-sa 3.0 with attribution.