da ich die Idee von Thorsten1983 interessant fand eine Open source UtilitiesLib zu schreiben (siehe Eure Meinung zu : UtilitiesLib), möchte ich an dieser Idee weiter mitwirken.
Hierzu möchte ich im ersten Schritt folgende Punkte realisieren:
- Global Skinning Komponente für Controls
Eine Windowskomponente die sich auf bestehende Controls einklinkt und deren Nonclient wie Clientbereich anpasst. Das ganze wird dann über ein im Designer integriertes Tool zu steuern sein.
- Widgets
Windows Forms ähnliche Fenster die sich anhand eines DockingControls auf einer Form wie MDI's ausrichten und einrastern.
- DockingControler
Die Controler Componente für die Darstellung des Einrasterns der Widgets.
- Hooks -> darunter Fallen Mouse und keyboardevents wie Hotkeys
Globale Maus und Tastaturabfragen werden als Events anhand von Komponenten dem Programmierer zur Verfügung gestellt um z.B. auch über den Designer Events zu binden.
Stand: 13.05.08
So, zwar bin ich noch lange nicht fertig und den ein oder anderen Fehler gibt es noch aber ich denke aus dem Projekt wird klar wohin die Reise gehen soll.
Für was ist dieses Projekt da?
Prinzipiell geht es weniger bei dem Projekt darum „eine absolut fertige" Lösung anzubieten, als den Weg aufzuzeigen wie man die verschiedensten Controls und Designermethoden verwenden oder umgestalltet kann anhand der Windows API.
Was ist bisher drinnen?
- Skinning von Forms
- Systemweiter Mouse Hook
- Systemweiter Keyboard Hook
- Systemweiter HotKey Hook
- Widgets
Hinweise:
- Zuerst das Projekt einmal Kompalieren oder neu erstellen.
- Im Designermode wird nicht immer das Repaint erfolgreich ausgeführt
- Es werden derzeit noch keine Controls unterstützt ausser Forms
- Es werden nur Forms in die Liste vom skinning aufgenommen die unter der Kategorie "Skin" den Wert "UseSkin = true" haben.
Designerunterstützung
- Es gibt eine Designerunterstützung fürs global Skinning
Hierfür einfach auf die SkinForms Komponente klicken und dort unter der Kategorie "Sonstiges" und auf dien ComboBox Button bei "Skin" klicken.
- Es gibt eine Designerunterstützung für jedes einzelne Form
Hierfür einfach das Formular anklicken unter der Kategorie "Skin" und auf den ComboBox Button bei "Border" klicken. Man kann dort aber auch manuell die Properties ändern. Das ändern von global Skins erfolgt auf allen Formularen.
Was bedeutet global Skinning?
Hierfür wird an jedes Formular (später auch Controls) ein Event gesendet das die aktuelle Ansicht zur Designerlaufzeit überschreibt, das geht allerdings nur wenn dafür die Designerunterstützung benutzt wird. Sinn und Zweck des ganzen ist das wenn jedes Formular diesen Skin als Information selbst speichert, man für vielleicht ein Form das anders aussehen soll als alle anderen man dieses wiederum verändern kann durch die Designerunterstützung für nur dieses Form - vielleicht ändere ich hier das ganze auch noch über Resourcen.
Was für Skins gibt es bisher?
Leider bin ich kein großer Pinsler und Maler, somit gibt es nur einen Skin namens Blue von mir. Wer möchte kann aber gerne über das Skin Blue Beispiel eigene Skins hinzufügen. Allerdings, wird das ganze nochmals bearbeitet.
Warum Border Top und Border Teaser?
Border Teaser erlaubt es ein Bild zusätzlich als "Titelbild" zu implementieren und wird grundsätzlich vor BorderTop gezeichnet. Somit kann man links mittig oder rechtsbündig zusätzlich ein Bild in der Titelleiste anzeigen, z.B. ein Wasserzeichen mit den Firmenlogo darauf.
Warum Border Hittest?
Der Borderhittest gibt das Verhalten der Border zurück. Man kann somit das Sizen an jeder Beliebigen Border verhindern oder anstattdessen andere aktionen auslösen. Ebenso kann man den Offset beinflussen inwieweit man mit der Maus den Rand anklicken kann.
Warum UseWindowTheme?
Möchte man das aktuelle Windows Theme aktiviert lassen, so kann man dies pro Windows Form einstellen. Kanten können somit auch bei Varbverläufen abgeflacht werden, allerdings muss man hierbei die Größenporportionen manuell beachten.
Was ist MouseHook?
Eine Komponente mit Designerunterstützung die folgende Mausnachrichten Systemweit abfängt und in einem MouseEvent wiedergibt:
- MouseDown
- MouseUp
- MouseWheel
- MouseMove
Was ist KeboardHook?
Im Prinzip das selbe wie Mousehook nur für Tastatureingaben:
- KeyDown
- KeyUp
Was ist HotKey?
HotKey ist eine Komponente welche es erlaubt Tastenkombinationen auf Controls zu legen, welche beim auslösen ein Event schmeißt.
Hierzu ein kleiner Hinweis: Leider habe ich es noch nicht geschafft den Designersupport dafür umzusetzen. Wer also die Komponente nutzen möchte, zieht sie ganz normal auf das Form und spricht die Komponente im Code noch manuell an. Es bringt daher noch nichts in der Auflistung auf dem Propertygrid HotKeys hinzuzufügen. Dieser Fehler wird allerdings noch behoben.
Was ist ein Widget?
Ein Windows Widget ist ein Fenster im Fenster, das sich an dem Parentfenster orientiert. Das bedeutet im Klartext, das anhand der Position des Fensters ermessen wird ob das Fenster in eine gewisse logische Richtung verschoben werden darf. Ein Widget kann wiederum Widget's beinhalten usw.
Gibt es das Widget auch in bunt?
Man kann es genauso wie die SkinForms selbst bemalen wie man Lust und Laune hat und so ziemlich sämtliche Eigenschaften beeinflussen. Und man kann es mit SkinForms sogar mit den globalen Skinning bemalen.
Kann ich auf mein Widget Controls adden?
Ähnlich wie auf ein Panel positioniert man seine Elemente darauf und kann diese bearbeiten.
Wie siehts mit der Positionierung zur Laufzeit aus?
Wenn die Eigenschaft AutoIntelligence auf true gesetzt ist so passt sich das Widget an seinem Dockingverhallten an. Wenn diese Eigenschaft auf false gestellt ist, kann man das Widget wie im MDI hin und her bewegen – der Effekt tritt auch dann auf wenn das Widget auf DockingStyle.None gestellt ist.
Was fehlt den Widget's noch?
Für das Docking verhallten erstelle ich noch ein DockingControl das bei AutoIntelligence false dafür verantwortlich ist, dass Widget beim ziehen automatisch an der gewünschten Possition zur Laufzeit einzurasten.
Ansonsten, wünsche ich viel Spaß beim rumprobieren :-)