Karty na pasku tytułowym: w czym tkwi sekret?

Chrome i Firefox 4, wśród innych aplikacji, teraz umieścić część swojego interfejsu użytkownika w pasku tytułowym. W systemie Windows SYSTEM OPERACYJNY Zwykle kontroluje cały pasek tytułowy. Aplikacja może utworzyć niestandardowy pasek tytułu, usuwając pasek tytułu systemu operacyjnego i rysując zamiast niego "fałszywy" pasek tytułu (jak WinAmp), ale tylko system operacyjny wie, jak narysować niestandardowe elementy paska tytułu (np. Zamknij/Minimalizuj/Maksymalizuj), które różnią się w zależności od wersji systemu operacyjnego.

Według jakiego mechanizmu działają aplikacje Chrome i Firefox "udostępniają" pasek tytułu z systemem operacyjnym (umieść niestandardowe elementy na pasku tytułu, zachowując oryginalny motyw wizualny systemu operacyjnego)?

Tutaj wpisz opis obrazka

w Chrome karty wkraczają na pasek tytułu, dzięki czemu nie ma wystarczającej ilości miejsca na tekst tytułu.

Author: Qwertie, 2011-04-05

4 answers

Microsoft ma bardzo szczegółowe wyjaśnienie w artykule Custom Window Frame Using DWM.

 21
Author: Mark Ransom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-07 21:07:59

Pasek tytułu i obramowanie okna należy do obszaru non-client (NC) okna. Jeśli piszesz aplikację opartą na pompie komunikacyjnej, możesz podać własną logikę i wygląd tego obszaru za pomocą wiadomości okien WM_NCPAINT i WM_NCHITTEST(tak jak napisał Jon).

Chociaż obszar ten był dość umiarkowanie używany w poprzednich wersjach systemu Windows, Microsoft niedawno (przynajmniej od Vista) zaczął uatrakcyjniać obszar inny niż klient i wzbogacać go w funkcje.

In nowoczesne aplikacje dość powszechne jest całkowite ignorowanie obszaru innego niż klient i zamiast tego tworzenie okna, które nie ma ścisłej granicy okna i dlatego składa się tylko z obszaru klienta. Za pomocą tej metody okno musi dostarczyć własną implementację do rysowania tytułu okna i przycisków okna (Minimalizuj, Maksymalizuj/resore i zamknij). Połączenie tej techniki z przezroczystością okien sprawia, że możliwe i dość łatwe tworzenie ekscytujących interfejsów użytkownika.

Jeśli używasz WPF bardzo przydatna do tego celu jest klasa WindowChrome. Klasa ta jest częścią. NET 4 framework i jest dostępna jako oddzielna biblioteka dla. NET 3.5.

Edit

Oczywiście ktoś nie lubi tej odpowiedzi. Żeby było jasne: nie mówię, że w ten sposób robi to Chrome lub inna aplikacja. Mówię, że to, jak to opisałem, jest realnym rozwiązaniem, które ja i firma, dla której pracuję, wykorzystałem w kilku projektach i wiedz na pewno, że kilka innych aplikacji korzysta z tego samego podejścia. Może nie jest to najlepszy sposób, ale z pewnością jest to sposób na to! :-)

 6
Author: Mårten Wikström,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-05 21:57:00

Jestem zbyt leniwy, aby szukać źródeł chrome i firefox, aby dowiedzieć się dokładnie, co zrobili, ale najprawdopodobniej zawiera niestandardową obsługę WM_NCPAINT i WM_NCHITTEST. Mogą pozwolić systemowi na malowanie podstawowego paska tytułowego, a następnie przyklejanie własnych bitów na wierzch. Alternatywą jest wykonanie samego malowania, w tym Wywołanie interfejsu DWM API do obsługi wszystkich fantazyjnych bitów. Tak czy inaczej, to brzydka rzecz, a jeśli nie zrobisz tego dobrze, będzie wyglądać i czuć straszne.

 1
Author: Jon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-05 21:12:20

Być może warto również na to spojrzeć: https://github.com/lstratman/.NETTitleBarTabs

I jeszcze jeden link: http://www.nuget.org/packages/TitleBarTabs/

Sam tego nie próbowałem i przyjrzę się temu, aby zobaczyć, jak i jak dobrze to działa.

 0
Author: RooiWillie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-04 09:38:26