Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode...

34
3 Mit Windows Forms arbeiten

Transcript of Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode...

Page 1: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

3

Mit Windows Forms arbeiten

Page 2: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

Mit Windows Forms arbeiten

78

An den ersten zwei Tagen haben Sie eine ganze Menge über die Funktionsweise von Win-dows Forms-Anwendungen gelernt. Sie können jeden ihrer Bestandteile identifizieren undbeschreiben, wissen, wie er mit .NET zusammenarbeitet, und Sie können auf die Verwen-dung derjenigen Teile schließen, die Ihnen noch unbekannt sind.

Da Sie nun über das Grundlagenwissen verfügen, um Windows Forms zu erstellen, ist esan der Zeit, mehr ins Detail zu gehen. Die heutige Lektion konzentriert sich auf alleAspekte des Objekts System.Windows.Forms.Form und zeigt Ihnen die Vielfalt an Möglich-keiten, mit denen Sie Ihre Anwendungen anpassen können.

Heute lernen Sie,

� wie man das Object-Objekt verwendet,

� in welcher Weise Sie Layout und Aussehen eines Formulars steuern,

� wie man Interaktion in Formularen kontrolliert,

� was die Nachrichtenschleife ist und wie sie mit der CLR zusammenarbeitet,

� wie Sie mit Tastatur- und Mauseingaben umgehen,

� auf welche Weise man Formulare veranlasst, mit Drag & Drop zu arbeiten.

3.1 Das objektorientierte Windows-Formular

Nun sollten Sie langsam anfangen, sich Ihre Formulare als Objekte vorzustellen. StellenSie sich das Windows -Formular auf Ihrem Bildschirm als ein echtes Fenster in IhremHaus vor. Sie können die Farbe des Fensters (bzw. seines Rahmens) und seine Transpa-renz ändern, den Typ der Handgriffe und des Glases sowie die Vorhänge usw. Sie könnenpraktisch alles, was Ihnen einfällt, mit Ihrem Fenster anstellen (vorausgesetzt, Sie verfügenüber die entsprechenden Mittel).

Das Gleiche gilt auch für Windows Forms. Aus der gestrigen Lektion wissen Sie, dass Siedie Titelzeile und die Größe eines Formulars ändern können. Das trifft auch auf die Titel-leiste zu wie auch auf die Anordnung der Objekte im Formular, die Farbe, Transparenzund Sichtbarkeit, die Umrisslinien, die Schaltflächen usw. In Abbildung 3.1 sehen Sie nurein paar der Layouts, die Ihr Formular annehmen kann.

Daher ist es hilfreich, sich Windows Forms als generische Objekte vorzustellen, die sich injeder gewünschten Weise bearbeiten und anpassen lassen. Sie können quasi in den»Laden« der .NET-Klassenbibliothek gehen und sich ein Form-Objekt heraussuchen. Dannschneiden Sie es sich nach Ihren Wünschen zu.

Page 3: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

79

Das objektorientierte Windows-Formular

Mit dem Objekt Object arbeiten

An den Tagen 1 und 2 haben Sie mit ein paar Objekten gearbeitet, aber Sie haben nochnicht das Objekt Object untersucht, die Basisklasse aller .NET-Klassen einschließlich derWindows Forms-Formulare. Da es von jeder Klasse geerbt wird, werden Sie von jetzt abdamit umgehen, und so ist es ratsam, ein wenig mehr darüber zu erfahren, insbesondereüber die Methoden, die es Ihnen zur Verfügung stellt.

Object ist die allgemeinste Klasse, die Sie in .NET verwenden können. Daher wird sie ver-wendet, um jedes ansonsten unbekannte Objekt darzustellen. Wenn Sie beispielsweise fol-gendes Statement zum Erzeugen einer Variablen verwenden, weiß die CLR nicht, alswelchen Typ sie sie erzeugen soll, und erzeugt lediglich ein Object:

Dim MyObjectVariable

Weil Ihre Variable nur ein Objekt ist, verlieren Sie eine Menge Funktionalität, die Siedurch das Deklarieren eines expliziten Datentyps gewinnen würden. So könnten Sie etwaeinem Integer einen weiteren Integer hinzufügen, aber Sie können keine Objects aneinan-der hängen; ungeachtet Ihrer guten Absicht würde dies zu einer Fehlermeldung führen.Daher empfiehlt es sich, stets einen spezifischen Typ anzugeben, statt ein Object als Mäd-chen für alles zu verwenden.

Standardmäßig müssen Ihre Anwendungen stets einen Typ für Ihre Variablendeklarieren. Das verhindert den falschen Einsatz der Variablen und verbessert dasLeistungsverhalten. Sie können aber diese Sicherheitsfunktion durch Deaktivie-ren des Merkmals Option Strict abschalten. Um Näheres darüber zu erfahren,lesen Sie bitte in Tag 2 den Abschnitt »Das Kompilieren von Windows Forms«.

Abbildung 3.1: Formulare können transparent, rahmenlos und skalierbar sein.

Page 4: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

Mit Windows Forms arbeiten

80

Sie werden in der Windows Forms-Programmierung viele Funktionen kennen lernen, diefür Sie Objekte erzeugen. So ruft etwa die Methode ConfigurationSettings.GetConfigKonfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen DatentypObject, weil sie nicht genau weiß, was Sie mit den zurückgegebenen Ergebnissen machenwerden. Wird aber ein Object geliefert, können Sie die Ergebnisse durch Typumwandlung(Casting) in jeden gewünschten Datentyp transformieren. In C# wandeln Sie den Typeiner Variablen folgendermaßen um:

myDataType myVariable; // Variable vom Typ myDataType deklarierenmyVariable = (myDataType) ConfigurationSettings.GetConfig ("some setting"); // Einstellungen abrufen und in myDataType umwandeln

Das Objekt Object verfügt über fünf Hauptmethoden: Equals, ReferenceEquals, GetHash-Code, GetType und ToString. Sie sind allesamt nützlich, daher wollen wir sie im Detailbetrachten. Denken Sie daran, dass jedes Objekt von Object erbt, so dass diese Methodenjedem Objekt, das Sie verwenden, zur Verfügung stehen.

Die Equals-Methode ist sowohl ein statisches als auch ein nicht-statisches Element. Siekönnen sie daher sowohl von einer bestimmten Objektinstanz aus als auch vom Typ Objectselbst aus aufrufen. Listing 3.1 zeigt beispielsweise ein Codefragment, in dem sowohl stati-sche als auch nicht-statische Versionen der Equals-Methode verwendet werden.

Listing 3.1: Der Gebrauch der Equals-Methode

1: int intA;2: int intB;3:4: intA = 4;5: intB = 5;6:7: Console.WriteLine("{0}", intA.Equals(intB)); // nicht-statische Methode8: Console.WriteLine("{0}", ObjectEquals(intA, intB)); // statische Methode

Die Zeilen 7 und 9 geben beide »false« in der Befehlszeile aus, weil die ObjekteintA und intB nicht gleich sind (intA ist 4, und intB ist 5). Zeile 7 ruft jedoch dieEquals-Methode von einer Instanz aus auf, während Zeile 9 Equals von derObject-Klasse selbst aus aufruft. Sehr häufig werden Sie zwei Objekte miteinan-der vergleichen müssen, so dass sich diese Methode als nützlich erweisen dürfte.

Die Console.WriteLine-Methode gibt eine Zeichenfolge in der Befehlszeile aus.Der erste Parameter besteht in der auszugebenden Zeichenfolge. Eine Zahl inKlammern bedeutet, dass die Methode auf einen der zusätzlich angegebenenParameter verweisen sollte: {0} bedeutet also »Gib den nächsten Parameter aus«,{1} bedeutet »Gib den darauf folgenden Parameter aus« usw. Man könnte anstelleder numerischen Bezeichner auch einfach den Parameter selbst verwenden.

Page 5: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

81

Das objektorientierte Windows-Formular

Um diese Methode verwenden zu können, müssen Sie Ihre Anwendung alsreguläre ausführbare Datei kompilieren (verwenden Sie dabei die Option/t:exe).

Die Methode ReferenceEquals ist ein nur-statisches Element, das der Equals-Methodeähnelt. Sie unterscheiden sich dahingehend, dass ReferenceEquals zwei Objekte miteinan-der vergleicht, um herauszufinden, ob sie sich in der gleichen Instanz befinden, also nicht,ob sie den gleichen Wert besitzen. Das lässt sich deswegen bewerkstelligen, weil in Com-puterbegriffen eine Instanz durch ihren Ort im Speicher (ihre Speicheradresse) definiertist. Wenn also zwei Objekte auf dieselbe Speicheradresse verweisen, handelt es sich umdieselbe Instanz. Zwei verschiedene Speicheradressen können den gleichen Wert haben,aber es handelt sich nicht um dieselbe Instanz. (Beachten Sie, dass null – oder Nothing inVB .NET – stets mit derselben Instanz wie ein anderes null gleichzusetzen ist. Werfen Sieeinen Blick auf Listing 3.2, das unterschiedliche Variablen miteinander vergleicht.

Listing 3.2: Referenzen vergleichen

1: object a = null;2: object b = null;3: object c = new Object();4:5: Console.WriteLine(Object.ReferenceEquals(a, b));6: Console.WriteLine(Object.ReferenceEquals(a, c));7: a = c;8: Console.WriteLine(Object.ReferenceEquals(a, c));

Zeile 5 liefert true, weil sich alle null-Werte auf dieselbe Instanz beziehen undeinander sind. Zeile 6 hingegen gibt false bzw. unwahr zurück, weil a und czwei unterschiedliche Objekte sind. Zeile 7 sieht aus, als würde sie a und cdemselben Wert zuordnen, aber wenn Sie die eine Variable einer anderenzuweisen, setzen Sie eigentlich die Speicheradressen miteinander gleich, unddaher liefert Zeile 8 true oder wahr.

Falls Sie bereits über Programmiererfahrung verfügen, wissen Sie, woher derName ReferenceEquals kommt: Diese Methode vergleicht die Speicheradres-sen (bzw. Referenzen) der Variablen statt ihre Werte miteinander.

In den meisten Fällen genügt die Equals-Methode, aber es ist hilfreich, auch über dieReferenceEquals-Methode verfügen zu können.

Die nächsten drei Methoden sind alle nicht-statisch. GetHashCode liefert einen Hash-Codefür Ihr Objekt. Ein Hash-Code ist eine numerische Darstellung eines Objekts und hat dar-über hinaus keine Bedeutung an sich. Die Objekte A und B können unterschiedliche

Page 6: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

Mit Windows Forms arbeiten

82

Objekte sein, aber den gleichen Hash-Code generieren, wie etwa in Zeile 7. Sie könnendiesen Vorgang nicht umkehren und von der Zahl 7 auf ein Objekt schließen; Hashing istein Einbahnstraßen-Mechanismus.

Wie ihr Name schon sagt, liefert die Methode GetType einfach nur den spezifischen Daten-typ eines Objekts. Das ist sehr nützlich, wenn man nicht weiß, mit welcher Art von Datenman es zu tun hat, so etwa, wenn eine Funktion ein nicht identifizierbares Objekt liefert:

string a = "hallo";Console.WriteLine(a.GetType());

Dieses Codestück wird System.String liefern, den Datentyp der Variablen a. Beachten Sie,dass diese Methode einen Datentyp zurückgibt, nicht etwa nur den Namen des Typs: Sieliefert einen Typ und keine Zeichenfolge. Diese Methode wird häufig zum Vergleichenvon Datentypen verwendet, etwa im Zusammenhang mit der eben besprochenen MethodeGetConfig:

myType myVariable;if (myVariable.GetType() != ConfigurationSettings.GetConfig ("mySettings").GetType()) return false;

Dieser Code prüft, ob der von der GetConfig-Methode gelieferte Typ (ein Type-Objekt) dergleiche Typ ist wie myVariable. Und in diesem Fall ist er es nicht.

Zum Schluss kommen wir auf die gebräuchlichste Methode zu sprechen: ToString liefertdie Zeichenfolgendarstellung eines Variablentyps. Das folgende Codefragment würde bei-spielsweise die Zeichenfolge "system.object" in der Befehlszeile ausgeben:

Object objA = new Object();Console.WriteLine(objA.ToString());

Beachten Sie, dass hier nicht der Wert eines Objekts ausgegeben wird, sondern der Typ-name. Manchmal wird die ToString-Methode für eine bestimmte Klasse überschrieben.Der string-Datentyp überschreibt beispielsweise ToString, so dass er den tatsächlichenWert der Variablen ausgibt statt den Namen des Typs. Der folgende Code gibt die Zei-chenfolge "hello world" aus:

string strA = "hello world";Console.WriteLine(strA.ToString());

Formular-Eigenschaften

Das Objekt System.Windows.Forms.Form verfügt über genau 101 Eigenschaften, die esIhnen gestatten, beinahe jeden Aspekt des Formulars zu steuern. Da dies zu viele Eigen-schaften für nur einen Tag sind, lassen Sie uns nur auf ein paar der nützlicheren Aspekteeinen Blick werfen, gruppiert nach Funktion.

Page 7: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

83

Das objektorientierte Windows-Formular

Größe und Position steuern

Ihnen sind bereits zwei Möglichkeiten, die Formulargröße festzulegen, bekannt: dieEigenschaften Width und Height (Breite bzw. Höhe). Diese Eigenschaften übernehmenlediglich Zahlenwerte, um die Formulargröße in Pixelwerten festzulegen. Zum Beispiel:

form1.Widthform1.Height = 200

Sie können die Größe auch mit Hilfe der Size-Eigenschaft und eines Size-Objekts festlegen:

form1.Size = New Size(100, Form1.Size.Height)form1.Size = New Size(100, Form1.Size.Width)

Beide Methoden bewirken das Gleiche, aber meistens werden Sie die erste verwenden, dasie einfacher ist.

Sie können die Größe auch abhängig von der Bildschirmgröße des Benutzers festlegen,und zwar, indem Sie das Screen-Objekt verwenden. Listing 3.3 zeigt dafür ein Beispiel.

Listing 3.3: Das Festlegen der Formularhöhe abhängig von der Bildschirmgröße (in VB .NET)

1: Imports System2: Imports System.Windows.Forms 3:4: Public Class MultiForm : Inherits Form5: Public Sub New6: Me.Text = "Hauptformular"7: Me.Height = Screen.GetWorkingArea(Me).Height / 28: End Sub9: End Class10:11: Public Class StartForm12: Public Shared Sub Main()13: Application.Run(New MultiForm)14: End Sub15: End Class

Dieser Quellcode dürfte Ihnen mittlerweile vertraut sein, daher betrachten wirlediglich Zeile 7 etwas genauer. Die Methode GetWorkingArea des Screen-Objekts liefert ein Rectangle-Objekt, das für den Benutzerbildschirm steht. Sieübergeben das aktuelle Formularobjekt (mit Hilfe des Me-Schlüsselworts), um derCLR mitzuteilen, welchen Bildschirm sie verwenden soll (nur für den Fall, dassder Benutzer mehr als einen Bildschirm besitzt). Rectangle-Objekte haben wie-derum Height- und Width-Eigenschaften, welche ihrerseits Integer liefern, die die

Page 8: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

Mit Windows Forms arbeiten

84

Höhe und Breite des Bildschirms beschreiben. Danach teilen wir den Höhe-Wertdurch 2. Kompilieren Sie diese Anwendung und führen Sie sie aus. Beachten Sie,dass das Fenster jetzt die halbe Höhe Ihres Bildschirms beansprucht.

Um festzulegen, wo das Fenster sich öffnet, können Sie die Eigenschaften Location, Desk-topLocation, Top oder Left verwenden. Die letzten beiden legen die Position der oberenlinken Ecke Ihres Formulars auf dem Bildschirm fest. Sie funktionieren genauso wie dieHeight- und Width-Eigenschaften. Beachten Sie, dass Sie diese Eigenschaften auf eine Posi-tion festlegen können, die sich weit außerhalb des Bildschirms befindet, etwa auf Top =9999 und Left = 9999.

Die Eigenschaften Location und DesktopLocation sind einander ähnlich. Bei einem Form-Objekt bewirken sie das Gleiche: Sie legen die Anfangsposition der oberen linken Ecke desFormulars fest. Die beiden folgenden Zeilen realisieren beispielsweise die gleiche Funk-tionalität:

Form1.DesktopLocation = New Point(100,300)Form1.Location = New Point(100,300)

Location ist eine Eigenschaft, die von Control, der Urgroßelternklasse von Form, geerbtwird. Diese Eigenschaft verwendet man, um die Position eines Steuerelements innerhalbeines anderen Steuerelements festzulegen. In unserem Fall ist das beinhaltende Steuerele-ment für das Formular einfach der Benutzerbildschirm. Sie könnten die Location-Eigen-schaft für jedes beliebige Objekt verwenden, das vom Control-Objekt erbt, etwa für dieSteuerelemente TextBox oder Label (Beschriftung), um seine Position innerhalb einesanderen Objekts zu festzulegen – zum Beispiel Ihres Formulars. Die Eigenschaft Desktop-Location gilt hingegen nur für das Form-Objekt. Der Einheitlichkeit halber werden wir abjetzt die Eigenschaft Location verwenden. Daher brauchen Sie nur eine Eigenschaft füralle Windows Forms-Objekte zu verwenden.

Das Aussehen steuern

Sie wissen bereits über die Text-Eigenschaft Bescheid, die den in der Titelzeile angezeig-ten Text steuert. Lassen Sie uns daher ein paar Dinge betrachten, die Sie mit Schriftarten(Fonts) anstellen können.

Die Eigenschaft Font legt die Schriftart fest, die im Formular benutzt wird, es sei denn, dieFont-Eigenschaft eines Steuerelements hätte Priorität. Die Eigenschaft ForeColor legt dieTextfarbe fest. Betrachten Sie das folgende Codefragment:

Form1.Font = New Font(new FontFamily("WingDings"), 23)Form1.ForeColor = Color.Blue

Die erste Zeile erzeugt ein neues Font-Objekt (Sie merken schon, dass absolut alles in .NETein Objekt ist, selbst Schriftarten und Farben). Es gibt eine ganze Reihe unterschiedlicher

Page 9: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

85

Das objektorientierte Windows-Formular

Möglichkeiten, um Font-Objekte zu erzeugen (in anderen Worten: Es hat viele Kons-truktoren), und dies ist lediglich eine davon. Sie legen die Schriftart fest, indem Sie dasObjekt FontFamily verwenden, das vordefinierte Schriftartnamen enthält. Der zweite Para-meter besteht in der Größe der Schriftart (in der Maßeinheit »Punkt«). Die zweite Zeile legtdie Textfarbe mit Hilfe der Blue-Eigenschaft des Color-Objekts als blau fest. Wird dieserCode in einem Windows Forms-Formular verwendet, erzeugt er die Ausgabe, die Sie inAbbildung 3.2 sehen (Sie müssen mir glauben, dass die Farbe wirklich blau ist).

Die Eigenschaften BackColor und BackgroundImage erlauben Ihnen, das vorgegebeneErscheinungsbild eines Formulars zu ändern. BackColor wird genauso verwendet wie Fore-Color:

Form1.BackColor = Color.Lachsrosa

Die Eigenschaft BackgroundImage übernimmt ein Image-Objekt als Parameter. Üblicher-weise verwenden Sie die FromFile-Methode des Image-Objekts, um eine Grafik zu laden;Sie müssen einen Pfadnamen angeben, z.B. so:

Form1.BackgroundImage = Image.FromFile("c:\winforms\day3\kaffeebohne.bmp")

FromFile ist eine statische Methode, wie Sie wahrscheinlich schon herausgefunden haben,da Sie ja keine neue Image-Instanz erzeugen müssen, um sie verwenden zu können. Wennwir von Abbildung 3.2 ausgehen, erhalten wir nun einen gekachelten Hintergrund, wieman in Abbildung 3.3 sehen kann.

Die Hintergrundfarbe des Label-Objekts (Bezeichnungsfeld) ist immer noch grau. An Tag6 lernen Sie, wie Sie dies ändern können.

Eine weitere Bildeigenschaft, die Sie anpassen können, ist die Icon-Eigenschaft. Das Iconoder Symbol wird in der oberen linken Ecke der Titelzeile Ihres Formulars verwendet,ebenso wie in jeder anderen Darstellung Ihrer Anwendung, wie etwa der Windows-Task-leiste. So legen Sie die Eigenschaft fest:

Me.Icon = New Icon("c:\winforms\day3\VSProjectApplication.ico")

Abbildung 3.2: Aussehen und Farbe einer Schriftart werden in ihren jeweiligen Eigenschaften festgelegt.

Page 10: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

Mit Windows Forms arbeiten

86

Sie müssen eine neue Instanz des Icon-Objekts erzeugen, wobei Sie einen gültigen Pfad zueiner Grafik angeben. Die Grafik, die Sie auswählen, muss eine Icon-Datei (.ico) sein,sonst erzeugt Ihre Anwendung eine Fehlermeldung.

Das Bild des Mauszeigers lässt sich durch die Cursor-Eigenschaft steuern:

Me.Cursor = Cursors.Hand

Das Cursors-Objekt verfügt über eine Menge Eigenschaften für den Standardsatz an Win-dows-Mauszeigern, darunter Arrow, IBeam, WaitCursor und Help. In der .NET-Dokumenta-tion finden Sie weitere Mauszeiger. Sie können auch einen eigenen Mauszeiger aus einerDatei laden:

Me.Cursor = New Cursor("Pfadname")

Die Mauszeigerdatei muss die Endung .cur tragen. Animierte Mauszeiger (jene mit derEndung .ani) werden von der CLR nicht unterstützt.

Die Eigenschaft ShownInTaskBar legt fest, ob Ihre Anwendung in der Windows-Taskleiste zusehen sein soll (dies betrifft nicht das Fenster am Bildschirm, sondern nur die Schaltfläche inder Taskleiste). Der Standardwert lautet true (wahr). Unter bestimmten Gegebenheitenmöchten Sie diese Einstellung vielleicht ändern, um einen Anwender daran zu hindern, einFormular auszuwählen. Wenn Sie etwa einen so genannten »Splash Screen« erzeugen, deretwa das Logo Ihrer Firma anzeigt, wollen Sie wahrscheinlich nicht, dass der Benutzer esauswählt (es verschwindet ja auch sofort). Setzen Sie dann einfach die Eigenschaft ShownIn-TaskBar auf false, und der Benutzer kann es nicht mehr aus der Taskleiste auswählen.

Die Eigenschaft FormBorderStyle legt das Aussehen der Umrisslinie einer Windows Forms-Formulars fest. Hauptsächlich ändern Sie diese Eigenschaft, um die Größenänderung desFormulars zu erlauben oder zu unterbinden. Manchmal betrifft das Ändern einer Umriss-linie auch das Aussehen des Formulars, wie zum Beispiel:

Form1.FormBorderStyle = FormBorderStyle.Sizable

Abbildung 3.3: Sie können eine Grafik dazu verwenden, den Hintergrund Ihres Formulars damit zu kacheln.

Page 11: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

87

Das objektorientierte Windows-Formular

Die Aufzählung für FormBorderStyle (nicht zu verwechseln mit der EigenschaftForm.FormBorderStyle) führt sieben verschiedene Typen von Umrisslinien auf, wie inTabelle 3.1 zu sehen. (Eine Aufzählung ist einfach eine Sammlung von Eigenschaftenoder Stilen.) Abbildung 3.4 zeigt eine Sammlung der unterschiedlichen Stile.

Abbildung 3.4: Es stehen sieben vordefinierte Umrisslinienstile zur Auswahl.

Stil Beschreibung

Fixed3D Nicht skalierbar. Dreidimensionale Umrisslinie.

FixedDialog Nicht skalierbar. Dicke Umrisslinie.

FixedSingle Nicht skalierbar. Dünne Umrisslinie.

FixedToolWindow Formular mit schmalerer Titelleiste. Nützlich für die Anzeige von QuickInfos und Hilfefenstern. Nicht skalierbar. Enthält keine Maximieren- oder Minimie-ren-Schaltflächen.

None Nicht skalierbar. Keine Umrisslinie.

Sizable Skalierbar. Standardstil.

SizableToolWindow Formular mit schmalerer Titelleiste. Nützlich für die Anzeige von QuickInfos und Hilfefenstern. Skalierbar. Enthält keine Maximieren- oder Minimieren-Schaltflächen.

Tabelle 3.1: Stile für FormBorderStyle

Page 12: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

Mit Windows Forms arbeiten

88

Zum Schluss gibt es noch drei Eigenschaften, die steuern, wie und ob Ihr Formular amBildschirm angezeigt wird. Die Visible-Eigenschaft legt fest, ob Ihr Formular für denBenutzer sichtbar ist. Ist ein Formular nicht zu sehen, kann man nicht damit interagieren.Auf diese Weise lassen sich bestimmte Dinge vor dem Anwender verbergen, etwa wenn SieIhre Anwendung geöffnet lassen wollen, sie aber nicht mit der Benutzeroberfläche interfe-rieren soll. Standardmäßig ist ein solches Formular nicht sichtbar.

Um ein Formular teilweise sichtbar zu machen (mit anderen Worten: transparent), müssenSie die Eigenschaft Visible auf true (wahr) setzen und die Eigenschaft Opacity (Undurch-sichtigkeit) verwenden. Diese Eigenschaft übernimmt einen Wert zwischen 1 (= völligundurchsichtig, also völlig sichtbar) und 0,0 (= unsichtbar bzw. völlig durchsichtig). Umein paar wirklich interessante Transparenztechniken vorzuführen, können Sie die Eigen-schaft TransparencyKey so einstellen, dass eine bestimmte Farbe durchsichtig sein soll. Derfolgende Code macht beispielsweise alle grauen Flächen im Formular unsichtbar, wäh-rend alles andere undurchsichtig bleibt:

Form1.TransparencyKey = Color.Gray

Wenn Sie nun auch noch die BackColor des Formulars auf Grau setzen, erhalten Sieschließlich ein Formular wie das in Abbildung 3.5 zu sehende (das Formular wurde überein Fenster mit Befehlszeilenausgabe gelegt, um den Transparenzeffekt zu verdeutlichen).

Interaktivität steuern

Wenn Sie eine Windows-Anwendung betrachten, dann sehen Sie an deren Fenstern dieStandardmerkmale: In der oberen rechten Ecke befinden sich Schaltflächen für das Mini-mieren und Maximieren sowie das Schließen des Fensters, manchmal auch eine HILFE-Schaltfläche. Rechts unten befindet sich oft ein Anfasser, damit man mit der Maus dieFenstergröße verändern kann. Diese Systemmenüfelder sehen Sie in Abbildung 3.6.

Abbildung 3.5: Verwenden Sie die Eigenschaft Trans-parencyKey, um nur eine bestimmte Far-be sichtbar zu machen.

Page 13: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

89

Das objektorientierte Windows-Formular

Jedes Systemmenüfeld lässt sich mit Hilfe der folgenden Eigenschaften in Ihrem Formularverstecken oder anzeigen:

� MaximizeBox

� MinimizeBox

� HelpButton

� ControlBox

� SizeGripStyle

Die ersten vier Eigenschaften nehmen lediglich den Wert true oder false an. ControlBoxlegt fest, ob die vorhergehenden Schaltflächen überhaupt angezeigt werden sollen.

Seien Sie hier jedoch vorsichtig: Wenn Sie ControlBox auf false setzen, könntees sein, dass Sie Ihre Anwendung nicht mehr schließen können!

Die HILFE-Schaltfläche taucht nur auf, wenn die MINIMIEREN- und MAXIMIE-REN-Schaltflächen nicht sichtbar sind. Dies ist ein Standardmerkmal von .NET.

Die Eigenschaft SizeGripStyle nimmt einen SizeGripStyle-Aufzählungswert an: Auto,Hide oder Show. Auto zeigt den Skalierungsanfasser an, falls nötig (also abhängig vom Form-BorderStyle), während Hide und Show die Größenziehpunkge (Skalierungsanfasser) jeweilsverbergen oder zeigen.

Mit einer Anwendung sind häufig zwei besondere Tasten verbunden: (¢) und (ESC).Viele Anwendungen werden geschlossen, wenn Sie die (ESC)-Taste drücken. Sie könnendiese Funktionen mit den Eigenschaften AcceptButton und CancelButton steuern. Listing3.4 zeigt in C# ein Beispiel, wie man diese Eigenschaften verwendet.

Abbildung 3.6: Diese Systemmenü-felder gehören zu den Standardmerk-malen von Windows.

Page 14: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

Mit Windows Forms arbeiten

90

Listing 3.4: Die Eigenschaften AcceptButton und CancelButton

1: using System;2: using System.Windows.Forms;3: using System.Drawing;4: 5: namespace TYWinForms.Day3 {6: 7: public class Listing34 : Form {8: Button btAccept = new Button();9: Button btCancel = new Button();10: Label lblMessage = new Label();11: 12: public Listing34() {13: lblMessage.Location = new Point(75,150);14: lblMessage.Width = 200;15: 16: btAccept.Location = new Point(100,25);17: btAccept.Text = "OK";18: btAccept.Click += new EventHandler(this.AcceptIt);19: 20: btCancel.Location = new Point(100,100);21: btCancel.Text = "Abbrechen";22: btCancel.Click += new EventHandler(this.CancelIt);23: 24: this.AcceptButton = btAccept;25: this.CancelButton = btCancel;26: this.Text = "Beispiel für die Buttons OK und Abbrechen";27: this.Height = 200;28: this.Controls.Add(lblMessage);29: this.Controls.Add(btAccept);30: this.Controls.Add(btCancel);31: }32: 33: public void AcceptIt(Object Sender, EventArgs e) {34: lblMessage.Text = "Der OK-Button wurde gedrückt";35: }36: 37: public void CancelIt(Object Sender, EventArgs e) {38: lblMessage.Text = "Der Abbrechen-Button wurde gedrückt";39: }40: }41: 42: public class StartForm {43: public static void Main() {44: Application.Run(new Listing34());

Page 15: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

91

Das objektorientierte Windows-Formular

45: }46: }47: 48: }

Ein Großteil dieses Codes dürfte bereits vertraut aussehen, daher können wirdas meiste davon überfliegen. Die Zeilen 1 bis 3 importieren die notwendigenNamensräume. Zeile 5 deklariert den Namensraum, zu dem diese Anwendunggehört; gemäß unserem Bezeichnungsschema heißt dieser Namensraum TYWin-Forms.Day3. Zeile 7 deklariert die Windows Forms-Formularklasse.

Die Zeilen 8 bis 10 deklarieren die Steuerelemente, die wir im Formular ver-wenden werden. Beachten Sie, dass sie außerhalb einer Methode deklariert wer-den, doch innerhalb einer Klasse. Dadurch lassen sie sich von jeder Methode inder Klasse verwenden.

Im Konstruktor ab Zeile 12 findet der Großteil des Geschehens statt. Der Codein den Zeilen 13 bis 22 setzt einfach ein paar Eigenschaften für unsere Steuer-elemente. Beachten Sie insbesondere die Zeilen 18 und 22, die auf Methodenzeigen, die ausgeführt werden, sobald eine der beiden Schaltflächen im Formu-lar angeklickt wird. Diese Methoden, AcceptIt und CancelIt, befinden sich inden Zeilen 33 und 37 und geben einfach nur eine Meldung im Label-Steuer-element aus.

Die Zeilen 24 bis 30 stellen einige Eigenschaften ein und fügen dem Formulardie Steuerelemente hinzu. Die Zeilen 24 und 25 legen die EigenschaftenAcceptButton und CancelButton für die jeweilige OK- oder Abbrechen-Schaltflä-che fest. Im Wesentlichen bewirkt das Anklicken der OK- oder Abbrechen-Schalt-fläche das Gleiche wie das Drücken der (¢)- oder der (ESC)-Taste.

Schließlich enthalten die Zeilen 42 bis 46 eine weitere Klasse. Sie dient ledig-lich dazu, unsere Main-Methode aufzunehmen und die Methode Applica-tion.Run aufzurufen. Die Ausgabe der Anwendung nach dem Drücken der(ESC)-Taste wird in der Schaltfläche AcceptButton und Abbildung 3.7 gezeigt.

Erhält die Abbrechen-Schaltfläche im Formular den Fokus, veranlasst das Drü-cken der (¢)-Taste das »Anklicken« oder Niederdrücken dieser Schaltflächeund folglich das Auslösen der CancelIt-Methode. Mit anderen Worten: DieSchaltfläche erhält die Eingabe noch vor dem eigentlichen Formular. Leider gibtes für diese missliche Tatsache keinen einfachen Ausweg. Manche Steuerele-mente, wie etwa die Button- und RichTextBox-Steuerelemente, behandeln dasDrücken der (¢)-Taste automatisch, wenn sie den Fokus haben, also noch bevorirgendetwas anderes ausgeführt werden kann. Sobald Sie dem Abbrechen-Buttonden Fokus geben (indem Sie ihn anklicken oder mit der Tabulatortaste daraufgehen), bewirkt die (¢)-Taste stets die Ausführung der CancelIt-Methode.

Page 16: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

Mit Windows Forms arbeiten

92

Falls es Sie interessiert, können Sie diese Verhaltensweise umgehen, indem Siedas Button-Steuerelement selbst überschreiben. Wir werden dies an Tag 18behandeln.

Obwohl die AcceptButton- und CancelButton-Eigenschaften auf Button-Steuerelementeverweisen müssen, beachten Sie bitte, dass diese Buttons nicht unbedingt für den Benutzerzu sehen sein müssen. Indem man die Visible-Eigenschaft auf false setzt, macht man dieSchaltflächen unsichtbar, ohne ihre Funktionalität zu verlieren.

Die Eigenschaft AllowDrop schließlich legt fest, ob das Formular mit Drag & Drop-Funk-tionen umgehen kann, d.h. wenn ein Anwender mit der Maus ein Objekt in das Formularzieht und dort »fallen« lässt. Diese Eigenschaft kann einen true- oder false-Wert anneh-men. Wie Sie Ihr Formular dazu bringen, etwas bei einem solchen Ereignis auszulösen,besprechen wir heute später im Abschnitt »Ereignisse im Formular«.

Um eine vollständige Liste der Eigenschaften des Form-Objekts nachzuschlagen, lesen SieAnhang B »Windows Forms-Steuerelemente«.

Formular-Methoden

Das Form-Objekt verfügt ebenfalls über zahlreiche Methoden: über 57, um genau zu sein.In der Mehrzahl sind sie von den Klassen Object und Control geerbt, so dass sie den meis-ten Objekten, mit denen Sie in Windows Forms arbeiten, zur Verfügung stehen. Eingeteiltnach Kategorien sollen einige davon hier vorgestellt werden.

Neben den hier behandelten Methoden sollten Sie auch die bereits vorgestellten Object-Methoden wie Equals und ToString nicht vergessen. Das Form-Objekt kann auch sie nutzen.

Aspekte der Bildschirmanzeige

Die ersten zwei Methoden sind Show und Hide. Diese beiden Funktionen machen Ihr For-mular jeweils sichtbar oder unsichtbar, indem sie die Visible-Eigenschaft ändern. Sie ver-ändern das Formular selbst nicht – etwa das Entfernen aus dem Speicher oder der Aufrufanderer Funktionen –, sondern nur, ob der Benutzer es sehen kann.

Abbildung 3.7: Das Drücken der (ESC)-Taste hat die gleiche Wirkung wie das Anklicken der ABBRECHEN-Schaltfläche.

Page 17: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

93

Das objektorientierte Windows-Formular

Die Close-Methode jedoch entsorgt ein Formular (und seine Steuerelemente) vollständigdurch das Entfernen aus dem Speicher. Setzen Sie diese Methode ein, wenn Sie IhreAnwendung schließen wollen oder wenn Sie einfach kein Formular mehr brauchen.

Da Windows ja ein Multitasking-Betriebssystem ist, dürfen viele Fenster gleichzeitig geöff-net sein. Jedes Fenster muss um die Aufmerksamkeit des Benutzers wetteifern. Das Form-Objekt verfügt über einige Methoden, die Ihnen helfen, diese Schwierigkeit zu bewältigen.

Die Activate-Methode »aktiviert« Ihr Formular. Das kann zweierlei bedeuten:

� Wenn Ihre Anwendung die aktive ist, also vom Benutzer gerade verwendet wird, stelltActivate das Formular in den Vordergrund der Bildschirmanzeige, so dass es überallen anderen Fenstern liegt.

� Falls es nicht die aktive Anwendung ist, blinken die Titelleiste und das Symbol in derTaskleiste, um die Aufmerksamkeit des Benutzers auf sich zu lenken. Wahrscheinlichhaben Sie diese Art von Blickfang schon einmal gesehen; die gebräuchlichste Verwen-dung findet sich bei Instant-Messaging-Anwendungen. Hat Ihnen jemand eine InstantMessage (IM) gesendet, während Sie gerade in einer anderen Anwendung arbeiten,öffnet sich plötzlich das IM-Fenster im Hintergrund und seine Titelleiste blinkt.

Beim Blickfang noch etwas direkter als Activate sind die Methoden BringToFront undSendToBack. Die erste Methode stellt ein Formular vor alle anderen Fenster in der Bild-schirmanzeige, so dass der Benutzer gezwungen ist, es anzusehen. Das ist nützlich, fallsetwas mit Ihrer Anwendung geschieht, das die volle Aufmerksamkeit des Benutzers verlangt(beispielsweise der Erhalt einer Instant Message). Umgekehrt stellt SendToBack ein Formu-lar hinter alle anderen Fenster auf dem Bildschirm. SendToBack wird zwar nicht häufigbenutzt, ist aber für alle Fälle vorhanden.

Sie können die Eigenschaft TopMost auf true setzen, um dafür zu sorgen, dassIhr Formular immer im Vordergrund steht. Besonders nützlich ist dieses Leis-tungsmerkmal, wenn Alarm- oder Fehlermeldungen ausgegeben werden sollen.

Schließlich funktioniert die Refresh-Methode ähnlich wie die Schaltfläche AKTUALISIE-REN in Ihrem Web-Browser: Sie zeichnet alles im Formular neu und aktualisiert mituntersogar dessen Inhalte. Wir werden näher auf diese Methode zu sprechen kommen, wennwir GDI+ an Tag 13 durchnehmen.

Eigenschaften zurücksetzen

Das Form-Objekt verfügt über eine Reihe von Reset-Methoden, mit denen Sie geänderteEigenschaften auf ihre Vorgabewerte zurücksetzen können. Alle diese Methoden folgendem Bezeichnungsschema ResetEigenschaft. Einige der gebräuchlicheren sind:

� ResetBackColor

� ResetCursor

Page 18: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

Mit Windows Forms arbeiten

94

� ResetFont

� ResetForeColor

� ResetText

Diese Methoden sind sehr nützlich, wenn man etwas geändert hat und alles wieder rück-gängig machen muss, man aber nicht weiß oder sich nicht darum kümmert, welchesjeweils der ursprüngliche Wert war. Wenn der Benutzer beispielsweise in einem Textpro-gramm mehrmals die Schriftart ändert, aber dann wieder zu den Standardwerten zurück-kehren möchte, könnte man ResetFont einsetzen.

3.2 Ereignisbehandlung

Ein Ereignis (event) ist etwas, das als Ergebnis einer Aktion oder Aktivität passiert. GreifenSie auf die Auto-Analogie zurück und stellen Sie sich bitte vor, dass Sie auf die Bremse tre-ten (eine Aktion). Der Wagen hält an (ein Ereignis). Treten Sie auf das Gaspedal (Aktion),fährt der Wagen wieder an (Ereignis). Ein Ereignis ist stets die Folge einer Aktion, die statt-gefunden hat.

Auch Windows Forms verfügen über Ereignisse, obwohl so manches davon nicht beson-ders augenfällig ist. Öffnen und Schließen etwa sind zwei Ereignisse, die erfolgen, wennSie Ihre Anwendung starten beziehungsweise beenden. Schieben Sie Ihren Mauszeigerüber das Formular, findet ein Ereignis statt, und wenn Ihr Mauszeiger es wieder verlässt,findet ein weiteres Ereignis statt. Ohne Ereignisse wären Windows Forms ziemlich fade,denn sie würden nie etwas bewirken, ganz gleich, wie sehr der Anwender das auch erzwin-gen wollte.

Die Nachrichtenschleife

Ereignisse eignen sich in wunderbarer Weise dafür, Benutzereingaben zu handhaben. Las-sen Sie uns zwei verschiedene Anwendungsmodelle betrachten – eines mit, das andereohne Ereignisse –, bevor wir untersuchen, wie Anwendungen Ereignisse verwenden.

Stellen Sie sich zunächst die ereignisgesteuerte Anwendung vor. Unter »ereignisgesteuert«versteht man, dass die Anwendung auf Ereignisse reagiert, die auf Benutzeraktionen hinerfolgen. Ohne diese Ereignisse würde die Anwendung in der Tat überhaupt nichts tun.Die Ereignisse treiben die Anwendung quasi an.

In diesem Modell ist die Anwendung untätig und wartet darauf, dass etwas passiert. Sie ver-wendet Ereignisse als ihr Stichwort, eine Aktion auszuführen. Ein Benutzer drückt bei-spielsweise eine Taste. Die Anwendung merkt, dass ein Ereignis stattgefunden hat

Page 19: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

95

Ereignisbehandlung

(Tastendruck), führt eine Aktion aus, um das entsprechende Zeichen anzuzeigen, und war-tet dann auf das nächste Ereignis.

Eine Anwendung, die nicht ereignisgesteuert ist, gestattet dem Benutzer nicht diegewünschte Nutzung der Anwendung, vielmehr kann er lediglich auf ihre Aufforderungenreagieren. Mit einer ereignisgesteuerten Anwendung hingegen kann der Benutzer interagie-ren, ganz gleich, mit welchem ihrer Teile, zu welcher Zeit oder in welcher Reihenfolge.

Stellen Sie sich einmal eine Taschenrechner-Anwendung vor, die nicht ereignisgesteuertwäre. Sobald Sie die Anwendung gestartet haben, holt sie zwei Werte aus den Textfeldern,führt mathematische Berechnungen aus und gibt das Ergebnis aus. Befinden sich jedochkeine Werte in den Textfeldern, tut der Taschenrechner überhaupt nichts. Er kann nichtfeststellen, ob sich eine Zahl geändert hat, da er keine Ereignisse erkennt. Jedes Mal, wennSie die Zahlen ändern, um einen anderen Wert zu berechnen, müssen Sie zuerst die Zah-len ändern und dann die Anwendung erneut ausführen.

Klassische Active Server Pages (also ASP als Vorgänger von ASP.NET) funktionieren aufdiese Weise. Eine ASP-Anwendung wird ausgeführt, sobald ein Benutzer die Seite von sei-nem Browser aus anfordert, dann gibt sie den nötigen HTML-Code aus und hält an. Umdas, was danach passiert, kümmern sich ASPs nicht, da sie nicht auf Ereignisse zu wartenbrauchen. Damit eine ASP-Anwendung Benutzereingaben verarbeitet, muss der Benutzeralle Eingaben in ein Webformular eintippen, bevor er es der ASP zur Verarbeitungzuschickt. Die ASP kennt nichts anderes als das, was ihr beim Start bekannt gegeben wor-den ist. Abbildung 3.8 illustriert diesen Vorgang.

Beide Modelle haben ihre Vor- und Nachteile. Sobald sie einmal gestartet sind, laufenAnwendungen, die nicht ereignisgesteuert sind, ohne Benutzereingaben ab. Ereignisge-steuerte Anwendungen erfordern hingegen üblicherweise eine Benutzereingabe, sind aberhäufig reaktionsfähiger und interaktiv. Da aber Interaktion eine zwingende Eigenschafteiner jeden Windows-basierten Anwendung ist, werden alle Ihre Programme das ereignis-gesteuerte Modell verwenden.

Abbildung 3.8: Anwendungen, die nicht ereignisgesteuert sind, erfordern einen dreistufigen Prozessablauf.

Anwendungstarten

Benutzerein-gaben liefern

Verarbeitung

Stop

Nicht ereignisbasiert

Page 20: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

Mit Windows Forms arbeiten

96

Wie also entdeckt eine Anwendung, dass ein Ereignis stattgefunden hat? Sobaldeine typische Windows-Anwendung gestartet wird, tritt sie in eine Nachrichten-schleife ein. Dies ist lediglich eine Zeitspanne, in der die Anwendung auf eineEingabe wartet oder auf Mitteilungen vom Benutzer (einen Befehl etwa). DieZeitspanne dauert so lange, bis die Anwendung beendet wird, so dass dies alseine Schleife (oder Zyklus) bezeichnet wird. Während dieser Schleife tut dieAnwendung nichts, außer auf eine Benutzereingabe zu warten (die Spanne derNicht-Aktivität wird Leerlauf bzw. idling genannt). Sobald eine Eingabe entge-gengenommen wird, verrichtet die Anwendung ihr Werk und fällt dann wiederzurück in ihre Nachrichtenschleife. Dieser Zyklus setzt sich wieder und wiederfort, bis die Anwendung geschlossen wird.

Wenn Sie etwas eingeben, ist das Windows-Betriebssystem die erste Stufe in derVerarbeitung. Windows entscheidet darüber, zu welcher Anwendung das Ereignisgehört, und schickt es ihr zu. Diese Nachrichten sind als »Windows-Nachrichten«bekannt, wovon die Bezeichnung »Nachrichtenschleife« abgeleitet wurde.

Wenn Sie beispielsweise ein Microsoft Word-Dokument das erste Mal öffnen, passiertnichts. Word wartet auf Ihre Eingabe. Sobald Sie eine Taste drücken, findet ein Ereignisstatt, eine Methode wird ausgeführt (um das Zeichen am Bildschirm anzuzeigen), dann fälltWord wieder in die Nachrichtenschleife zurück, um weiteren Input abzuwarten. Jedes Malwenn Sie eine Taste drücken, hält die Nachrichtenschleife für einen Augenblick an, umetwas zu verarbeiten, und setzt dann das Warten fort. Abbildung 3.9 illustriert diesen Zyklus.

Windows Forms sind üblicherweise die primäre Benutzeroberfläche Ihrer Anwendungen.Daher handhaben sie eine ganze Reihe unterschiedlicher Ereignisse.

Abbildung 3.9: Die Nachrichtenschleife wartet auf eine Benutzereingabe.

Anwendungstarten

Falls Benutzereingabeauf “Stop” lautet, dann

in Messageschleifeeintreten

BenutzereingabeVerarbeitung

Stop

Ereignisbasiert

Page 21: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

97

Ereignisbehandlung

Form-Ereignisse

Sie haben bereits gesehen, wie sich einige Ereignisse handhaben lassen. Im Beispiel desTaschenrechners aus der gestrigen Lektion nutzten Sie das Click-Ereignis des Button-Objekts. Die Handhabung von Ereignissen in Windows Forms ist immer ziemlich die glei-che, ungeachtet der Objekte, denen die Ereignisse zugeordnet sind.

An Tag 5 besprechen wir Ereignisse eingehender, wie man sie handhabt und welcheUnterschiede zwischen verschiedenen Ereignissen bestehen. Nun lassen Sie uns aber fürsErste einen Blick auf einige der 71 Ereignisse des Form-Objekts werfen.

Die Ausführung steuern

Um Ihnen als Entwickler die größtmögliche Kontrolle über Ihre Anwendung zu verleihen,werden manche Ereignisse sowohl vor als auch nach dem Eintreten einer Aktion gestartet.Wenn Sie beispielsweise Ihr Formular schließen, findet das Closing-Ereignis direkt vordem Schließen des Formulars statt, das Closed-Ereignis direkt danach.

Diese Arten von Ereignisnamen folgen stets den Regeln für das Partizip Präsensbzw. Partizip Perfekt, daher »Closing« (»sich gerade schließend«) und »Closed«(also »geschlossen«). Nicht alle Ereignisse treten in solchen Paaren auf. WennSie jedoch einen –ing-Ereignisnamen lesen, können Sie sicher sein, dass auchein –ed-Ereignis folgt; das gilt aber nicht umgekehrt.

Was ist der Grund für die Methode, zwei Ereignisse pro Aktion zu verwenden? Stellen Siesich bitte einen großen Gemüseladen vor, der um 20:00 Uhr schließt. Fünf Minuten,bevor der Laden eigentlich zumacht, wird über die Lautsprecheranlage eine Ansage zuhören sein, die die Kunden bittet, dass sie sich zu den Kassen begeben möchten. DiesesVor-Schließen-Ereignis dient dazu, die Kunden zu warnen, dass etwas geschehen wird.Um 20:00 Uhr schließt der Laden, und alle Kunden werden zum Verlassen des Ladensaufgefordert, alle Türen werden verriegelt. Diese zweistufige Vorgehensweise erlaubt essowohl dem Ladeninhaber oder Filialleiter als auch den Kunden, sich auf das tatsächlicheeintretende Ereignis des Ladenschlusses vorzubereiten.

Bei Windows-Anwendungen verhält es sich ähnlich. Wenn z.B. ein Benutzer eine großeZahl von Änderungen an einem Word-Dokument vornimmt, dann die Anwendung mitHilfe des SCHLIEßEN-Steuerelements schließt, aber das Speichern seines Dokuments ver-gisst, was würde dann geschehen? Wenn man auf das Closed-Ereignis warten würde, bevorman etwas unternähme, wäre es bereits zu spät: Das Dokument wäre schon geschlossenworden, und alle Änderungen wären verloren. In .NET jedoch wird das Closing-Ereignisausgelöst, bevor das eigentliche Schließen des Dokuments eintritt. In diesem Fall könnenSie nun den Benutzer auffordern, sein Dokument zu speichern, bevor die Änderungen ver-loren gehen, und dadurch die Änderungen zu erhalten. Sobald das Fenster geschlossen ist,

Page 22: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

Mit Windows Forms arbeiten

98

wird das Closed-Ereignis ausgelöst. Danach können Sie jede Verarbeitungsmöglichkeitnutzen, die Sie benötigen (etwa dem Benutzer eine Meldung anzeigen).

Lassen Sie uns einen Blick auf ein Beispiel werfen, in dem dieser zweistufige Vorgang ver-wendet wird. Listing 3.5 verwendet die Closing- und Closed-Ereignisse im Form-Objekt, umdas obige Beispiel zu illustrieren.

Listing 3.5: Die Kontrolle der Programmausführung mit Hilfe von Ereignissen in VB .NET

1: Imports System2: Imports System.Windows.Forms3: Imports System.Drawing4: Imports System.ComponentModel5: 6: Namespace TYWinForms.Day37: 8: public class Listing35 : Inherits Form9: public sub New() 10: Me.Text = "Beispiel für ein Ereignis"11: AddHandler Me.Closing, AddressOf Me.ClosingMsg12: AddHandler Me.Closed, AddressOf Me.ClosedMsg13: end sub14: 15: public sub ClosingMsg(Sender as Object, e as CancelEventArgs)16: Microsoft.VisualBasic.MsgBox("Formular schließt sich")17: end sub18: 19: public sub ClosedMsg(Sender as Object, e as EventArgs)20: Microsoft.VisualBasic.MsgBox("Formular ist geschlossen")21: end sub22: 23: end class24: 25: public class StartForm26: public shared sub Main()27: Application.Run(new Listing35)28: end sub29: end class30: 31: End Namespace

In Zeile 4 wird ein Namensraum importiert, der noch nicht aufgetreten ist: Sys-tem.ComponentModel. Er verfügt über Objekte, die Ereignisse betreffen, die manweiter unten im Code benötigt. Die Zeilen 6 bis 10 sind nichts Besonderes. Die

Page 23: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

99

Ereignisbehandlung

Zeilen 11 und 12 verwenden die AddHandler-Methode (die Ihnen an den Tagen1 und 2 begegnet ist), um der CLR zu befehlen, die Methoden ClosingMsg undClosedMsg (in den Zeilen 15 und 19) auszuführen, wenn die Closing- undClosed-Ereignisse jeweils ausgelöst werden. Wir springen in Zeile 15 zur Clo-sing-Methode, die ausgeführt wird, sobald das Closing-Ereignis ausgelöst wor-den ist und sich das Formular tatsächlich schließt.

Sehen Sie sich zunächst die Signatur (die erste Zeile) dieser Methode an. Sieübernimmt zwei Parameter: ein Object- und ein System.ComponentModel.Cancel-EventArgs-Objekt. Sie wissen bereits, was das Object-Objekt ist. Der zweiteParameter ist ein spezialisiertes Objekt, das nur für Ereignisse gilt, insbesonderefür Closing-Ereignisse. Es verfügt über eine besondere Eigenschaft namensCancel, um damit den Vorgang – in diesem Fall das Schließen des Formulars –zu unterbrechen, falls dies nötig sein sollte (wie etwa im Beispiel des Textpro-gramms). Wenn Sie festlegen, dass das Schließen gestoppt werden soll (etwaweil der Benutzer vergessen hat, sein Dokument zu speichern), setzen Sie dieCancel-Eigenschaft auf true:

e.Cancel = true

Die Anwendung wird mit dem Schließen innehalten und in die Nachrichten-schleife zurückkehren.

In unserem Fallbeispiel befassen wir uns nicht damit zu verhindern, dass dasFormular geschlossen wird. In Zeile 16 rufen wir vielmehr eine Methode auf,die eine Meldung auf dem Bildschirm anzeigt. Die MsgBox-Methode desNamensraums Microsoft.VisualBasic präsentiert lediglich ein Popup-Feld mitdem festgelegten Text darin. (Beachten Sie, dass wir anstatt den vollen Namender MsgBox-Methode in Zeile 16 zu verwenden, auch den Namensraum Micro-soft.VisualBasic mit Hilfe von Imports hätten importieren können.)

In Zeile 19 beginnt die Methode ClosedMsg. Sie wird ausgeführt, nachdem dasFormular sich geschlossen hat. Beachten Sie, dass sie als zweiten Parameter einEventArgs-Objekt statt CancelEventArgs übernimmt. Den Grund dafür bespre-chen wir an Tag 5. Diese Methode wiederum ruft die MsgBox-Funktion auf, umeine weitere Meldung anzuzeigen, die den Benutzer darüber informiert, dassdas Formular geschlossen wurde.

Kompilieren Sie zum Schluss diesen Code, entweder mit VS .NET oder mit folgendemBefehl:

vbc /t:winexe /r:system.windows.forms.dll /r:system.drawing.dll listing.3.5.vb

Sie erinnern sich bestimmt noch von Tag 2 daran, dass sich der Namensraum System.Com-ponentModel in der Assembly System.dll befindet. Das ist der Grund, warum wir hier keine

Page 24: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

Mit Windows Forms arbeiten

100

neuen Assemblies referenzieren müssen. Abbildung 3.10 zeigt die Ausgabe, nachdem dasSteuerelement zum Schließen des Fensters angeklickt worden ist.

Nicht alle Ereignisse folgen diesem zweistufigen Ablauf. Man findet ihn aber bei einigenForm-Objekten, die Tabelle 3.2 beschreibt.

Es gibt einige wichtige Ereignisse, von deren Existenz Sie Kenntnis haben sollten, wennSie mit Windows Forms zu tun haben. Closed haben Sie ja bereits kennen gelernt: Es wirdausgelöst, sobald sich ein Formular schließt. Es gibt weiter ein Load-Ereignis, das sofort aus-gelöst wird, noch bevor ein Formular zum ersten Mal angezeigt wird. Der Ereignishandlerfür dieses Ereignis ist häufig eine geeignete Stelle, um Komponenten für Ihr Formular zuinitialisieren, d.h. falls Sie sie noch nicht im Konstruktor initialisiert haben sollten.

Das Activated-Ereignis findet statt, sobald Ihr Formular den Fokus erhält und zur aktivenAnwendung wird – es korrespondiert mit der Activate-Methode. Dementsprechend wird

Abbildung 3.10: Das Closing-Ereignis erlaubt Ihnen, das Closed-Ereignis abzufangen.

Ereignis Beschreibung

Closed Erfolgt beim Schließen eines Formulars

InputLanguage-Changed

Erfolgt, sobald der Benutzer die Sprache des Formulars zu ändern versucht

Validated Erfolgt, sobald die Eingabe eines Steuerelements auf Gültigkeit geprüft worden ist

Tabelle 3.2: Ereignisse, die vor dem Cursor-Einsatz stattfinden

Page 25: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

101

Ereignisbehandlung

Deactivate ausgelöst, sobald Ihr Formular deaktiviert wird, also den Fokus verliert, oderwenn eine andere Anwendung die aktive wird.

Maus- und Tastaturereignisse

Maus- und Tastaturaktionen gehören zu den wichtigsten Arten von Ereignissen. Schließ-lich sind dies wesentliche Formen von Benutzereingaben. Daher gibt es eine ganze Reihevon Ereignissen, die mit diesen zwei Eingabegeräten verbunden sind. Lassen Sie uns mitTastaturereignissen anfangen.

Zuerst an der Reihe ist das KeyPress-Ereignis. Es erfolgt jedes Mal, wenn eine Tastegedrückt wird, ganz gleich welche (wir sehen gleich noch, wie man feststellt, welche Tastees war). Falls dieses Ereignis nicht genügend Kontrollmöglichkeiten eröffnet, gibt es nochdie Ereignisse KeyDown und KeyUp, die jeweils ausgelöst werden, sobald eine Taste herunter-gedrückt und dann wieder losgelassen wird.

Diese Ereignisse liefern zusätzliche Informationen (etwa welche Taste gedrückt wurde),die Sie in Ihrer Anwendung nutzen können. Ihre Ereignishandler, also diejenigen Metho-den, die ausgeführt werden, sobald das Ereignis ausgelöst worden ist, sind dementspre-chend spezialisiert. In VB .NET erfolgt das Deklarieren dieser Handler auf die gleicheWeise, mit der Sie bereits vertraut sind:

'VB .NETAddHandler Form1.KeyPress, AddressOf methodenNameAddHandler Form1.KeyDown, AddressOf methodenNameAddHandler Form1.KeyUp, AddressOf methodenName

In C# müssen Sie jedoch die spezialisierten Handler berücksichtigen. Statt EventHandlerin Zeile 18 von Listing 3.4 wie gewohnt zu verwenden

18: btAccept.Click += new EventHandler(this.AcceptIt);

müssen Sie die Objekte KeyPressEventHandler und KeyEventHandler einsetzen:

//C#Form1.KeyPress += new KeyPressEventHandler(methodenName)Form1.KeyDown += new KeyEventHandler(methodenName)Form1.KeyUp += new KeyEventHandler(methodenName)

Genau wie das CancelEventArgs-Objekt besitzen auch die Objekte KeyPressEventHandlerund KeyEventHandler besondere Eigenschaften, die Ihrer Anwendung helfen festzustellen,welche Aktion das jeweilige Ereignis ausgelöst hat.

Der KeyPressEventHandler hat zwei Eigenschaften: Handled und KeyChar. Bei der erstenMethode handelt es sich lediglich um einen true- oder false-Wert, der anzeigt, ob IhreMethode den Tastendruck verarbeitet hat (ist das nicht der Fall, wird der Tastendruck zurVerarbeitung an das Windows-Betriebssystem geschickt). Meistens werden Sie diese Eigen-

Page 26: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

Mit Windows Forms arbeiten

102

schaft auf true setzen, es sei denn, Sie wünschen explizit, dass das Betriebssystem diesenspeziellen Tastendruck verarbeitet (wenn Sie etwa die Taste (Druck) nicht handhabenmüssen, leiten Sie dies an das Betriebssystem weiter). Die Eigenschaft KeyChar liefert ein-fach die Taste, die gedrückt wurde. Listing 3.6 zeigt ein Beispiel in VB .NET.

Listing 3.6: Verarbeitung von Tastenbetätigungen

1: Imports System2: Imports System.Windows.Forms3: Imports System.Drawing4: Imports System.ComponentModel5: 6: Namespace TYWinForms.Day37: 8: public class Listing36 : Inherits Form9: public sub New() 10: Me.Text = "Tastendruck-Beispiel"11: AddHandler Me.KeyPress, AddressOf Me.KeyPressed12: end sub13: 14: public sub KeyPressed(Sender as Object, e as KeyPressEventArgs)15: Microsoft.VisualBasic.MsgBox(e.KeyChar)16: e.Handled = True17: end sub18: 19: public shared sub Main()20: Application.Run(new Listing36)21: end sub22: end class23: End Namespace

In Zeile 11 stoßen Sie auf den Ereignishandler namens KeyPressed, welcherdem Ereignis KeyPress zugeordnet ist. In Zeile 14 deklarieren Sie den Ereignis-handler. Beachten Sie bitte, dass er ein KeyPressEventArgs-Objekt als Parameterübernimmt – dieser Name korrespondiert mit dem KeyPressEventHandler-Objekt, das wir weiter oben besprochen haben. In Zeile 15 zeigen Sie einfachdas gedrückte Zeichen in einem Meldungsfeld an und setzen dann in Zeile 16die Handled-Eigenschaft auf true. Abbildung 3.11 zeigt die entsprechende Bild-schirmausgabe, wenn das große A gedrückt wurde ((ª) + (a)).

Beachten Sie jedoch, dass lediglich Buchstaben, Zahlen und die (¢)-Taste das KeyPress-Ereignis auslösen. Um andere Tasten wie etwa (Strg), (Alt) und die Funktionstasten (F1)bis (F12) zu handhaben, müssen Sie die KeyUp- und KeyDown-Ereignisse verwenden. Erin-

Page 27: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

103

Ereignisbehandlung

nern Sie sich daran, dass diese Ereignisse Handler des Typs KeyEventhandler nutzen, sodass der zweite Parameter Ihrer Ereignishandler-Methode auf KeyEventArgs lauten muss:

Public Sub KeyReleased(Sender as Object, e as KeyEventArgs) 'ein wenig Codeend Sub

Das Objekt KeyEventArgs verfügt über mehrere Eigenschaften, die sich als nützlich erwei-sen, um festzustellen, welche Taste gedrückt wurde:

� Alt: Wahr- oder Falsch-Wert, der anzeigt, ob die (Alt)-Taste gedrückt wurde

� Control: zeigt an, ob die (Strg)-Taste gedrückt wurde

� Handled: entspricht der Handled-Eigenschaft des Objekts KeyPressEventArgs

� KeyCode: der Tastaturcode für die gedrückte Taste

� KeyData: die Tastendaten für die gedrückte Taste

� KeyValue: der Tastaturcode für die gedrückte Taste

� Modifiers: gibt Flags zurück, die anzeigen, welche Tasten und Zusatztasten (wie etwa(ª), (Strg) oder (Alt)) gedrückt wurden

� Shift: zeigt an, ob die (ª)-Taste gedrückt wurde

Jede Taste auf der Tastatur hat eindeutige KeyCode-, KeyData- und KeyValue-Werte. DieEigenschaften KeyCode und KeyValue sind üblicherweise gleich. KeyData weist bei den meis-ten Tasten den gleichen Wert wie die beiden anderen Eigenschaften auf, ist jedoch unter-

Abbildung 3.11: Solange Ihr Formular den Fokus besitzt, führt jeder Tastendruck die Key-Pressed-Methode aus.

Page 28: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

Mit Windows Forms arbeiten

104

schiedlich bei Zusatztasten (eine vollständige Referenz finden Sie bei der Keys- bzw.Tasten-Aufzählung in der Dokumentation des .NET Frameworks).

Mausereignisse finden in einer standardisierten Reihenfolge statt:

1. MouseEnter: sobald der Mauszeiger über das Formular gelangt

2. MouseMove: wenn der Mauszeiger sich über dem Formular bewegt

3. MouseHover: wenn der Mauszeiger einfach nur über dem Formular »schwebt« (d.h. ohne Bewegung oder Mausklick)

4. MouseDown: wenn man über dem Formular eine Maustaste drückt

5. MouseUp: wenn man die Maustaste wieder löst

6. MouseLeave: wenn der Mauszeiger das Formular wieder verlässt (sich vom Formularwegbewegt)

Die Ereignisse MouseEnter, MouseHover und MouseLeave liefern keine besonderen Informa-tionen und verwenden daher den standardmäßigen Ereignishandler EventHandler und dieEreignisparameter-Objekte EventArgs. Die Ereignisse MouseMove, MouseDown und MouseUpliefern hingegen spezifische Informationen und verwenden alle die MouseEventArgs-Objekte des Ereignishandlers MouseEventHandler:

public Sub MouseClick(Sender as Object, e as MouseEventHandler)

Das MouseEventhandler-Objekt liefert Information wie etwa die genaue Position des Maus-zeigers auf dem Bildschirm, welche Maustaste gedrückt wurde usw. Die Eigenschaftensind in Tabelle 3.3 zusammengefasst.

Eigenschaft Beschreibung

Button Holt die Information ein, welche Maustaste gedrückt wurde (MouseButtons.Left, MouseButtons.Middle, MouseButtons.None, MouseButtons.Right, MouseBut-tons.XButton1 oder MouseButtons.XButton2)

Clicks Die Anzahl von Mausklicks (ein Integerwert)

Delta Die Anzahl von Drehungseinheiten, um die sich das Mausrad bewegt hat

X Die x-Bildschirmkoordinate des Mauszeigers

Y Die y-Bildschirmkoordinate des Mauszeigers

Tabelle 3.3: Eigenschaften von MouseEventHandler

Page 29: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

105

Ereignisbehandlung

Drag & Drop

Das mit Windows eingeführte Merkmal des Drag & Drop, also des Klickziehens, erlaubt esdem Anwender, eine Art Abkürzung zu nehmen, indem er mit der Maus ein Symbol aufdem Bildschirm auf eine Anwendung zieht. Diese übernimmt die Datei, die vom Symboldargestellt wird, und verarbeitet sie. Haben Sie beispielsweise Microsoft Word geöffnet undziehen das Symbol eines Word-Dokuments darauf, öffnet Word dieses Dokument automa-tisch zur Bearbeitung. Klickziehen erlaubt Ihnen auch, nur mit der Maus Dateien auseinem Ordner in einen anderen zu verschieben oder zu kopieren.

Es ist recht einfach, eine Windows Forms-Anwendung für Drag & Drop fit zu machen. AlsErstes müssen Sie die Eigenschaft DragDrop des Formulars auf true setzen und dann denCode für die Ereignisse DragDrop, DragEnter, DragLeave oder DragOver schreiben. Die letz-ten drei Ereignisse sind den ähnlich benannten Mausereignissen sehr ähnlich; sie tretenauf, wenn ein Symbol in oder aus Ihrem bzw. über Ihr Formular bewegt wird. Alle dieseEreignisse verwenden den Objekt-Handler DragEventHandler und den EreignisparameterDragEventArgs. Wir werfen einen Blick auf die Eigenschaften dieses Parameters.

Die Eigenschaft AllowedEffects ist ein Indikator, der besagt, welche Drag & Drop-Aktionen stattfinden können. Wenn Sie etwa versuchen, eine Datei, die nur gelesen werdendarf, zu ziehen und abzulegen, können Sie diese Datei nur kopieren, nicht aber verschieben.Die Aktionen werden durch die DragDropEffects-Aufzählung angezeigt: DragDrop-Effects.All, DragDropEffects.Copy, DragDropEffects.Link, DragDropEffects.Move, Drag-DropEffects.None und DragDropEffects.Scroll. Alle diese Effekte entsprechen einfachenWindows-Funktionen.

Die Eigenschaft DragEventsArgs wiederum gibt den sich gerade ereignenden Effekt an.Dieser ist einer der oben aufgeführten DragDropEffects-Werte. Wenn der Benutzer etwaeine Datei zieht, während er die (Strg)-Taste gedrückt hält, wird versucht, eine Kopierope-ration durchzuführen, und die Effect-Eigenschaft wird DragDropEffects.Copy anzeigen.

Die Data-Eigenschaft enthält das Element, das gerade Gegenstand einer Drag & Drop-Operation ist. Ungeachtet seines Typs wird dieses Element vom IdataObject-Objekt darge-stellt, das zahlreiche unterschiedliche Objekttypen abbilden kann. (Nähere Informationenhierzu finden Sie in der Dokumentation zum .NET Framework.)

Die Eigenschaft KeyState verrät Ihnen, ob jeweils die Taste (ª), (Strg) oder (Alt)gedrückt ist, genau wie die Alt-, Control- und Shift-Eigenschaften der KeyUp- und KeyDown-Ereignisse. Die X- und Y-Eigenschaften schließlich sind die gleichen wie jene für Mau-sereignisse. Sie zeigen an, an welcher Stelle (im Koordinatensystem) sich zum Zeitpunktdes Ereignisses ein Element befand.

Page 30: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

Mit Windows Forms arbeiten

106

Änderungsereignisse

Jedes Mal wenn sich eine der Form-Eigenschaften ändert, ist damit normalerweise einEreignis verbunden. Wenn man beispielsweise die Text-Eigenschaft des Formulars ändert,wird das TextChanged-Ereignis ausgelöst.

Meist werden diese Ereignisarten für Validierungsroutinen verwendet. Wenn Sie etwa dieZahl der in Ihrem Formular verwendbaren Schriftarten begrenzen wollen, könnten Sieeinen Handler für das FontChanged-Ereignis erzeugen, der ungültige Benutzerauswahlenüberschreibt.

Ich werde hier nicht alle diese Ereignisse aufführen. Sie können feststellen, welche dassind, indem Sie einfach das Wort »Changed« (geändert) an die jeweiligen Eigenschaftenanhängen, über die Sie heute gelesen haben: TextChanged, CursorChanged, VisibleChangedusw. Alle diese Methoden verwenden Handler vom Typ EventHandler.

3.3 Zusammenfassung

Das Basisobjekt für alle anderen Objekte ist im .NET Framework – nomen est omen – dasObject-Objekt. Da es so allgemeingültig gefasst ist, wird es an verschiedenen Stellen ver-wendet, an denen ein spezialisiertes Objekt entweder nicht gebraucht wird oder sich nichtgenauer bestimmen lässt. Object verfügt über fünf Methoden – Equals, ReferenceEquals,GetHashCode, GetType und ToString –, die alle anderen .NET-Objekte erben.

Das indirekt von Object abgeleitete Objekt System.Windows.Forms.Form stellt üblicherweiseden Hauptbestandteil Ihrer Windows Forms-Anwendungen dar. Es stellt den Rahmen undHintergrund für weitere Bestandteile der Benutzerschnittstelle bereit und enthält selbsteine reiche Palette an Funktionen.

Das Form-Objekt besitzt 101 Eigenschaften, mit denen Sie praktisch jeden einzelnenAspekt der Benutzeroberfläche steuern können. Sie können Ihr Formular mit Hilfe derOpacity-Eigenschaft transparent machen, es mit der Eigenschaft FormBorderStyle nichtska-lierbar machen, und Sie können die Art und Weise der Benutzerinteraktion mit Hilfe derEigenschaften MaximizeBox, MinimizeBox, HelpButton, SizeGripStyle und ControlBox kon-trollieren.

Form verfügt zudem über zahlreiche Methoden wie etwa BringToFront oder Focus, die Siezur Steuerung der Bildschirmanzeige ausführen können.

Sie haben etwas über Ereignisse und die Nachrichtenschleife erfahren, die einer Anwen-dung das Untätigsein erlaubt, bis ein Benutzer eine Eingabe vornimmt. Das Form-Objektverfügt über Ereignisse, die anlässlich zahlreicher Benutzeraktivitäten ausgelöst werden,darunter Mausklick, Tastendruck und Drag & Drop.

Page 31: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

107

Fragen und Antworten

3.4 Fragen und Antworten

F Kann ich von einem selbst erstellten Formular erben? Wie werden dabei Eigenschaftenbehandelt?

A Das ist zutreffend; Sie können von jeder Klasse erben, es sei denn, sie ist mit demSchlüsselwort NonInheritable (in C# heißt es sealed) deklariert.

Der Umgang mit geerbten Eigenschaften ist häufig kompliziert. Schauen Sie sichals Beispiel folgenden Code an:

1: Imports System2: Imports System.Windows.Forms3: Imports System.Drawing4: 5: Public Class ClassA : Inherits Form6: private lblMessage as New Label7: 8: Public Sub New()9: lblMessage.Location = new Point(100,100)10: lblMessage.Height = 10011: lblMessage.Width = 20012: lblMessage.Text = "Hello World!"13: Me.Controls.Add(lblMessage)14: End Sub15: End Class16: 17: Public Class ClassB : Inherits ClassA18: private lblMessage as New Label19: 20: Public Sub New()21: lblMessage.Location = new Point(100,100)22: lblMessage.Height = 10023: lblMessage.Width = 20024: Me.Controls.Add(lblMessage)25: End Sub26: End Class27: 28: Public Class StartForm29: Public Shared Sub Main()30: Application.Run(New ClassB)31: End Sub 32: End Class

Wenn Sie diese Anwendung kompilieren und ausführen, wird das von ClassB defi-nierte Formular angezeigt. Beachten Sie, dass in dieser Klasse nirgends die Text-

Page 32: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

Mit Windows Forms arbeiten

108

Eigenschaft des in Zeile 18 deklarierten Bezeichnungsfelds (Label) gesetzt wird.Wenn Sie jedoch die Anwendung ausführen, enthält das Bezeichnungsfeld denText »Hello World!« Dieser Text wird in Zeile 12 in ClassA festgelegt.

All dies passiert nicht deshalb, weil das Bezeichnungsfeld von ClassB von ClassAgeerbt worden wäre, sondern vielmehr, weil im Konstruktor von ClassA einBezeichnungsfeld mit dem fraglichen Text erstellt und dem Formular hinzugefügtwird. Erinnern Sie sich daran, dass in jedem Konstruktor als Erstes ein Aufruf anden Konstruktor seiner Basisklasse erfolgt. Daher ist zur Ausführungszeit des Kon-struktors von ClassB bereits ein Bezeichnungsfeld mit den Worten »Hello World!«vorhanden. Sie können jedoch von ClassB aus dieses Bezeichnungsfeld nicht bear-beiten. Es ist nämlich in Zeile 6 als private deklariert und daher nur für ClassAzugänglich. Würden Sie es in public ändern, erhielten Sie eine Fehlermeldung,denn ClassB hätte das Bezeichnungsfeld lblMessage geerbt und Zeile 18 würdeversuchen, es zu redeklarieren – das ist leider keine gültige Operation.

Unterm Strich lässt sich also sagen, dass Vorsicht beim Erben eigener Klassenangebracht ist. Achten Sie ebenfalls auf den Kontext der Sicherheit, in dem Vari-ablen deklariert werden.

3.5 Workshop

Dieser Workshop soll Ihnen helfen, sich besser an die heute behandelten Begriffe zu erin-nern. Es hilft Ihnen sehr, die Antworten vollständig zu verstehen, bevor Sie weiterlesen.Die Antworten zu den Quizfragen und den Übungen finden Sie in Anhang A.

Quiz

Die Fragen 1 bis 3 beziehen sich auf das folgende Codefragment:

1: using System;2: using System.Windows.Forms;3: using System.Drawing;4: 5: public class MyForm : Form {6: private Label lblMessage = new Label();7: 8: public MyForm() {9: this.Text = "Hello World!";10: }11: }

Page 33: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen

109

Workshop

12: 13: public class StartForm {14: public static void Main() {15: Application.Run(new MyForm());16: }17: }

1. Was würde das folgende Statement liefern, wenn man es unter Zeile 9 platzierenwürde?

Console.Write(this.ToString());

2. Was würde der folgende Code liefern, wenn man ihn unter Zeile 9 platzieren würde?

Label lblTemp = new Label();Console.Write(lblTemp.Equals(this.lblMessage).ToString());

3. Was würde der folgende Code liefern, wenn man ihn unter Zeile 9 platzieren würde?

Label lblTemp = new Label();Console.Write(Object.ReferenceEquals(lblTemp, this.lblMessage).ToString());

4. Wahr oder falsch? Das KeyPress-Ereignis erfordert einen Handler vom Typ KeyEvent-Handler.

5. Nennen Sie die fünf Eigenschaften des Objekts MouseEventArgs.

6. Schreiben Sie ein einzelnes Statement in VB .NET, das die Breite eines Formulars aufein Drittel der Bildschirmhöhe festlegt.

7. Welche Eigenschaft kontrolliert, welche Schaltfläche aktiviert wird, sobald der Benut-zer die (ESC)-Taste gedrückt hat?

8. Welches ist der Standardwert von FormBorderStyle?

9. Welche drei Ereignisse verwenden das Paradigma, dass mit einer einzelnen Aktionzwei Ereignisse verknüpft sind?

Übungen

1. Erstellen Sie in C# eine Anwendung, die alle sechs Mausereignisse überwacht. ZeigenSie eine Meldung in einem Textfeld an, wenn die einzelnen Ereignisse auftreten.

2. Erstellen Sie in VB .NET eine Anwendung, mit der die Benutzer die EigenschaftenText, Height, Width und Opacity durch Werteingaben in eine TextBox und das Drü-cken einer EINGEBEN-Schaltfläche anpassen können.

Page 34: Mit Windows Forms arbeiten - bilder.buecher.de · So ruft etwa die Methode ConfigurationSettings.GetConfig Konfigurationseinstellungen aus einer Datei ab. Die Funktion liefert einen