Zeichnen mit MFC Erweiterung 3


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 die Gesamtzeichnung in einer Datei abgespeichert und wieder geladen werden kann.

Lösung in Prosa

  1. Zuerst muss die ObjektListe der Klasse CZeichnerDoc angewiesen werden, sich zu 'Serialisieren'.
    Änderung in der Methode Serialize der Klasse CZeichnerDoc:
    void CZeichnerDoc::Serialize(CArchive& ar)
    {
    	ObjektListe.Serialize(ar);
    	if (ar.IsStoring())
    	{
    		// ZU ERLEDIGEN: Hier Code zum Speichern einfügen
    	}
    	else
    	{
    		// ZU ERLEDIGEN: Hier Code zum Laden einfügen
    	}
    }
    
  2. Hinzufügen einer Funktion zum speichern und laden (Serialisieren) zur Klasse Linie: mit der rechten Maustaste auf die Klasse Linie klicken, Member-Funktion hinzufügen...

    Hinzufügen von Code zu dieser Funktion...
    void Linie::Serialize(CArchive &ar)
    {
    	if (ar.IsStoring())
    	{
    		ar << startpunkt << endpunkt << farbe << dicke;
    	}else
    	{
    		ar >> startpunkt >> endpunkt >> farbe >> dicke;
    	}
    }
    
  3. Nun muss nur noch die Klasse auf das Serialisieren 'vorbereitet' werden, dass heißt Visual C++ braucht noch eine zusätzliche Zeile in der Datei Linie.h und eine in der Datei Linie.cpp. Würden noch andere Klassen gespeichert werden würden diese Zeilen auch dort benötigt.
    Und zwar in der Datei Linie.h direkt in der Klasse:
    DECLARE_SERIAL(Linie) Erklärung der Parameter:
    1.Parameter : Name der Klasse selber, Linie
    Und zwar in der Datei Linie.cpp:
    IMPLEMENT_SERIAL(Linie,CObject,1)
    Erklärung der Parameter:
    1.Parameter : Name der Klasse selber, Linie
    2.Parameter : Name der Klasse von die Klasse abgeleitet wurde, CObject
    3.Parameter : Versionsnummer, hat für uns noch keine Bedeutung, werden aber mehrere Klassen serialisiert, muss überall die gleiche Versionsnummer eingetragen werden.

    Linie.h
    // Linie.h: Schnittstelle für die Klasse Linie.
    //
    //////////////////////////////////////////////////////////////////////
    
    #if !defined(AFX_LINIE_H__1D1B215B_847B_41F4_B837_877ABE780E17__INCLUDED_)
    #define AFX_LINIE_H__1D1B215B_847B_41F4_B837_877ABE780E17__INCLUDED_
    
    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    
    class Linie : public CObject  
    {
    public:
    	void Serialize(CArchive &ar);
    
    	DECLARE_SERIAL(Linie)
    
    	int dicke;
    	COLORREF farbe;
    	CPoint endpunkt;
    	CPoint startpunkt;
    	Linie();
    	virtual ~Linie();
    
    };
    
    #endif // !defined(AFX_LINIE_H__1D1B215B_847B_41F4_B837_877ABE780E17__INCLUDED_)
    
    
    Linie.cpp
    // Linie.cpp: Implementierung der Klasse Linie.
    //
    //////////////////////////////////////////////////////////////////////
    
    #include "stdafx.h"
    #include "stdafx.h"
    #include "Linie.h"
    
    #ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif
    
    //////////////////////////////////////////////////////////////////////
    // Konstruktion/Destruktion
    //////////////////////////////////////////////////////////////////////
    
    IMPLEMENT_SERIAL(Linie,CObject,1)
    
  4. Fertig