Beispiel 2: Grundlagen der MFC

Dieses Beispiel zeigt die Grundlagen der MFC:
-FormView
-Dialog
-Document-View-Architektur

In der Document-Klasse wird ein String gehalten.
In einer FormView wird in einem nicht editierbaren Textfeld dieser String angezeigt.
Das Bearbeiten erfolgt über einen separaten Dialog in der FormView.
Der String ist in einer Datei serialisierbar.
Hier gibt es das Teil zum Download: MFCBasics.zip

Schritt 1: Anwendungsgerüst

Erstellen des Anwendungsgerüsts (SDI-Anwendung) gemäß Beschreibung von Hr. Dreher.
Im Schritt "Document Template Strings" habe ich eine "File Extension" angegeben, da speichern unterstützt werden soll.

Schritt 2: In der Document-Klasse eine Membervariable anlegen

Dazu in der Klassenansicht / Class View die Document-Klasse anwählen und per Rechtsklick "Add" -> "Add Variable..." wählen.
Add Variable (1)
Im erscheinenden Dialog wählt man den Gültigkeitsbereich der Variablen (natürlich private !), den Datentyp ("CString" muss beim ersten Mal im Textfeld eingegeben werden) und gibt ihr einen Namen. Unter "Comment" kann man einen Kommentar eingeben, der in der Header-Datei für die Variable angezeigt wird.
Add Variable (2)
Außerdem fügen wir eine Get- und eine Set-Methode zu. Dazu per Rechtsklick in der "Class View" die Option "Add Function" wählen.
Einstellungen für GetText:
GetText zufügen
Den Code ändern wir auf:
	return this->m_Text;

Einstellungen für SetText:
SetText zufügen
Den Code ändern wir auf:
	this->m_Text = pText; 

Schritt 3: FormView bestücken

Die FormView öffnen, indem man in der "Resource View" in der Kategorie "Dialog" auf IDD_MFCBASICS_FORM doppelklickt.
Falls die "Resource View" noch nicht gefunden wurde, im "Solution Explorer" im Projekt unter "Resource Files" auf die Datei mit der Endung "rc" doppelklicken.
Jetzt holen wir aus der Toolbox ein "Edit Control" und platzieren es auf der FormView.
Per Rechtsklick gehen wir in die "Properties" und geben dem Ding unter "ID" einen gescheiten Namen (statt IDC_EDIT1). Außerdem setzen wir "Read Only" auf "true", da wir den Text per Dialog eingeben wollen.
Add Edit Control
Wir könnten den Wert aus der Document-Klasse von der MFC setzen lassen (siehe dazu später den Dialog), doch diesmal machen wir es manuell: Wir wechseln in die "Class View" unserer View-Klasse. Hier überladen wir die Methode "OnUpdate". Der Weg dahin ist sehr verschlungen und führt über einen unscheinbaren Button: Wir öffnen die cpp-Datei der View im "Solution Explorer". Dann wechselt man zum "Properties"-Fenster. In der Toolbar-Leiste gibt es einen Button mit unscheinbarem Icon und dem Tooltip "Overrides". Klickt man diesen an sieht man alle überladbaren Methoden aus den Basisklassen. Wir suchen "OnUpdate" und wählen in der Combobox die Option " OnUpdate" (da wir noch keine bestehende Methode haben).
OnUpdate
Wir werden in den Codeeditor gesprungen und sehen eine neue Methode vor uns.
Folgende Codezeile wird eingefügt:
	((CEdit *) this->GetDlgItem (IDC_EDIT_TEXT))->SetWindowText ( this->GetDocument ()->GetText()); 

Schritt 4: Dialog zufügen

Wir erzeugen eine Dialogklasse zum Eingeben eines Strings. Dazu z.B. im Contextmenü des "Solution Explorer" die Option "Add" -> "Add Class..." wählen. In dem Dialog wird in der Kategorie "MFC" die Option "MFC Class" gewählt.
Dialog zufügen (1)
Im nächsten Dialog folgende Einstellungen vornehmen:
Dialog zufügen (2)
Hier: wir geben einen Namen an und ändern die Basisklasse auf CDialog. Der Assistent schlägt automatisch einen Namen für die Dialogfeld-Resource vor.

Wir plazieren ein Edit Control namens IDC_EDIT_TEXT im Dialog ein.
Dieses verknüpfen wir mit einer Membervariable, deren Wert automatisch von der MFC ins Textfeld geschrieben wird. Hierzu Rechtsklick auf das Edit Control, im Contextmenü "Add Variable" wählen. In dem erscheinenden Assistenten gibt man links einen Variablen-Namen ein. Im rechten Teil können wir wählen, mit welchem Control dieser Wert verknüpft werden soll. Da wir vom Textfeld kommen, ist IDC_EDIT_TEXT bereits gewählt. Unter "Category" müssen wir allerdings noch von "Control" auf "Value" umschalten, da ansonsten nur eine Membervariable vom Typ "CEditControl" angelegt würde. Durch Ändern der "Category" wird links automatisch der "Variable Type" geändert. Aus Faulheit belassen wir die Variable auf "public".
Variable für Textfeld zufügen

Schritt 5: Dialog anzeigen

Auf der FormView einen Button "Edit" mit dem Namen IDC_BUTTON_EDIT plazieren. Einen Handler für das Klick-Event zufügen. Hierzu gibt es verschiedene Möglichkeiten:
a) Rechtsklick auf den Button, "Add Event Handler...". Es erscheint folgender Dialog:
Button-Click-Handler, Variante 1
b) In den Properties auf den Button "Events" gehen und bei "BN_CLICKED" einen Handler zufügen.
Button-Click-Handler, Variante 2
In der so erzeugten Methode "OnBnClickedButtonEdit" folgendes einfügen:
	MFCBasicsDialog* dialog = new MFCBasicsDialog(this);
	dialog->m_Text = this->GetDocument()->GetText();
	if (dialog->DoModal () == IDOK)
	{
		this->GetDocument()->SetText ( dialog->m_Text);
		//Beim UpdateAllViews NULL übergeben, damit auch
		//unser Fenster sein Update bekommt.
		this->GetDocument()->UpdateAllViews (NULL);
	}
	//Speicher wieder freigeben.
	delete dialog;
Natürlich muss vorher noch der Header des Dialogs eingebunden werden.
	#include "MFCBasicsDialog.h"

Serialisierung

Hierzu die Methode "Serialize" unserer Document-Klasse so modifizieren:
	void CMFCBasicsDoc::Serialize(CArchive& ar)
	{
		if (ar.IsStoring())
		{
			// TODO: Hier Code zum Speichern einfügen
			ar << this->m_Text;
		}
		else
		{
			// TODO: Hier Code zum Laden einfügen
			ar >> this->m_Text;
		}
	}
Fertisch !

Anmerkungen

Wenn man das Beispiel nicht mehr benötigt, sollte man die Registry ausmisten. Welche Keys vom Programm erzeugt werden kann man in der Datei "MFCBasics.reg" ablesen, die im Anwendungsverzeichnis liegt. Diese alle löschen !


Version 1.0.0.1, Stand 04.04.2005
Historie:
1.0.0.1 (04.04.2005): "delete dialog" in OnBnClickedButtonEdit eingefügt.