Zeichnen mit MFC Erweiterung 1


Einleitung

Um diese Anleitung nicht zu lang werden zu lassen, schreibe ich immer nur die Dinge auf, die verändert werden müssen. Bei Codeabschnitten werden die Teile, die von mir verändert wurden fett geschrieben.

Beispiel

Aufgabe

Das Programm Zeichner soll so erweitert werden, dass jeder Strich mit der aktuell gesetzten Zeichenfarbe und mit der aktuellen Liniendicke gezeichnet wird. Anfangs ist die Farbe schwarz und die Liniendicke 1. Die Farbe kann mittels eines schon definierten Dialogs geändert werden können (das heißt den gibts schon, muss nor noch verwendet werden). Für die Strichdicke soll ein eigener modaler Dialog existieren, in dem sie geänder werden kann.

Lösung in Prosa

  1. Zuerst müssen Variablen für die Farbe und die Liniendicke angelegt werden.(Zusätzlich zu Start- und Endpunkt)
    Mit der rechten Maustaste auf die Klasse CZeichnerView drücken und Member-Variable hinzufügen... auswählen. Für die Farben braucht man den Variablentyp COLORREF und als Name für die Variable nehmen wir am Besten strichfarbe. Das Ganze nun noch ein zweiter Mal für die Strichdicke : Variablentyp=int Name=strichdicke.

  2. Nun müssen die Variablen noch initialisiert werden. Dies macht man im Konstruktor der Klasse CZeichnerView. Wie man den findet steht im ersten Dokument für den Zeichner.
    Der müsste dann ungefähr so aussehen:
    CZeichnerView::CZeichnerView()
    {
    	// ZU ERLEDIGEN: Hier Code zur Konstruktion einfügen,
    	startpunkt = CPoint(0,0);
    	endpunkt = CPoint(0,0);
    
    	strichdicke = 1;
    	// auf Schwarz setzen
    	strichfarbe = RGB(0,0,0);
    }
    
  3. Nun muss die Farbe auch geändert werden können. Dazu verwendet man am Besten den schon vordefinierten Dialog CColorDialog. Zuerst brauchen wir aber einen Button in der Symbolleiste für den Dialog.
    Im Visual C++ auf der linken Seite von der Ansicht der Klassen auf die Ansicht der Ressourcen wechseln. Dann auf Toolbar doppelt klicken und auf IDR_MAINFRAME doppelt klicken. Es öffnet sich ein Fenster, in dem ein Symbol hinzugefügt werden kann. Nun auf das letzte, leere Symbol klicken und etwas zeichnen.
    Nun wieder auf das letzte, nun nicht mehr leere Symbol doppelt klicken. -> es öffnet sich ein Dialogfeld, in dem man dem Button einen Namen geben kann.
  4. Der Button braucht noch einen Handler, der aufgerufen wird, wenn der Button gedrückt wird.
    Ansicht -> Klassen-Assistent
    In der Drop-Down Liste : Klassenname muss CZeichnerView ausgewählt werden, weil der Handler in diese Klasse gehört, weil sich dort auch die Daten befinden, die mit ihm manipuliert werden sollen.

    Funktion hinzufügen... -> OK -> Code bearbeiten...
  5. Nun befindet man sich direkt beim Handler. Der sollte nun den Dialog aufrufen und wenn der Dialog mit OK bestätigt wird die aktuelle Farbe auf die ausgewählte ändern. Der Handler sollte dann so aussehen:
    void CZeichnerView::OnFarbendialog() 
    {
    	// TODO: Code für Befehlsbehandlungsroutine hier einfügen
    	
    	CColorDialog dia;
    
    	// Dialog modal ausführen
    	if (dia.DoModal() == IDOK)
    	{
    		// Wenn OK gedrückt wurde aktuelle Farbe ändern
    		strichfarbe = dia.GetColor();
    	}
    }
    
  6. Jetzt muss die Farbe noch vor jedem Zeichnen eines Striches eingestellt werden. (Visual C++ weiß noch nichts von der Farbänderung) Dazu muss der Funktion OnDraw der Klasse CZeichnerView noch ein bisschen Code hinzugefügt werden.
    Die Funktion sollte dann so aussehen:
    void CZeichnerView::OnDraw(CDC* pDC)
    {
    	CZeichnerDoc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    
    	CPen *oldpen,*newpen;
    
    	// Neuen Zeichenstift anlegen
    	newpen = new CPen(PS_SOLID,strichdicke,strichfarbe);
    	// Neuen Stift einstellen, alten merken
    	oldpen = pDC->SelectObject(newpen);
    
    	// Verschiebe Grafikcursor zu Position startpunkt (ohne zu zeichnen)
    	pDC->MoveTo(startpunkt);
    	// Zeichne Linie zum endpunkt
    	pDC->LineTo(endpunkt);
    
    	// wieder alten Stift einstellen
    	pDC->SelectObject(oldpen);
    	// neuen Stift wieder löschen
    	delete newpen;
    
    	// ZU ERLEDIGEN: Hier Code zum Zeichnen der ursprünglichen Daten hinzufügen
    }
    
  7. Nun funktionert das ändern der Farbe. (Kann schon ausprobiert werden :-) Jetzt brauche wir noch einen modalen Dialog für das ändern der Strichdicke. (den muss man jetzt selber machen)

    ->Dazu wieder auf die Ansicht der Ressourcen wechseln.
    -> Dort auf Dialog doppelt klicken und dann mit rechten Maustaste auf Dialog klicken.
    -> Auf Dialog einfügen klicken.
    Es kommt nun ein leerer Dialog mit dem Namen IDD_DIALOG1 hinzu.
  8. -> Ein neues Steuerelement 'Text' einfügen
    -> mit der rechten Maustaste darauf klicken, Eigenschaften anklicken
    -> Einen anderen Titel eingeben
  9. -> Ein neues Steuerelement 'Eingabefeld' einfügen
    -> mit der rechten Maustaste darauf klicken, Eigenschaften anklicken
    -> Einen anderen Namen geben

    Nun sollte man dem Dialog noch einen anderen Namen geben:
    -> mit der rechten Maustaste auf die Titelleiste des Dialogs klicken
    -> Eigenschaften
    -> Namen ändern
    -> Titel ändern
    Der Dialog sollte in etwa so aussehen:
  10. Nun braucht man noch eine Klasse für den Dialog.
    -> Ansicht -> Klassen-Assistent... -> es öffnet sich automatisch der folgende Dialog -> einfach auf OK klicken
  11. Die Klasse braucht noch einen Namen. Ich hab sie StrichKlasse genannt.
    -> Name eingeben
    -> auf OK klicken

    -> auf Member Variablen klicken

    ->Member Variable für das Eingabefeld (IDC_STRICHDICKE) hinzufügen

    -> Den Klassen-Assistenten mit OK verlassen
  12. Es wird noch ein Button für diesen Dialog gebraucht. -> Wieder auf die Ressourcenansicht wechseln
    -> Toolbar -> IDR_MAINFRAME
    -> neues Symbol zeichnen
    -> Symbol neuen Namen geben z.B.: ID_STRICHDICKE
  13. Jetzt muss noch die Datei, in der sich die Klasse für den Dialog befindet in der Datei CZeichnerView.cpp ganz oben includiert werden:
    // ZeichnerView.cpp : Implementierung der Klasse CZeichnerView
    //
    
    #include "stdafx.h"
    #include "Zeichner.h"
    
    #include "ZeichnerDoc.h"
    #include "ZeichnerView.h"
    #include "StrichDialog.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
  14. Ein Handler für den Button...
    -> Ansicht -> Klassen-Assistent...
    -> Klassenname muss CZeichnerView sein
    -> Funktion hinzufügen
    -> Code bearbeiten
  15. Handler sollte so aussehen:
    void CZeichnerView::OnStrichdicke() 
    {
    	// TODO: Code für Befehlsbehandlungsroutine hier einfügen
    	StrichDialog dia;
    
    	// Alten Wert anzeigen
    	dia.m_strichdicke = strichdicke;
    
    	// Dialog ausführen
    	if (dia.DoModal() == IDOK)
    	{
    		// Wenn OK gedrückt wurde neuen Wert benutzen
    		strichdicke = dia.m_strichdicke;
    	}
    }
    
  16. Fertig