DECLARE_DYNCREATE mit CView funzt nicht



  • Hallo Leute,

    habe da ein merkwürdiges Problem. Habe aus dem Buch C++ für Windows von Herrn Erlenkötter eine MDI Anwendung programmiert wo die Ansicht von der Klasse CView abgeleitet werden muss. Mit CEditView bekomme ich auch keine Compilierprobleme nur wenn ich CView nutze so wie es auch im Buch steht erhalte ich folgende Fehlermeldung:
    Weis jemand warum im Anschluss habe ich den Quelltext der Ansicht reingepostet.

    Kompilierung läuft...
    editor.cpp
    viewdata.cpp
    e:\sw-projekte\mfc\mdiinputoutput\viewdata.cpp(7) : error C2259: "CSchrift" : Instanz von abstrakter Klasse kann aufgrund nachfolgender Elemente nicht erstellt werden:
            e:\sw-projekte\mfc\mdiinputoutput\viewdata.h(4) : Siehe Deklaration von 'CSchrift'
    e:\sw-projekte\mfc\mdiinputoutput\viewdata.cpp(7) : warning C4259: 'void __thiscall CView::OnDraw(class CDC *)' : Rein virtuelle Funktion wurde nicht definiert
            c:\programme\microsoft visual studio 6\vc98\mfc\include\afxwin.h(3594) : Siehe Deklaration von 'OnDraw'
    e:\sw-projekte\mfc\mdiinputoutput\viewdata.cpp(7) : error C2259: "CSchrift" : Instanz von abstrakter Klasse kann aufgrund nachfolgender Elemente nicht erstellt werden:
            e:\sw-projekte\mfc\mdiinputoutput\viewdata.h(4) : Siehe Deklaration von 'CSchrift'
    e:\sw-projekte\mfc\mdiinputoutput\viewdata.cpp(7) : warning C4259: 'void __thiscall CView::OnDraw(class CDC *)' : Rein virtuelle Funktion wurde nicht definiert
            c:\programme\microsoft visual studio 6\vc98\mfc\include\afxwin.h(3594) : Siehe Deklaration von 'OnDraw'
    Fehler beim Ausführen von cl.exe.
    
    MDIInputOutput.exe - 2 Fehler, 2 Warnung(en)
    
    // Ansicht.h
    #include <afxext.h>
    
    class CSchrift : public CView
    {
      DECLARE_DYNCREATE(CSchrift)
     public:
      CText* GetDocument() const;
      virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    };
    
    inline CText* CSchrift::GetDocument() const
    { return (CText*) m_pDocument; }
    
    // Ansicht.cpp
    #include <afxwin.h>
    #include "editor.h"
    #include "data.h"
    #include "ansicht.h"
    
    IMPLEMENT_DYNCREATE(CSchrift, CView)
    
    BOOL CSchrift::PreCreateWindow(CREATESTRUCT& cs)
    {
     BOOL bPreCreated = CView::PreCreateWindow(cs);
     cs.style &= ~(ES_AUTOHSCROLL | WS_HSCROLL);
    
     return bPreCreated;
    }
    

    Vielen Dank schon mal 🙂



  • Hi,

    die Fehlermeldung sagt dir das du von einer abstrakten Basisklasse die
    Funktion OnDraw nicht überschrieben hast.
    Bei einer rein virtuellen Funktion muß die Funktion in der abgeleiteten
    Klasse implementiert werden.
    Beispiel:

    class Base
    {
     public:
       Base();
       ~Base();
    
     protected:
       void PureVirtualFunction() = 0; // = 0 bedeutet, die Funktion ist nicht implementiert! Die Abgeleitete Klasse muss diese implementieren
    };
    
    class Derived : public Base  // Fehler C2259/C4259 !
    {
     public:
       Derived();
       ~Derived();
    };
    
    class Derived2 : public Base // OK!
    {
     public:
       Derived2();
       ~Derived2();
    
     protected:
       void PureVirtualFunction(); // rein virtuelle Funktion ist definiert und s.u implementiert!
    };
    
    inline void Derived2::PureVirtualFunction()
    { int a = 5; }
    

    Überschreibe also die Funktion OnDraw in deiner von CView abgeleiteten Klasse

    class CSchrift : public CView
    {
      DECLARE_DYNCREATE(CSchrift)
     public:
      CText* GetDocument() const;
      virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
      virtual void OnDraw(CDC* pDC) {} // wenn du nichts zeichnen möchtest, reicht das!
    };
    

    Gruss
    EB



  • Hey dannke es funzt jetzt,

    Ja die Fehlermeldung war mir bekannt aber ich habe mich gewundert welche virtuelle Funktion er meint da er ja OnDraw nicht nennt. Woher weis ich denn falls ich nochmal so eine Fehlermeldung bekomme welche Funktion er genau meint ? Wie finde ich dass heraus ?

    Dank dir nochmals



  • Ups Sorry,

    ich sollte vieleicht genauer die Fehlermeldungen lesen. Es steht ja doch welche Funktion er meint.

    sorry und nochmals vielen Dank wirklich Klasse die Hilfe hier im Forum 🙂


Anmelden zum Antworten