Fleur je winforms controls een beetje op
Op de één of andere manier zijn de listview en treeview sowieso niet 's werelds fijnste controls om mee te werken waardoor ik wel eens ben uitgeweken naar third-party controls die nét even dat beetje extra bieden. Zo is het bij een 'standaard listview' belachelijk lastig om een pijltje in de columnheaders toe te voegen voor een sorteerindicatie en zou je soms willen dat de treeview control meerdere kolommen ondersteunde om maar eens wat te noemen. Althans; dat geldt voor Winforms (2.0) controls; ik ben to be honest nog niet veel (of genoeg) bezig geweest met WPF en/of .Net 3.0+ gezien ik voor mijn werk (voorlopig) nog even aan 2.0 vast zit.Natuurlijk, overal is iets op te maken, alles is aan te passen. Maar vaker wel dan niet brengt dat een boel code met zich mee welke ook nog eens gebruik maakt van een hele berg native calls (ofwel P/Invoke's) om te bereiken wat je wil. Uitwijken naar een 3rd party control die je het werk uit handen neemt is dan een makkelijke keuze. Zo kan ik van harte de (gratis!) Krypton Toolsuite aanraden. Vergeleken met de (in mijn ogen door de jaren heen bloated geworden) Infragistics controls krijg je een flinke zwieper aan de look van je GUI in ruil voor een relatief kleine footprint en een goed werkende control suite. (Overigens gebruiken we het hier veel en hebben daarom toen ook besloten om de auteur eens flink te sponsoren en hebben dus meteen heel de suite inclusief sourcecode aangeschaft). De prijzen van de Krypton onderdelen zijn ook stukken vriendelijker dan de Infragistics/DevExpress varianten.
Ik draaf weer eens van 't paadje
C#:
1 | using System;
|
Je zult al gauw zien dat de 'magic' zit in de SetWindowTheme call. Meer details vind je in de documentatie; daar zal ik niet te ver op in gaan.
Het enige wat je nu nog moet doen is voor iedere control (treeview/listview) welke je wil 'updaten' met de 'moderne' look de SetExplorerTheme method aanroepen. In mijn geval doe ik dat in het Form's Load event:
C#:
1 | NativeMethods.SetExplorerTheme(treeView1);
|
Voila. 2 Controls gestyled. Let in de treeview vooral op de plusjes en minnetjes welke zijn veranderd naar de typerende driehoekjes en in de listview en treeview zie je ook dat er een 'hippe' selectie gebruikt wordt in plaats van de saaie blauwe standaard selectie.Wat ik echter nog beter kan aanbevelen is het afleiden van je eigen controls. Kwestie van de listview/treeview inheriten en vanaf dat moment je eigen control op je forms pleuren in plaats van de standaard controls. Zo profiteer je later nog makkelijker van wijzigingen die je doorvoert in je controls, maar dat hoef ik niemand hopelijk uit te leggen
Ik heb het op deze manier aangepakt:
C#:
1 | //Treeview:
|
Voor de listview doe je natuurlijk hetzelfde. Voor de echte juiste look kun je voor de treeview ook de treelines nog uitschakelen, wat ik zelf overigens niet mooi vind:
C#:
1 | treeView1.ShowLines = false; |
Een andere aanrader is om het font meteen te wijzigen in het (weinig intuïtieve) SystemFonts.IconTitleFont dat je hierboven ook meteen toegepast ziet.
C#:
1 | treeView1.Font = SystemFonts.IconTitleFont;
|
Of natuurlijk in je afgeleide control. Makkelijker kan het haast niet. Be-dee-be-dee-be-dee:
02-'10 OfficeExpert.biz == zakkenwassers
12-'09 In het land der blinden... part 7
Reacties
Terwijl dat jij je nu voordoet als Explorer.
Wat ik daar uit haal (en de voorbeelden online) is juist dat je daarmee aangeeft de "Explorer theme" te willen gebruiken/overnemen. Maak ik 'm null dan haalt de call ook niets uit (zojuist even getest).pszSubAppName
[in] Pointer to a string that contains the application name to use in place of the calling application's name. If this parameter is NULL, the calling application's name is used.
[Reactie gewijzigd op dinsdag 09 februari 2010 14:31]
Hij neemt dan eigelijk de stijl over van die applicatie en applied die op de jouwe.
En de laatste is voor CLSID's. Maar wat is een application's name? Ik heb Firefox geprobeerd, dat doet het niet, Messenger doet ook niets.
[Reactie gewijzigd op dinsdag 09 februari 2010 15:15]
Misschien ook even het vermelden waard dat her-en-der vermeld wordt dat het DoubleBuffered property van het form op true dient te staan; nu gebruiken wij sowieso alleen maar DoubleBuffered (afgeleide) forms dus dat kon wel eens kloppen; ik heb echter in het simpele formpje dat ik voor dit blog gebruikte geen problemen ondervonden zonder double buffering; maar dat zegt niet veel natuurlijk.
[Reactie gewijzigd op dinsdag 09 februari 2010 15:51]
Ik was in het begin bang dat je met een of andere exotische look aan zou komen
Maar ja, ik zou het liefst dan ook nog Windows 2000 draaien
Overigens gaan wij de Janus WinForms kit gebruiken. Heeft ook een Ribbon control en een hele berg andere zaken. Kost alleen wel een paar centen.
Nee hoorIk was in het begin bang dat je met een of andere exotische look aan zou komen
Dat is a) even wennen aan Segoe UI (default Vista/Win7 font) en b) kwestie van het font niet wijzigen als je dat niet mooi vindtIk moet heel eerlijk zeggen dat ik de opgefleurde variant veel minder duidelijk vind dan de default. Vooral de kolom koppen in je listview zijn onduidelijk (kan aan laptop scherm liggen).
Eensch. Maar zie b)Daarbij vind ik het ook bokke irritant als die lijntjes in de treeview verdwijnen.
[Reactie gewijzigd op dinsdag 09 februari 2010 17:08]
code:
1
2
3
4
5
6
| Private Declare Unicode Function SetWindowTheme Lib "uxtheme.dll" (ByVal hWnd As IntPtr, ByVal pszSubAppName As String, ByVal pszSubIdList As String) As Integer
Protected Overrides Sub OnHandleCreated(ByVal e As System.EventArgs)
SetWindowTheme(Me.Handle, "Explorer", Nothing)
MyBase.OnHandleCreated(e)
End Sub |
Visual Basic .NET:
1 | Public Class NativeMethods
|
Dat is NativeMethods in VB.Net
Visual Basic .NET:
1 | Public Class ListViewTest
|
En dat is de WndProc override
[Reactie gewijzigd op woensdag 10 februari 2010 22:04]
Op http://www.microsoft.com/...ClearType/tuner/tune.aspx staat een tunertooltje, misschien is dat ook nog een tip?
Reageren is niet meer mogelijk