Beispiel 1: Einfachstes denkbares MFC-Beispiel

Inhalt:

Schritt 1: Anwendungsgerüst
Schritt 2: In der CView-Klasse ein bißchen Zeichenlogik zufügen
Klassendiagramm
Doxygen-Doku

Dieses Beispiel zeigt die minimalst mögliche MFC-Anwendung, nämlich eine CView mit minimalen Zeichenoperationen.
Hier gibt es das Beispiel zum Download: MFCMinimal.zip

Schritt 1: Anwendungsgerüst

Erstellen des Anwendungsgerüsts (SDI-Anwendung) gemäß Beschreibung von Hr. Dreher.
Über "Datei" -> "Neu" -> "Projekt..." ein neues Projekt erstellen. Als Projekttyp wird "Visual C++" -> "MFC" gewählt. Wir geben dem Projekt den Namen "MFCMinimal".
Projekt erstellen (1)

Es öffnet sich der "MFC-Anwendungs-Assistent".
Wir wählen links den Punkt "Anwendungstyp" und rechts "Einfaches Dokument".
Projekt erstellen (2)

Die weiteren Einstellungen werden auf den Default-Werten belassen. Im letzten Schritt ("Generierte Klassen") ist im Unterschied zu Hr. Drehers Anleitung die Basisklasse der View-Klasse "CMFCMinimalView" vom Typ "CView". Die in Hr. Drehers Anleitung deaktivierte Druckunterstützung (Schritt "Erweiterte Features") können wir belassen, da eine CView druckbar ist.

Schritt 2: In der CView-Klasse ein bißchen Zeichenlogik zufügen

Die Datei "MFCMinimalView" öffnen und die Methode "OnDraw" öffnen. Zuallererst einmal muss der auskommentierte Parameter "pDC" einkommentiert werden. Der Methodenkopf sollte also so aussehen (rot der zu entfernende Code):
	void CMFCMinimalView::OnDraw(CDC* /*pDC*/) 
In der Methode nach dem TODO folgenden Code einfügen:
	pDC->Rectangle (100, 100, 200, 200);
Dadurch wird ein Rechteck an der Stelle 100/100 bis 200/200 gezeichnet.
Das Codebeispiel enthält außerdem noch ein Stück Code mit einem erweiterten Zeichenbeispiel (Hintergrund- und Vordergrundfarbe geändert):
	//Ein Rechteck in anderer Vordergrund- und Hintergrundfarbe.
	//Dazu müssen wir uns einen Brush definieren.
	CBrush *brushRed = new CBrush (RGB (255, 0, 0) );
	CPen *penBlue = new CPen (PS_SOLID, 2, RGB (0, 0, 255) );
	pDC->SelectObject (brushRed);
	pDC->SelectObject (penBlue);
	//Noch ein Rechteck, diesmal gefüllt...
	pDC->Rectangle (100, 210, 200, 310);
	//Den Brush und den Pen wieder freigeben:
	delete brushRed;
	delete penBlue;
Jetzt können wir das Programm über das Menü "Debuggen" -> "Debuggen starten" ausführen, ober über "F5", oder über den entsprechenden Toolbar-Button.

Beachtet was beim Beenden des Programms im "Output"-Fenster steht, wenn die beiden "delete"-Zeilen auskommentiert werden:
	Detected memory leaks!
	Dumping objects ->
	c:\temp\vs2005\mfcminimal\mfcminimal\mfcminimalview.cpp(63) : {179} client block at 0x0045A590, subtype c0, 8 bytes long.
	a CPen object at $0045A590, 8 bytes long
	c:\temp\vs2005\mfcminimal\mfcminimal\mfcminimalview.cpp(62) : {175} client block at 0x004597E8, subtype c0, 8 bytes long.
	a CBrush object at $004597E8, 8 bytes long 
Also immer schön den Speicher aufräumen !


Klassendiagramm

Hier gibt es das Klassendiagramm als Together-Architect-1.1-XML-Export (Default-Dateiformat-Option): MFCMinimal.xml
Klassendiagramm


Doxygen-Doku

Im letzten Schritt erzeugen wir die Doxygen-Doku. Im Beispiel verwende ich den DoxyWizard.
Nach dem Start des Wizards auf "Wizard..." klicken.
Doxywizard starten
Auf der Karteikarte "Project" geben wir den Projektnamen a. Im Feld "Project version or id" können wir einen beliebigen Text angeben. Das "Source code directory" angeben (hier liegen die .cpp- und .h-Dateien). Als Destination-Directory würde ich das gleiche Verzeichnis verwenden wie für den Quellcode. Grund: die generierte HTML-Doku landet in einem Unterverzeichnis "html".
Doxywizard: Project
Auf der Karteikarte "Mode" sollten wir sicherstellen dass "Optimize for C++ output" aktiviert ist (Default).
Doxywizard: Mode
Auf der Karteikarte "Output" entfernen wir den Default-Haken bei "LaTex", nur HTML sollte aktiv sein.
Doxywizard: Output
Die Karteikarte "Diagrams" können wir ignorieren, da kam bei mir nix raus...

Zurück im Hauptfenster müssen wir die Config speichern um sie später immer wieder zu laden. Da die Pfade allerdings absolut sind würde ich die Doku nicht zwischen PCs austauschen. Ohne das Speichern können wir das Tool nicht starten.

Außerdem müssen wir ein Working Directory angeben. Ich weiß nicht wozu, scheinbar reicht hier "c:\temp".
Doxywizard: Working Directory

Jetzt auf "Start" klicken und die Generierung läuft. Im Doc-Verzeichnis können wir die index.html öffnen um uns die Doku anzuschauen.

Über den Button "Expert..." können wir übrigens die Sprache der generierten Doku umschalten:
Doxywizard: Language

Im folgenden einige Beispiel, aus der Doku der Klasse CMainFrame:
Eine Klassendoku kann so aussehen:
	/**\brief Hauptfenster der Anwendung.
	 *
	 * Vom Klassenassistenten generiert, keine Änderungen
	 */
	class CMainFrame : public CFrameWnd
	{  
Besonderheit: durch \brief wird der gesamte Text bis zur nächsten Leerzeile als Kurzkommentar in den Titel der Doku-Seite gepackt. Das Erzeugen von Kurzbeschreibungen wird in den Experten-Optionen auf der ersten Karteikarte ("Project") mittels der Checkbox "BRIEF_MEMBER_DESC" ein-/ausgeschaltet, im Default ist es aktiv.

Eine Methodendoku kann so aussehen:
	/**Initialisierung des Fensters vor dem Erzeugen.
	 * Hier passiert nichts.
	 * @param cs Mittels dieser CREATESTRUCT kann das Layout des Fensters geändert werden.
	 * @return 0 bei Fehlern, jeder andere Wert im Erfolgsfall.
	 */
	virtual BOOL PreCreateWindow(CREATESTRUCT& cs); 
Also eigentlich wie JavaDoc-Methodendeklarationen.
Wer es ganz exakt machen will kann auch hier eine Kurzbeschreibung (\brief) angeben.


Version 1.2.1.0, Stand 16.04.2006
Historie:
1.0.0.0 Erstellt (02.04.2006)
1.1.0.0 Klassendiagramm (10.04.2006)
1.2.0.0 DoxyGen-Anleitung, Projekt hat DoxyGen-Kommentar. (12.04.2006)
1.2.1.0 DoxyGen-Anleitung: Mini-HowTo. Code: Methodenparameter und -Rückgabewerte, Kurzbeschreibungen der Klassen. Falsch verlinktes Bild bei der DoxyGen-Sprachumschaltung. (16.04.2006)