Kapitel 1 Einfache Eingabe und Ausgabe
Meine Ausführungen beziehen sich auf Visual Studio 2010. Bei der
Arbeit mit dem Studio ergibt sich folgendes Bild als Beispiel:
Im Projektfenster schalten wir je nach Situation zwischen
* Projektmappen-Explorer
* Klassenansicht
* Eigenschaften-Manager und
*
Ressourcenansicht um.
Außerdem gibt es noch den Team Explorer, den wir aber in unserem
Einstieg nicht verwenden.
Im Arbeitsbereich ist im Bild eine Form der Ressource sichtbar. Um sie
aufrufen zu können, ist die Ressourcenansicht zu wählen.
Wenn wir ein Ressourcen-Element (im Bild ein 'Edit Control') markieren,
erscheint automatisch rechts das Eigenschaftenfenster zum editieren.
Ein neues Ressourcen-Element holen wir aus der Toolbox rechts oben
neben dem Eigenschaftenfenster bzw. über die obere Menüleiste:
Ansicht --> Toolbox.
Wollen wir Quelldateien im Arbeitsbereich editieren, wählen wir
den Projektmappen-Explorer, öffnen die Baumstruktur und
wählen mit Doppelklick die Quelldatei aus:
Soweit zur Oberfläche des Studios.
Aufgabenstellung
Nun wollen wir unser erstes Programm entwickeln. Es soll nach Eingabe
von Breite und Länge eines Rechtecks den Flächeninhalt
berechnen und das Ergebnis anzeigen.
Nach Aufruf des Visual Studios 2010 legen wir eine neue Projektmappe an:
Datei --> Neu --> Projekt...
Wir wählen die Vorlage MFC, dann MFC-Anwendung und tragen den
Namen BEA1 ein. Für den Ort Ihrer Projekte müssen Sie sich
selbst entscheiden.
Nach 'OK' werden weitere Einstellungen gefragt:
Wir nehmen die Einstellungen wie im Bild vor und klicken 'Fertig
stellen'. Die Wahl der statischen Bibliothek hat den Vorteil, dass wir
unser fertiges Programm auf jeden Windows-Rechner auch ohne vorhandener
DLL der MFC verwenden können.
Nun wird im Arbeitsbereich die Ressource des Hauptfensters unseres Programms angezeigt:
Sehr praktisch sind die Lineale links und oben. Mit einen Klick
erzeugen Sie sich eine Ausrichtungslinie für das ordentliche
Ausrichten der Ressourcenelemente. Sollten Sie Ihre Lineale noch nicht
sehen, dann klicken Sie auf Format --> Einstellungen für
Führungslinien
und schalten sie ein.
Hinweis: Sollte einmal die Ressource Ihres Hauptfenster nicht im
Arbeitsbereich sein, dann holen Sie sich die Ressource durch folgende
Schritte wieder rein:
* Im Projektfenster Ressourcenansicht wählen
* Die Baumstruktur mit Klick auf die Winkel > öffnen:
Jetzt Doppelklick auf IDD_BEA1_DIALOG und die Ressource des
Hauptfensters steht zur weiteren Bearbeitung im Arbeitsbereich zur
Verfügung.
Führen Sie folgende Schritte durch:
* Ändern Sie die Überschrift des Hauptfensters in 'Beispiel 1
Eingabe/Ausgabe' (Eigenschaftenfenster --> Caption)
* Entfernen Sie den 'Abrechen'-Button und den Static Text 'TODO:...'
* Belassen Sie den OK-Button - aber schieben Sie ihn nach rechts oben.
* Fügen Sie Maximize Box und Minimize Box hinzu (Eigenschaftenfenster)
* Übersetzen und testen Sie (Erstellen / Debuggen)
Es sollte dann so aussehen:
Wenn das Erstellen erfolgreich war, steht im Ausgabefenster etwa folgende Meldung:
Debuggen --> Starten ohne Debuggen
Jetzt ist das Programm mit dem Hauptfenster präsent. Sie
können die 3 Knöpfe rechts oben (minim., maxim. abbr.) und
den OK-Button ausprobieren.
Sie funktionieren alle, ohne dass Sie eine Zeile Code geschrieben haben.
Nun kommen wir zu unserer eigentlichen Aufgabe. Als erstes rufen wir
die Toolbox auf. (ganz rechts oben ist ein Sticky-Knopf oder über
das Menü Ansicht --> Toolbox)
Für die Eingabe der Breite benötigen wir 'Edit Control' und
für Texte "Breite" und "in cm" die Elementressource 'Static Text'.
Wir klicken die Elemente in der Toolbox an und ziehen sie mit der Maus
an die passende Stelle unseres Dialogfensters als Rechteck auf:
:
Wenn die 'Static Text'-Elemente markiert sind ändern wir im
Eigenschaftsfenster bei Caption den Text "Statisch" in "Breite" bzw.
"in cm" um. Nach Markierung der 'Edit Control' finden wir im
Eigenschaftsfenster bei ID: IDC_EDIT1 . Wir ändern den Namen des
Identifiers in IDC_BREITE . Entsprechendes können Sie nun darunter
für die Eingabe der Länge einbauen. Der Identifier hat den
Namen IDC_LAENGE .
Für die Ergebnisse fügen wir einen Rahmen der Überschrift "Ergebnisse" ein. Dazu benutzen wir die 'Group Box'.
Den Button bezeichnen wir mit "Berechnung ausführen" und geben ihm die ID IDC_BERECHNEN.
Von der 'Edit Control' für das Ergebnis ändern wir die ID in
IDC_FLAECHE um und setzen die Eigenschaft 'Read Only' auf True .
Damit wird verhindert, dass der Benutzer des Programms an der Stelle
Eingaben oder Änderungen machen kann.
Die Texte "Fläche" und "in cm²" setzen wir wieder mit dem
Ressourcenelement 'Static Text' in der Eigenschaft Caption ein.
Da jetzt alle Ressourcen für unser Programm vorhanden sind,
sollten wir es zur Kontrolle auf Fehler wieder einmal übersetzen.
(Erstellen --> BEA1 neu erstellen)
In der Klassenansicht des Projektfensters können Sie die Klasse
des Anwendungsprogramms CBEA1App mit der globalen Variable theApp
sehen. Bei den Macros und Konstanten finden Sie auch die selbst
erzeugten Identifier IDC_BREITE usw. wieder.
Was noch fehlt sind die Variablen und Funktionen hinter den Ressourcenelementen, die die Eingaben aufnehmen und verarbeiten.
Variablen und Funktionen
Alles was wir in der Dialogbox eintippen ist vom Typ eine Zeichenkette
- ebenso das später angezeigte Ergebnis. Aber mit Zeichenketten
kann man nicht direkt rechnen. Also benötigen wir für jede
dieser Zeichkettenvariable (CString) auch die entsprechende
Double-Variable.
An entsprechender Stelle im Programm erfolgen dann mehrfach Typumwandlungen.
Ressource |
ID |
CString |
double |
Breite |
IDC_BREITE |
m_strBreite |
m_dBreite |
Länge |
IDC_LAENGE |
m_strLaenge |
m_dLaenge |
Flächeninhalt |
IDC_FLAECHE |
m_strFlaeche |
m_dFlaeche |
Die Bezeichnung der Membervariablen folgt einer sinnvollen Ordnung: Der
Name beginnt stets mit m_ gefolgt von der Kurzbezeichnung des Types und
dann gefolgt vom eindeutigen Namen.
Die Membervariablen definieren wir mit Hilfe des Klassen-Assistenten
(MFC Class Wizard): Aufruf im Arbeitsfenster mit Rechtsklick
--> Klassen-Assistent oder vom Menü aus: Projekt -->
Klassen-Assistent.
Wir wählen den Reiter 'Membervariablen' , nacheinander die Zeilen
IDC_BREITE, IDC_LAENGE, IDC_FLAECHE und fügen die jeweilige
CString - Membervariable hinzu:
Mit 'Übernehmen' und 'OK' schließen wir den
Klassen-Assistenten. Für das Definieren der Double -
Membervariablen öffnen wir im Arbeitsfenster mit Rechtsklick
--> Variable hinzufügen oder vom Menü aus:
Projekt --> Variable hinzufügen... den Assistenten zum
Hinzufügen von Membervariablen:
Hinweis: Bitte nicht den Haken bei Steuerelementvariable setzen!
Wenn wir jetzt im Projektfenster die Klassenansicht einstellen und auf
CBEA1Dlg klicken, werden unten die neuen Membervariablen angezeigt:
Jedes Windows-Programm ist eine Ansammlung kleinerer Fenster wie z.B.
'Edit Control', 'Buttons' usw. Windows wartet auf Ereignisse, die durch
Eingabegeräte wie Maus, Tastatur, Fingertouch usw. ausgelöst
werden. Dabei beachtet Windows genau den Ort, wo das geschieht. Wenn
Sie in ein 'Edit Control'-Fenster etwas reinschreiben möchten,
muss dieses Fenster vorher den Focus bekommen, sonst geht die Eingabe
ins Leere. Man erkennt, ob der Focus z.B. auf das Eingabefeld Breite
gerichtet ist, an dem blinkenden senkrechten Strich. Man kann den Focus
durch die Tabulatortaste oder den Mausklick wechseln. Jedes Ereignis
wie ein Tastendruck oder ein Mausklick löst in Windows ein
Ereignis aus: Windows notiert
* wo das Ereignis ausgelöst wurde (z.B. am Button mit der ID IDC_BERECHNEN) und
* was passiert ist (z.B. linke Maustaste wurde gedrückt => BN_CLICKED) .
* Anschließend schaut Windows in einer Tabelle nach, zu
welchen Ereignis welche Funktion aufgerufen werden soll. Ein Teil
dieser Ereignisse und zugehöriger Funktionen sind bereits
definiert.
Z.B. ist die Funktion ONOK an verschiedene Ereignisse gleichzeitig
gebunden. Der Aufruf erfolgt, wenn auf die 'OK'- , 'Jetzt
Übernehmen'-, 'Schließen'-Schaltfläche oder
'Enter'-Taste gedrückt wird.
Wir überprüfen das gleich einmal. Übersetzen Sie das Programm und rufen Sie es auf.
Wenn Sie jetzt nach Eingabe eines Wertes z.B. für die Länge
die Enter-Taste drücken, dann... - wird unser Programm
sofort beendet! Wenn wir das verhindern wollen, müssen wir
für das Ereignis Enter-Taste drücken eine eigene Funktion
schreiben, die nichts tut.
Wir rufen dazu den Klassen-Assistenten auf und fügen für die
Objekt-ID IDOK mit der Nachricht BN_CLICKED eine Funktion (Handler
hinzufügen) mit den Namen OnBnClickedOk ein.
Wir bestätigen den Namensvorschlag und drücken 'Code
bearbeiten'. Anschließend öffnet sich im Arbeitsfenster die
Datei BEA1Dlg.cpp mit der neuen Funktion:
void CBEA1Dlg::OnBnClickedOk()
{
// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
CDialogEx::OnOK();
}
Unsere Funktion ruft die vordefinierte Routine OnOK() auf, die das
Programm beendet. Damit das nicht mehr passiert, kommentieren wir die
Zeile aus:
void CBEA1Dlg::OnBnClickedOk()
{
// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
// CDialogEx::OnOK();
}
Jetzt muss aber unser OK-Button eine neue Funktion bekommen, da er
sonst ebenfalls nichts bewirkt. Wir rufen in der Ressourcenansicht
unsere Dialogbox auf und bearbeiten den OK-Button.
Er bekommt die Beschriftung "Beenden" und die ID IDC_BEENDEN ..
Mit dem Klassen-Assistenten richten wir für die folgenden Ereignisse Funktionen ein:
Objekt-ID |
Nachricht |
Funktion |
IDC_BREITE |
EN_KILLFOCUS |
OnKillfocusBreite |
IDC_LAENGE |
EN_KILLFOCUS |
OnKillfocusLaenge |
IDC_BERECHNEN |
BN_CKICKED |
OnClickedBerechnen |
IDC_BEENDEN |
BN_CLICKED |
OnClickedBeenden |
Mit 'Handler hinzufügen...' wird der angebotene Name jedesmal akzeptiert.
Nun können wir die Funktionen mit Code füllen. Wir gelangen
zu den noch leeren Funktionen über den Klassen-Assistenten mit
'Code bearbeiten' oder wir nehmen beim Projektfenster die Ansicht des
Projektmappen-Explorers:
Und klicken jetzt doppelt auf die Quelldatei BEA1Dlg.cpp .Am Ende der Datei finden wir unsere neuen Funktionen.
void CBEA1Dlg::OnKillfocusBreite()
{
// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
}
* Wir tragen folgenden Code ein:
void CBEA1Dlg::OnKillfocusBreite()
{
// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
GetDlgItemText ( IDC_BREITE , m_strBreite ) ; // Eingabestring bei WINDOWS abholen
//long pointer to const TCHAR string (LPCTSTR)
m_dBreite = _tstof((LPCTSTR)m_strBreite);
// auf 1 Stelle nach dem Komma abschneiden
m_dBreite = ( (long int) ( 10.0 * m_dBreite ) ) / 10.0 ;
//Macro _T bewirkt die Anwendung von UNICODE (wenn nicht gesetzt, kommt Fehlermeldung !
m_strBreite.Format ( _T("%2.1f") , m_dBreite ) ; // abgeschnittenen Wert editieren
SetDlgItemText ( IDC_BREITE , m_strBreite ) ; // und in die 'Edit Control' stellen
}
* Jetzt tragen Sie bitte den entsprechen Code für die Funktion OnKillfocusLaenge() ein.
* In die Funktion OnClickedBeenden() fügen wir die Anweisung ein, die wir vorher in OnBnClickedOk() auskommentiert haben.
* Jetzt füllen wir für die Funktion OnClickedBerechnen() noch folgenden Code ein:
void CBEA1Dlg::OnClickedBerechnen()
{
// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
m_dFlaeche = m_dBreite * m_dLaenge; // Fläche berechnen
CString strValue;
strValue.Format ( _T("%4.2f") , m_dFlaeche ) ; // Fläche editieren
SetDlgItemText ( IDC_FLAECHE , strValue ) ; // und in die EditBox stellen
}
Nun noch eimal übersetzt und Sie können das Programm nutzen.