Laden...

Design von Steuerelementen

Letzter Beitrag vor 19 Jahren 8 Posts 2.881 Views
Design von Steuerelementen

Hallo,

gibt es irgendwo ein Tuturial für das Design von Steuerelementen. Damit meine ich jetzt nicht neue Steuerelemente programmieren, sondern einfach das Aussehen von den vorhandenen Steuerelementen zu ändern. Also quasi neue "Skins" für die vorhandenen Steuerelemente ähnlich Winamp Skins zu erstellen..

Grüße Chris

Hallo zervantis,

mit einem Tutorial kann ich nicht dienen. Dafür mit einigen grundsätzlichen Überlegungen:

Was die Farben angeht, benutzen Controls zunächst keine festen Farben wie Colors.Black, sondern Systemfarben wie SystemColors.WindowText. Diese Systemfarben kann man unter 'Eigenschaften von Anzeige'/'Reiter Darstellung' ändern. Dies hat den Vorteil, dass z.B. auch Sehbehinderte Windows nutzen können, indem sie dort Schemen mit starken Kontrasten oder inverser Darstellung wählen.

Natürlich kann man die Farben von Controls auch auf feste Farben setzen, sollte dann aber aufpassen, dass man das auch für alle Farben des Controls macht, damit beim Umstellen der Systemfarben keine merkwürdigen Effekte auftreten.

Was die Farbauswahl selbst angeht, gibt es div. Anleitungen im Web, z.B. unter http://metacolor.de/ über die c't schreibt: "Dort finden sich [...] - teilweise sehr tiefgreifende - Betrachtungen zum Thema Farbwahl, nach deren Lektüre man sich bestimmt nie wieder traut, einfach 'irgendwelche' Farben auszuprobieren".

Für Schriftarten gibt quasi dasselbe wie für Farben. Insbesondere durch das Festlegen der Schriftgröße, kann man sich u.U. schnell Feinde machen.

Weiterhin kann man das Aussehen einiger Controls durch Styles verändern, z.B. von TextBoxen durch 'BorderStyle = BorderStyle.FixedSingle'.

Und zum Schluß gibt es die Möglichkeit, bei einigen Controls Teile selbst zu zeichen, z.B. bei ListBoxen die eigentlichen Einträge mit 'DrawMode = DrawMode.OwnerDrawFixed'.

Das ist vielleicht schon mal ein erster Einstieg.

HTH

herbivore

Hi zervantis,

eine einfache Methode ist über eine foreach Schleife this.Controls im Form durchzugehen und z.B. alle ForeColors auf blue zu setzen á la:


public Form1()
{
			//
			// Required for Windows Form Designer support
			//
			InitializeComponent();

			foreach(Control ctrl in this.Controls)
			{
				ctrl.ForeColor = Color.Blue;
                                ctrl.Paint += new PaintEventHandler(paintit)
			}
                        //zus. können auch die Paint/OnDraw events. etc. umgeleitet werden.
                        
}

public void Paint(object sender, PaintEventArgs evt)
{
       //override Paint Method
}

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

Der richtige Ansatz ist leider etwas komplizierter,

mittels einer PreFilterMessage oder WindowsHook müssen die Controls, soweit ich jetzt in Erfahrung gebracht habe, selbst neu kreiert oder gezeichnet werden, dann kann
sogar zur Laufzeit ein Skin zu einer Applikation hinzugefügt werden.


	public class MessageFilter : IMessageFilter
	{
		public enum WinAPI_WM
		{
			WM_NCCALCSIZE = 0x0083,
			WM_NCHITTEST = 0x0084,
			WM_NCLBUTTONDOWN = 0x00A1,
			WM_NCLBUTTONUP = 0x00A2,
			WM_NCMOUSEMOVE = 0x00A0,
			WM_NCPAINT = 0x0085,
			WM_NCRBUTTONUP = 0x00A5,
			WM_NCRBUTTONDOWN = 0x00A4,
			WM_NCMBUTTONDOWN = 0x00A7,
			WM_NCMBUTTONUP = 0x00A8,
			WM_LBUTTONDOWN = 0x0201,
			WM_MOUSEMOVE = 0x0200,
			WM_LBUTTONUP = 0x202,
			WM_RBUTTONDOWN = 0x204,
			WM_RBUTTONUP = 0x205,
			WM_MBUTTONUP = 520,
			WM_MBUTTONDOWN = 0x207,
			WM_CREATE = 0x0001,
			WM_NULL = 0x0000
		}
		//return true when the message shoud be eaten. ;-)
		public bool PreFilterMessage(ref Message m)
		{
	        }
}

mit diesem Filter können dann die Nachrichten abgefangen werden und selbst verarbeitet werden, bevor das Fenster das macht.

In der Form muss dann


MessageFilter mobjMessageFilter = new 
static void Main() 
{
         Application.AddMessageFilter(mobjMessageFilter);
	Application.Run(new Form1());
	Application.RemoveMessageFilter(mobjMessageFilter);
}

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

Hallo dr4g0n76,

ob ein Ansatz, der auf Win32-Spezifika zurückgreift richtiger ist als einer der mit reinen .NET-Mitteln auskommt und damit z.B. portabel ist, möchte ich mindestens in Frage stellen.

herbivore

XP Skins

Du kannst Deine .NET 1.0 & 1.1 Oberflächen mit XP Skins versehen.

Hier steht, wie das geht:

Using Windows XP Visual Styles With Controls on Windows Forms

Wenn Dir die Standard Skins zu langweilig sind, kannst Du auf diverse "Desktop Modding Tools" zurückgreifen. Aber vorsicht! Einige von diesen Tools machen riskante Kernel Patches und bereiten besonders bei XP mit Service Pack 2 Probleme.

.NET 2.0 hat die XP Skins standardmäßig eingebaut.

Ansonsten kannst Du von den Original-Controls ableiten und nur die Zeichen-Routinen überschreiben. Das ist einfacher und für nicht ganz C feste Leute auch wesentlich stabiler als Win32-API-Hooks. Außerdem macht es viel weniger Arbeit und GDI+ (System.Drawing) hat mächtige Grafik Funktionen (z.B. Transparenz, Farbverläufe etc.).

@herbivore:

Tut mir leid Dich enttäuschen zu müssen.

http://www.mycsharp.de/wbb2/attachment.php?attachmentid=378

sieh dir mal dazu das an.
wenn Du die DLL registrierst über RegSvr32.exe DllName kannst du Dir mal ein Skin-Form ansehen, das sich in bel. VisualC++ Forms integrieren läßt...

Wenn man bei George Shepherds Windows Forms FAQ nachsieht, sieht man das sich vieles leider nur über die API lösen läßt, das weiss ich auch aus eigener Berufserfahrung (Entwicklung eines ActiveX Bildanzeige/Druckelements als es das noch nicht aus der .NET-Sammlung usw. gab).

Und ausserdem wird das FAQ für manche Lösungen selbst im MSDN nicht nur erwähnt oder empfohlen sondern statt einer Erkläung im MSDN wird einfach auf das FAQ verwiesen, um zu erklären wie man z.B. eine 1Pixel breite Border in der Nonclient-Area eines Fensters zeichnet (Fensterrand oder Titelleiste).

Für den der es nicht kennt oder glaubt hier das FAQ:

George Shepherds FAQ

Das FAQ ist übrigens sehr interessant und damit läßt sich vieles lösen.
z.B. ins SystemMenü einklinken,

Verweis im MSDN auf eben dieses FAQ:
MSDN Verweis Shepherds Windows Form FAQ

Portable Skins würde ich bisher nur für Java unterschreiben. Und selbst da ist es nicht überall möglich.

Wer SkinCrafter oder andere SkinPlugins für Windows kennt oder WindowBlinds oder StyleXP, die sich sogar systemweit einklinken, weiss das es nicht mit Bordmitteln von
.NET geht. Aber wir machen ja später sowieso eine DLL draus.

In der Komponenten-Sammlung .NET unter Skins habe ich übrigens eine Ready-To-Use Lösung vorgestellt die zu 100% Deinem Willen trotzdem entspricht.

Sogar das Benutzen der Klasse MessageFilter ist ein Standard-Bordmittel von .NET
Nur wird sich damit eben nicht lösen lassen, dass z.B. der FileRequester auch so aussieht, wie es z.B. SkinCrafter macht...

Ich hoffe das hat jetzt nicht verletzend geklungen Soll ja nur informativ sein.

Und ich muss mal sagen ich kenne das Forum jetzt erst seit ein paar Tagen und finde es toll. Wir können alle noch viel voneinander lernen. 🙂

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

@Rainbird: das ist so IMHO falsch.

Was hier vorgestellt wird ist nur, wie man den allgemeinen Look des aktuell eingestellten Window-Themes in der Anwendung aktiviert.

Klar, das sieht auch schon besser aus.

Dazu muss man ja nur die Manifest-Datei in den Debug/Release kopieren,
das Name Attribut auf den Exe-Namen (aber ohne .Exe ändern) und die Controls bei denen das erscheinen soll auf Style System stellen.
Und da fängts dann schon an: Was machen bei Controls die keine Styles-Eigenschaften unterstützen? Dann müßte man schon wieder OwnerDrawn weiter machen (Paint-Event überschreiben o. ä.) und Controls ableiten. Und dann wenn man ein anderes Control benutzt? Sackgasse...

Skins gehen etwas weiter, sieh Dir mal SkinCrafter oder StyleXP an, da werden auch die Titelleisten richtig dekoriert und alle Buttons haben grafische Verläufe. Oder die Slider... auch Grafiken.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.