TOpenPictureDialog Preview ändern



  • Hallo alle zusammen,
    ich benutze ein TOpenPictureDialog um eine Sprite Datei(*.spr) zu öffnen.
    Leider kann der Dialog kein Preview des Bildes anzeigen weil ihm das Dateiformat unbekannt ist. Wie man das entsprechende Bild aus der Datei liest ist mir bekannt. Leider weiß ich jetzt aber nicht wie ich auf das Image innerhalb des Dialoges zugreifen kann.
    Ich habe mir gedacht das es eventuell mit der Funtkion GetDlgItem machbar ist. Da ich diese Funktion aber noch nie benutzt habe wüsste ich nicht welchen identifier für das Image übergeben werden müsste.
    Eventuell geht es ja auch ganz anders. Auch langes rum gegoogle hat mir nicht viel gebracht.
    Ich hoffe ihr könnt mir weiter helfen.

    mfg

    Tsurai



  • Du müßtest vermutlich ein TGraphic-Derivat erstellen, das dieses Dateiformat behandelt (analog zu TJPEGImage, TGIFImage oder TPNGImage) und es mit TPicture::RegisterFileFormat registrieren.



  • Erstmal danke für deine Antwort, aber eigentlich brauche ich garkein neues Derivat.
    Ich kann die RGB werte einzelnt aus dem Sprite file lesen und dann ganz normal in ein TBitmap schreiben.
    Die Frage ist wie ich dieses TBitmap in das TImage des Preview Bildes in dem Dialog bekomme.



  • Tsurai schrieb:

    Erstmal danke für deine Antwort, aber eigentlich brauche ich garkein neues Derivat.
    Ich kann die RGB werte einzelnt aus dem Sprite file lesen und dann ganz normal in ein TBitmap schreiben.
    Die Frage ist wie ich dieses TBitmap in das TImage des Preview Bildes in dem Dialog bekomme.

    Mit genau einem solchen Derivat.
    Du könntest beispielsweise der Einfachheit halber von TBitmap ableiten und nur LoadFromStream und SaveToStream überladen, dann deine Klasse für die .spr-Endung registrieren.



  • Ganz ehrlich....als ich deinen ersten Post gelesen habe musste ich erstmal nachgucken was das Wort "Derivat" eigentlich bedeutet.
    Ich würde mich nicht wirklich einen fortgeschrittenen Programmierer nennen und obwohl ich die SaveToStream usw kenne weiß ich nicht genau wie ich das nun umsetzen sollte.
    Wäre es eventuell möglich einen kleinen code teil zu posten damit ich die Grundstruktur sehen kann? Natürlich nur wenn es keine Umstände macht, ich will ja nicht andere meine Arbeit machen lassen.



  • Tsurai schrieb:

    Ganz ehrlich....als ich deinen ersten Post gelesen habe musste ich erstmal nachgucken was das Wort "Derivat" eigentlich bedeutet.

    Verzeih, falls das Wort in diesem Zusammenhang unüblich sein sollte; ich meinte damit einfach eine abgeleitete Klasse.

    Tsurai schrieb:

    Wäre es eventuell möglich einen kleinen code teil zu posten damit ich die Grundstruktur sehen kann?

    Klar.

    spriteimg.h:

    #ifndef spriteimgH
    #define spriteimgH
    
    #include <Graphics.hpp>
    
    namespace Spriteimg
    {
    
    class TSpriteImage : public TBitmap
    {
    public:
    	virtual void __fastcall LoadFromStream (Classes::TStream* Stream);
    	virtual void __fastcall SaveToStream (Classes::TStream* Stream);
    
        __fastcall virtual TSpriteImage (void) {}
    };
    
    } // namespace Spriteimg
    
    #endif
    

    spriteimg.cpp:

    #include <Graphics.hpp>
    #pragma hdrstop
    
    #include "spriteimg.h"
    
    namespace Spriteimg
    {
    
    void __fastcall TSpriteImage::LoadFromStream (Classes::TStream* Stream)
    {
        // Hier kannst du mit Stream->ReadBuffer die Daten aus dem Stream lesen und
        // auf dem gewohnten Wege in das Bitmap, von dem wir ableiten, schreiben.
    }
    void __fastcall TSpriteImage::SaveToStream (Classes::TStream* Stream)
    {
        // Hier kannst du mit Stream->WriteBuffer die Daten des Bitmaps
        // in den Stream schreiben.
    }
    
    static void registerFileFormat (void)
    {
        TPicture::RegisterFileFormat (
    #if __BORLANDC__ < 0x610 // C++Builder 2009 unterstützt Klassenmethoden direkt
            __classid (TPicture),
    #endif
            "spr", "Bitmap-based sprite format",
            __classid (TSpriteImage));
    }
    static void unregisterFileFormat (void)
    {
        TPicture::UnregisterGraphicClass (
    #if __BORLANDC__ < 0x610 // C++Builder 2009 unterstützt Klassenmethoden direkt
            __classid (TPicture),
    #endif
            __classid (TSpriteImage));
    }
    #pragma startup registerFileFormat
    #pragma exit unregisterFileFormat
    
    } // namespace Spriteimg
    

    Edit: Den Korrekturvorschlägen in den nachfolgenden Posts entsprechend angepaßt.



  • audacia schrieb:

    Tsurai schrieb:

    Ganz ehrlich....als ich deinen ersten Post gelesen habe musste ich erstmal nachgucken was das Wort "Derivat" eigentlich bedeutet.

    Verzeih, falls das Wort in diesem Zusammenhang unüblich sein sollte; ich meinte damit einfach eine abgeleitete Klasse.

    Es liegt wohl er an meinem mangelnden Fachwissen ^^;

    Vielen Dank für den code den du geschrieben hast, jetzt ist mir alles klar ^^
    Es gibt nur ein dummes Problem....borland findet die RegisterFileFormat.hpp nicht. Ich dachte zuerst das ein pfad falsch ist oder sowas aber nach einer Durchsuchung meiner Festplatte ist mir aufgefallen das ich die Datei überhaupt nicht habe =S
    Ich habe nie ihrgendwelche Datein von Borland gelöscht deswegen verstehe ich das nicht oder muss man sie die Datei extra ihrgendwoher besorgen?



  • Tsurai schrieb:

    Vielen Dank für den code den du geschrieben hast, jetzt ist mir alles klar ^^
    Es gibt nur ein dummes Problem....borland findet die RegisterFileFormat.hpp nicht. Ich dachte zuerst das ein pfad falsch ist oder sowas aber nach einer Durchsuchung meiner Festplatte ist mir aufgefallen das ich die Datei überhaupt nicht habe =S

    Die Datei gehört da eigentlich überhaupt nicht rein; ich vergaß nur, sie wieder herauszunehmen 🙄
    Entferne die include-Anweisung einfach, dann klappts.



  • audacia schrieb:

    spriteimg.cpp:

    #include <Graphics.hpp>
    #pragma hdrstop
    
    #include "RegisterFileFormat.hpp"
    #include "spriteimg.h"
    
    namespace Spriteimg
    {
    
    void __fastcall TSpriteImage::LoadFromStream (Classes::TStream* Stream)
    {
        // Hier kannst du mit Stream->ReadBuffer die Daten aus dem Stream lesen und
        // auf dem gewohnten Wege in das Bitmap, von dem wir ableiten, schreiben.
    }
    void __fastcall TSpriteImage::SaveToStream (Classes::TStream* Stream)
    {
        // Hier kannst du mit Stream->WriteBuffer die Daten des Bitmaps
        // in den Stream schreiben.
    }
    
    static void registerFileFormat (void)
    {
        TPicture::RegisterFileFormat (
    #if __BORLANDC__ < 0x610 // C++Builder 2009 unterstützt Klassenmethoden direkt
            __classid (TPicture),
    #endif
            ".spr", "Bitmap-based sprite format", //Hier muss der . bei ".spr" weg
            __classid (TSpriteImage));
    }
    static void unregisterFileFormat (void)
    {
        TPicture::UnregisterGraphicClass (
    #if __BORLANDC__ < 0x610 // C++Builder 2009 unterstützt Klassenmethoden direkt
            __classid (TPicture),
    #endif
            __classid (TSpriteImage));
    }
    #pragma startup registerFileFormat
    #pragma shutdown unregisterFileFormat
    
    } // namespace Spriteimg
    

    Mir ist ein kleiner Fehler aufgefallen. Ist nicht tragisch, nur damit andere die den code benutzen direkt bescheid wissen.
    In Zeile #27 muss bei ".spr" der Punkt weg weil später im dialog filter sonst "..spr" steht und er deswegen die *.spr files nicht anzeigt.

    Ich habe es geschafft an die Daten des Sprite Bildes per ReadBuffer zukommen. Die Höhe und Breite zeigt der Dialog auch korrekt an, nur das Bild selbst bleibt komplett weiß.
    Die Bitmap Daten bearbeite ich direkt über scanline und es werden auch die richtigen Farben hinein geschrieben. Ich befürchte das es sich hierbei um einen dummen Anfängerfehler handelt, dass sowas wie repaint() fehlt. Aber so eine function hat TBitmap ja nicht.



  • Tsurai schrieb:

    Mir ist ein kleiner Fehler aufgefallen. Ist nicht tragisch, nur damit andere die den code benutzen direkt bescheid wissen.
    In Zeile #27 muss bei ".spr" der Punkt weg weil später im dialog filter sonst "..spr" steht und er deswegen die *.spr files nicht anzeigt.

    Ohja, danke für den Hinweis.

    Es ist außerdem noch ein Fehler darin: es heißt #pragma exit, nicht #pragma shutdown.
    Ich korrigiere das alles mal, der Übersichtlichkeit zuliebe.

    Tsurai schrieb:

    Ich habe es geschafft an die Daten des Sprite Bildes per ReadBuffer zukommen. Die Höhe und Breite zeigt der Dialog auch korrekt an, nur das Bild selbst bleibt komplett weiß.
    Die Bitmap Daten bearbeite ich direkt über scanline und es werden auch die richtigen Farben hinein geschrieben.

    Könntest du eine Beispieldatei im .spr-Format und deinen Versuch mal posten?



  • ahhh ich bin dumm...es war wirklich ein Anfängerfehler ^^
    Ich habe vergessen das Format mit this->PixelFormat = pf8bit anzugeben.
    Deswegen konnte er natürlich mit dem Farbindex der auf die Farbtabelle verweist nichts anfangen.
    Jetzt funktioniert alles genau so wie ich es will.

    Vielen dank für deine großartige Hilfe audacia ^^


Anmelden zum Antworten