CArchive CBitmap



  • Ich habe eine SDI Anwendung, in der ich die File Öffnen/Speicher Funktion benutzen möchte.

    Das Tool soll zum Darstellen von Bilder (CBitmaps) dienen. Nun hab ich aber das Problem, das ich in der Serialize Funktion die CBitmap Objekte nicht in das CArchive ar übergeben kann.
    CBitmap ist doch aber eine Klasse von CObject.
    Hab ich n Denkfehler, oder geht das wirklich nicht.

    Gruß Kext



  • class CSavingBitmap : public CBitmap
    {
    DECLARE_SERIAL(...)
    void Serialize( CArchive& ar);
    };
    
    // ...
    IMPLEMENT_SERIAL(...)
    void CSavingBitmap::Serialize( CArchive& ar)
    {
      // hier jetzt dein Speichercode rein !
    }
    


  • ja, aber wenn ich nun das bitmap überladen will

    void CPicture::Serialize(CArchive &ar)
    {
        if (ar.IsStoring())
        {
        }
        else
        {
           ar >> bild; // CBitmap in CArchive überladen
        }
    }
    

    bekomme ich folgende fehlermeldung

    C:\cpp\ORV\Picture.cpp(57) : error C2679: Binaerer Operator '>>' : Kein Operator definiert, der einen rechtsseitigen Operator vom Typ 'class CBitmap' akzeptiert (oder keine geeignete Konvertierung moeglich)

    [ Dieser Beitrag wurde am 07.04.2003 um 11:56 Uhr von Kext editiert. ]

    [ Dieser Beitrag wurde am 07.04.2003 um 11:59 Uhr von Kext editiert. ]



  • Der Operator >> von CArchive verlangt dynamische Erstellung. Dazu müssen die Makros durch DECLARE_DYNCREATE sowie IMPLEMENT_DYNCREATE ersetzt werden. Weiterhin muss 'bild' ein Zeiger auf ein CSavingBitmap sein.
    So:
    CSavingBitmap* pBitmap;
    ar >> pBitmap;
    Achtung, nicht so:
    CSavingBitmap bitmap;
    ar >> &bitmap;



  • Zusatz:
    Die Serialize-Funktion muss bei dynamischer Erstellung ERST Serialize der Basisklasse aufrufen!



  • Danke, ich bin nun glaub ich dicht dran.
    Aber wenn ich jetzt ein Bild lden will, sagt er "unerwartetes Dateiformat".
    Hat das etwas mit dem IMPLEMET_SERIALZE Makro zu tun?
    Sieht bei mir so aus: IMPLEMENT_SERIAL(CPicture, CBitmap, 1)

    [ Dieser Beitrag wurde am 07.04.2003 um 13:01 Uhr von Kext editiert. ]



  • achja, du willst ja 'normale' Bitmaps laden 😉

    Dann funzt das folgendermassen:

    class CSavingBitmap : public CBitmap
    {
    DECLARE_SERIAL(...)
    void Serialize( CArchive& ar);
    };
    
    // ...
    IMPLEMENT_SERIAL(...)
    void CSavingBitmap::Serialize( CArchive& ar)
    {
      // CBitmap::Serialize( ar); // NICHT AUFRUFEN !!!
      // hier jetzt dein Speichercode rein !
    }
    
    CFile bmpFile(...);
    CArchive ar( &bmpFile);
    CSavingBitmap sbmp;
    sbmp.Serialize( ar);  // Serialize explizit aufrufen
    

Anmelden zum Antworten