windows - faner i titellinjen: hvad er hemmeligheden?

Indlæg af Hanne Mølgaard Plasc

Problem



Chrome og Firefox 4, blandt andet, sætter nu nogle af deres brugergrænseflade i titellinjen. I Windows styrer OS normalt hele titellinjen. En applikation kan oprette en brugerdefineret titellinje ved at fjerne OS-titellinjen og tegne en 'falsk' titellinje i stedet (som WinAmp), men kun OS kan vide, hvordan man tegner de ikke-tilpassede elementer i titellinjen (f.eks. Luk/minimer/Maksimer), som varierer efter OS version.


Med hvilken mekanisme 'kan' apps som Chrome og Firefox 'dele' titellinjen med operativsystemet (sæt brugerdefinerede elementer i titellinjen, mens du beholder det originale OS visuelle tema)?


Indtast billedbeskrivelse her


I Chrome påvirker fanerne titellinjen, så der ikke er plads nok til titeltekst.

Bedste reference


Microsoft har en meget detaljeret forklaring i artiklen Custom Window Frame ved hjælp af DWM. [1]

Andre referencer 1


Titellinjen og vindueskanten tilhører vinduets ikke-klientområde (NC). Hvis du skriver en beskedpumpebaseret applikation, kan du give din egen logik og udseende af dette område ved hjælp af WM\_NCPAINT og WM\_NCHITTEST vinduemeddelelser (ligesom Jon skrev).


Selvom dette område er blevet ret moderat anvendt i tidligere Windows-versioner, har Microsoft for nylig (i hvert fald siden Vista) begyndt at gøre det ikke-klientområde mere attraktivt og funktionelt.


I moderne applikationer er det ret almindeligt at ignorere ikke-klientområdet og i stedet skabe et vindue, der ikke har en streng vindueskrænse og således består af KUN et klientområde. Med denne metode skal vinduet sørge for dets egen implementering for at tegne vinduetitel og vindueknapper (minimere, maksimere/genoprette og lukke). Kombinering af denne teknik med vinduesgennemsigtighed gør det muligt og nemt at oprette spændende brugergrænseflader.


Hvis du bruger WPF, kan du finde WindowChrome-klassen meget nyttig til dette formål. Denne klasse er en del af .NET 4-rammen og tilgængelig som et separat bibliotek til .NET 3.5. [2] [3]


Rediger


Det er klart, at nogen ikke kan lide dette svar. Bare for at være klar: Jeg siger ikke, at det er sådan, Chrome eller en anden applikation gør det. Jeg siger, at det jeg har beskrevet det er en gennemførlig løsning, som jeg og det firma jeg arbejder for har brugt i flere projekter og jeg ved for en kendsgerning, at flere andre applikationer bruger den samme tilgang. Det er måske ikke det bedste, men det er bestemt en måde at gå om det! :-)

Andre referencer 2


Jeg er for doven til at kigge på Chrome og Firefoxs kilde for at finde ud af, hvad de gjorde, men det omfatter sandsynligvis brugerdefineret håndtering til WM\_NCPAINT og WM\_NCHITTEST. De kan tillade OS at gøre det grundlæggende titellinjen maleri, og derefter holde deres egne bits på toppen. Alternativet er at gøre alt maleriet selv, inklusiv opkald til DWM api til at håndtere alle de fancy bits. Uanset hvad, det er en grim ting at forsøge at gøre, og hvis du ikke gør det helt rigtigt, vil det se og føle sig forfærdeligt.

Andre referencer 3


Måske er det også værd at se på:
https://github.com/lstratman/.NETTitleBarTabs[4]


og et andet link:
http://www.nuget.org/packages/TitleBarTabs/[5]


Jeg har ikke prøvet det selv, og vil undersøge det for at se, hvordan og hvor godt det virker.