GUI-Entwicklung 1: Windows Forms Proseminar Objektorientiertes Programmieren mit.net und C# Johannes Faltermeier Institut für Informatik Software & Systems Engineering
Agenda Einführung Grundlagen: GUI-Entwicklung mit Visual Studio und Windows Forms Grundaufbau eines Projekts Steuerelemente Eventhandler Mehrere Fenster nichtmodale/modale Fenster MDI-Anwendungen Zukunft von Windows Forms 14.12.10 GUI-Entwicklung 1: Windows Forms 2
Einführung: Windows Forms? Programmierschnittstelle für GUI-Entwicklung Eingeführt mit.net 1.0 Komponenten entsprechen bereits vorhandenen Win32-Pendants Namensraum System.Windows.Forms Seit.NET 3.0 Konkurrenz durch WPF Durch MONO-Projekt auch unter Linux, MAC OS 10 verfügbar 14.12.10 GUI-Entwicklung 1: Windows Forms 3
Visual Studio-Designer 14.12.10 GUI-Entwicklung 1: Windows Forms 4
Grundaufbau eines Projekts Program.cs Einstiegspunkt mit Main-Methode static void Main() Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); Form1.Designer.cs Enthält Oberflächendefinition private void InitializeComponent() //Oberflächendefinitionen Form1.cs Enthält Eventhandler Ruft im Konstruktor InitializeComponent() auf partial class Form1 Hilft computergenerierten von selbstgeschriebenem Code zu trennen 14.12.10 GUI-Entwicklung 1: Windows Forms 5
Grundaufbau (Fortsetzung) AssemblyInfo.cs Build-Informationen wie Titel oder Version Resources.resx/Resources.Designer.cs.resx enthält Definitionen von Ressourcen (z.b. Strings).Designer.cs vereinfacht späteren Zugriff Properties.Resources.BuchInfo Settings.settings/Settings.Designer.cs/Settings.cs.settings für Verwaltung der Programmeinstellungen (z.b. Farbeinstellungen).Designer.cs vereinfacht späteren Zugriff.cs Properties.Settings.Default.Hintergrundfarbe Enthält Eventhandler um auf Laden, Ändern, Speichern zu reagieren 14.12.10 GUI-Entwicklung 1: Windows Forms 6
Wichtige Steuerelemente: Überblick Funktion Textverarbeitung Informationsanzeige Auswahl aus Liste Grafikanzeige Dialog Menüs Befehle Container Datenanzeige Datumseinstellung Steuerelement(e) TextBox, RichTextBox, MaskedTextBox Label, LinkLabel, StatusStrip, ProgressBar CheckedListBox, ComboBox PictureBox OpenFileDialog, SaveFileDialog, FolderBrowserDialog MenuStrip, ContextMenuStrip Button Panel, SplitContainer, TableLayoutPanel, FlowLayoutPanel DataGriedView DateTimePicker 14.12.10 GUI-Entwicklung 1: Windows Forms 7
Anordnung in Containern SplitContainer Zwei Panels, die duch Balken getrennt sind FlowLayoutPanel Ordnet Elemente dynamisch in horizontaler oder vertikaler Richtung aus TableLayoutPanel Layout in Tabellenstruktur 14.12.10 GUI-Entwicklung 1: Windows Forms 8
Allgemeine Eigenschaften (Auswahl) Property BackColor BorderStyle Cursor ContextMenuStrip Enabled Font ForeColor Location Locked Name TabIndex Text Visible Erklärung Hintergrundfarbe Rahmenart Cursor über Steuerelement Menü, welches bei Rechtklick angezeigt wird aktiviert/nicht aktiviert Schriftattribute, nicht nur -art Vordergrund- bzw. Zeichenfarbe Position linke obere Ecke Sperren gegen Veränderungen Bezeichner Tabreihenfolge Inhalt/Beschriftung (un-)sichtbar 14.12.10 GUI-Entwicklung 1: Windows Forms 9
Weitere Eigenschaften: Dock und Anchor Dock bindet Element an Außenkanten oder an verbleibende Fläche der übergeordneten Komponente 14.12.10 GUI-Entwicklung 1: Windows Forms 10
Weitere Eigenschaften: Dock und Anchor (Fortsetzung) Anchor richtet das Element relativ zu den Außenkanten der übergeordneten Komponente aus 14.12.10 GUI-Entwicklung 1: Windows Forms 11
Nützliche Methoden (Auswahl) Methode Contains DoDragDrop FindForm Focus GetContainerControl GetType Hide/Show Scale SetBounds Erklärung Prüft, ob Steuerelement dem aktuellen untergeordnet ist Startet eine Drag & Drop-Operation Bietet Zugriff auf übergeordnetes Formular Fokusiert das Element Bietet Zugriff auf übergeordnetes Steuerelement Ruft Typ des Steuerelements ab Steuerelement verbergen/anzeigen Skaliert das Steuerelement Setzt Größe des Steuerelements 14.12.10 GUI-Entwicklung 1: Windows Forms 12
Steuerelemente zur Laufzeit erzeugen Kann in manchen Situationen sinnvoll bzw. einfacher als mit Designer sein Button b = new Button(); //Eigenschaften zuweisen this.controls.add(b); Button[] buttons = new Button[3]; for (int i = 0; i < 3; i++) buttons[i] = new Button(); //Eigenschaften zuweisen this.controls.addrange(buttons); 14.12.10 GUI-Entwicklung 1: Windows Forms 13
Eventhandler Beispiel: private void button_click(object sender, EventArgs e) sender ist das Objekt, welches das Ereignis ausgelöst hat Über Cast Zugriff möglich if (sender is Button) (sender as Button).Text = "OK"; e ist vom Ereignis abhängig, z.b. enthält das KeyPress-Ereignis das gedrückte Zeichen Muss beim Objekt registriert werden: this.button.click += new System.EventHandler(this.button_Click) 14.12.10 GUI-Entwicklung 1: Windows Forms 14
Eventhandler (Fortsetzung) Beispiel Hangman: Zeichen aus Textbox auf Klick auslesen und auswerten Im Designer Doppelklick auf Button private void button_click(object sender, EventArgs e) if (gamestarted) cur = textbox.text; textbox.text = ""; evaluate(); //wertet Benutzereingabe aus 14.12.10 GUI-Entwicklung 1: Windows Forms 15
Nichtmodale/modale Fenster Beispiel Hangman: zweites Formular anzeigen //nichtmodal private void neutoolstripmenuitem_click(object sender, EventArgs e) Form2 input_form = new Form2(); input_form.show(); //modal private void neutoolstripmenuitem_click(object sender, EventArgs e) Form2 input_dialog = new Form2(); input_dialog.showdialog(); 14.12.10 GUI-Entwicklung 1: Windows Forms 16
Modale Fenster (Fortsetzung) ShowDialog() hat Rückgabewert DialogResult DialogResult Abort Cancel Ignore No None OK Retry Yes public Form2() InitializeComponent(); button1.dialogresult = DialogResult.OK; public Form2() InitializeComponent(); DialogResult = DialogResult.OK; //Spiel - > Neu private void neutoolstripmenuitem_click(object sender, EventArgs e) resetgame(); //Spiel zurücksetzen if (input_dialog.showdialog() == DialogResult.OK) //Spiel starten 14.12.10 GUI-Entwicklung 1: Windows Forms 17
MDI-Anwendungen Hauptfenster Eigenschaft IsMdiContainer auf true setzen Wenn Hauptfenster Steuerelemente enthält mit Dock an Außenkanten binden 14.12.10 GUI-Entwicklung 1: Windows Forms 18
MDI-Anwendungen (Fortsetzung) Kindfenster MdiParent-Eigenschaft setzen public partial class Form1 : Form public Form1() InitializeComponent(); //Datei - > Neu private void neutoolstripmenuitem_click(object sender, EventArgs e) Form f2 = new Form2(); f2.mdiparent = this; f2.show(); 14.12.10 GUI-Entwicklung 1: Windows Forms 19
MDI-Anwendungen (Fortsetzung) Anordnen der Kindfenster über LayoutMdi-Methode des Hauptfensters MdiLayout. ArrangeIcons Cascade TileHorizontal Zugriff auf Kindfenster TileVertical alle: über MdiChildren-Collection des Hauptfensters aktives: ActiveMdiChild ist nur Objekt vom Typ Form Cast private void button1_click(object sender, EventArgs e) if (this.activemdichild!= null) if (this.activemdichild is Form2) (this.activemdichild as Form2).label1.Text = "Ich bin aktiv"; 14.12.10 GUI-Entwicklung 1: Windows Forms 20
Zukunft von Windows Forms Wird von Microsoft nicht mehr weiterentwickelt und für eigene Projekte nicht mehr verwendet. Stattdessen WPF WPF-Vortrag Trotzdem noch sehr beliebt bei Datenbankanwendungen (z.b. Geschäftsprozessanwendungen) nur kurz- bis mittelfristige Lösung 14.12.10 GUI-Entwicklung 1: Windows Forms 21