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:
BEA 2
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:
BEA 3

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...
BEA 4
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:
BEA 5
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:
BEA 6
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:
BEA 7
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:
BEA 8
Wenn das Erstellen erfolgreich war, steht im Ausgabefenster etwa folgende Meldung:
BEA 9
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)
BEA 10
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:
BEA 11:
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.
BEA 12
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.
BEA 13
Wir wählen den Reiter 'Membervariablen' , nacheinander die Zeilen IDC_BREITE, IDC_LAENGE, IDC_FLAECHE und fügen die jeweilige CString - Membervariable hinzu:
BEA 14
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:
BEA 15
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:
BEA 16

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.
BEA 17
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

BEA 18
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:
BEA 19
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.