GDI+



  • Hehe .. gut in der Help vom Borland über IMPLIB steht eine bisschen andere Syntax von den Parametern aber vielleicht hab ich auch nur mal wieder was falsch verstanden ;)!
    Funktioniert bei mir mit der Befehlszeile auch 😃 .. danke!

    Naja, wie gehts jetzt weiter? Mit den .h Files kann ich leider auch nicht viel anstellen weil der Borland immernoch Fehler bringt - muss ich die auch irgendwie umwandeln oder so?

    @Jansen
    Hab ich mir auch schon überlegt ob es nicht besser wäre die Fehlermeldungen hin zu schreiben aber ob das Hilft:
    "Es ist ein schwerer Ausnahmefehler aufgetreten!" 😃 :p



  • Beim Builder 6 sind Headerfiles für GDIPlus mit dabei. Findest Du im Include Verzeichniss. Relevant ist wohl nur die gdiplus.h, da diese die anderen gdi*.h Files mit einbindet.



  • hm, dann hampelst du aber auf ne Header rum, die nicht der lib entspricht. Es sei denn du kannst garantieren, dass die Dateien der selben Version angehören.
    Ich glaub kaum, dass das funzt.

    Das muss doch auch mit der Original gehen.
    Kann es sein, dass du noch eine dll mehr brauchst ?



  • Hmm ok jetzt bin ich wieder verwirrt!!

    Also ich versuch mal zusammen zu fassen:
    Borland erstellt .h Files für GDI+, aber konvertiert die .lib von Microsoft nicht so, dass man GDI+ im Borland nutzen kann. Wenn man nun GDI+ benutzten will muss .man die .lib / .dll von Microsoft konvertieren wozu das nützliche Tool "implib.exe" da ist!? Mit dem Problem das die konvertierte .lib nicht funktioniert und ich Fehler in einer .h File bekomm von undefinierten Funktionsaufrufen (Funktionen: Min(), Max()).

    Naja, vielleicht benötigt man noch eine .obj??
    Hab mal im \Lib\ Ordner vom Builder geschaut und ist zu ein paar .lib Files eine entsprechende .obj zu finden.
    Auf jedenfall hatte ich noch keinen Erfolg ... 😞



  • Ich kann Dir jetzt leider nicht mehr arg viel weiter helfen 😞 Das damalige Projekt, indem ich GDIPlus zur Anzeige von TIF Dateien verwendet habe, mußte leider einem dringenderen größeren Projekt weichen. Hab aber mal geschwind reingeschaut, ich habe die GDIPlus.h von Borland includet (#include <GDIPlus.h> ) und ne GDIPlus.lib, durch IMPLIB erstellt, ins Projekt eingebunden. Muß aber dazu sagen, nix XP sondern W2K. Die Anzeige der TIFs hat jedenfalls prima funktioniert sogar mit Zoom und drehen und all dem ganzen Kram 😉



  • Nachdem einige Zeit vergangen ist und viele Versuche von mir in die Hose gegangen sind .. will ich nochmal nachhaken ;)!

    Also ich erstelle mit IMPLIB aus der GdiPlus.dll eine GdiPlus.lib, die ich dann in mein Projekt mit einbinde oder hinzufüge?! Dann binde ich noch die GdiPlus.h von Borland mit ein und bekommen 24 Fehlermedlungen wobei die meisten "Aufruf einer undefinierte Funktion: Min() / Max()" sind.
    Oder: Ich erstelle mit COFF2OMF aus der GdiPlus.lib eine umgewandelte GdiPlus.lib und binde die ein / füge diese zum Projekt hinzu?! Dann binde ich wieder die GdiPlus.h von Borland mit ein und bekomm immernoch 24 Fehlermeldungen wobei die meisten wieder "Aufruf einer undefinierten Funktion: Min() / Max()" sind.

    Mach ich irgendwas falsch?
    Auf der Borland Homepage hab ich leider auch vergeblich nach einer Lösung gesucht .. die verlieren darüber in der ganzen Community und FAQ kein einziges Wort .....!



  • hallo,

    ich will ja nicht sticheln, aber:

    Peter schrieb:
    Doch, die GDI+ hab ich selber schon verwendet. Funktioniert gut.

    @peter: damit dieser thread nicht noch mehr ausartet, zeig ihm doch endlich wie du es fertig gebracht hast, die gdi+ gut zu verwerden!!!

    mfg
    murph



  • Bis auf 4 Seiten schaffen wir das noch 😃 !!

    Ne, wäre nett wenn du mir genau sagen könntest was du wie eingebunden / hinzugefügt hast Peter !?
    Hab immernoch keine Lösung gefunden .. aber das Borland darüber kein Wort verliert find ich krass !! (naja, vielleicht hab ich wieder mal was übersehen ;))



  • So, ich hab mich jetzt extra mal hingesetzt und versucht, ein kleines Beispiel zu basteln (Laden eines Bildes in eine Paintbox). Man braucht eine Form (TForm1), eine PaintBox (PaintBox) drauf und einen Knopf (BShowImage). Ich hoffe, es hilft etwas weiter, aber keine Garantie auf Fehlerfreiheit 😉

    H-Datei:

    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    
    // ********************** Für die Verwendung von GDIPlus notwendig ******************
    #include <algorithm>
    using std::min;
    using std::max;
    #include <GDIPlus.h>
    
    // Eintrag unter Projekt -> Optionen -> Verzeichnisse -> Bedingungen
    // Im Editfeld Definition der Groupbox Bedingungen = STRICT;_DEBUG
    
    // Die Compiler Warnung
    // W8022 'Bitmap:Clone(const Rect &int)' verbirgt virtuelle Funktion 'Image:Clone()'
    // habe ich in Projekt -> Optionen -> Compiler -> Warnungen unterdrückt
    // **********************************************************************************
    
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:    // Von der IDE verwaltete Komponenten
        TButton *BShowImage;
        TPaintBox *PaintBox;
        void __fastcall BShowImageClick(TObject *Sender);
    private:    // Anwender-Deklarationen
        ULONG_PTR gdiplusToken;
        Gdiplus::GdiplusStartupInput gdiplusStartupInput;
        int GDIPlusStatus(Gdiplus::Image *GDIPlusImage);
        bool LoadPic(AnsiString PicName);
    public:     // Anwender-Deklarationen
        __fastcall TForm1(TComponent* Owner);
        __fastcall ~TForm1(void);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    CPP-Datei:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
    {
        Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    }
    //---------------------------------------------------------------------------
    __fastcall TForm1::~TForm1(void)
    {
        Gdiplus::GdiplusShutdown(gdiplusToken);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::BShowImageClick(TObject *Sender)
    {
        TOpenDialog *OpenDiag=new TOpenDialog(NULL);
    
        if(OpenDiag->Execute())
            LoadPic(OpenDiag->FileName);
    
        delete OpenDiag;
    }
    //---------------------------------------------------------------------------
    int TForm1::GDIPlusStatus(Gdiplus::Image *GDIPlusImage)
    {
        int status;
        AnsiString Status;
    
        switch((status=GDIPlusImage->GetLastStatus()))
        {   case Gdiplus::Ok :                          Status="";
                                                        break;
            case Gdiplus::GenericError :                Status="Unbekannter Fehler (GenericError)";
                                                        break;
            case Gdiplus::InvalidParameter :            Status="Ungültiger Parameter (InvalidParameter)";
                                                        break;
            case Gdiplus::OutOfMemory :                 Status="Ungenügend Speicher (OutOfMemory)";
                                                        break;
            case Gdiplus::ObjectBusy :                  Status="Graphics Objekt busy (ObjectBusy)";
                                                        break;
            case Gdiplus::InsufficientBuffer :          Status="Ungenügend Objektpuffer (InsufficientBuffer)";
                                                        break;
            case Gdiplus::NotImplemented :              Status="Nicht implementierte Funktion (NotImplemented)";
                                                        break;
            case Gdiplus::Win32Error :                  Status="Win32Error (Win32Error)";
                                                        break;
            case Gdiplus::WrongState :                  Status="Objekt befindet sich in einem falschen Status (WrongState)";
                                                        break;
            case Gdiplus::Aborted :                     Status="Die Methode wurde abgebrochen (Aborted)";
                                                        break;
            case Gdiplus::FileNotFound :                Status="Die Datei konnte nicht gefunden werden (FileNotFound)";
                                                        break;
            case Gdiplus::ValueOverflow :               Status="Nummerischer Überlauf (ValueOverflow)";
                                                        break;
            case Gdiplus::AccessDenied :                Status="Kein Zugriff (AccessDenied)";
                                                        break;
            case Gdiplus::UnknownImageFormat :          Status="Unbekanntes Bildformat (UnknownImageFormat)";
                                                        break;
            case Gdiplus::FontFamilyNotFound :          Status="Unbekannter Fontfamilie (FontFamilyNotFound)";
                                                        break;
            case Gdiplus::FontStyleNotFound :           Status="Unbekannter Fontstil (FontStyleNotFound)";
                                                        break;
            case Gdiplus::NotTrueTypeFont :             Status="Kein Truetype Font (NotTrueTypeFont)";
                                                        break;
            case Gdiplus::UnsupportedGdiplusVersion :   Status="Nicht unterstützte GDI-Plus Version (UnsupportedGdiplusVersion)";
                                                        break;
            case Gdiplus::GdiplusNotInitialized :       Status="GDI-Plus nicht initialisiert (GdiplusNotInitialized)";
                                                        break;
            case Gdiplus::PropertyNotFound :            Status="Eigenschaft nicht gefunden (PropertyNotFound)";
                                                        break;
            case Gdiplus::PropertyNotSupported :        Status="Eigenschaft nicht unterstützt (PropertyNotSupported)";
                                                        break;
            default :                                   Status="Unbekannter Fehler";
        }
        if(status != Gdiplus::Ok)
            Application->MessageBox(Status.c_str(), "GDIPlus", MB_ICONEXCLAMATION);
    
        return status;
    }
    //---------------------------------------------------------------------------
    bool TForm1::LoadPic(AnsiString PicName)
    {
        TRect rect;
        int wPicNameLen;
        wchar_t *wPicName;
        bool res=false;
        Gdiplus::Image *GDIPlusImage;
        Graphics::TBitmap *GraphicsBitmap;
    
        wPicName=new wchar_t[(wPicNameLen=PicName.WideCharBufSize())];
        GDIPlusImage=new Gdiplus::Image(PicName.WideChar(wPicName, wPicNameLen));
        GraphicsBitmap=new Graphics::TBitmap();
    
        if(GDIPlusStatus(GDIPlusImage)==Gdiplus::Ok)
        {   GraphicsBitmap->Width=GDIPlusImage->GetWidth();
            GraphicsBitmap->Height=GDIPlusImage->GetHeight();
            Gdiplus::Graphics(GraphicsBitmap->Canvas->Handle, GraphicsBitmap->Handle).DrawImage(GDIPlusImage, 0, 0, GraphicsBitmap->Width, GraphicsBitmap->Height);
            rect.left=0;
            rect.top=0;
            rect.right=PaintBox->Width;
            rect.bottom=PaintBox->Height;
            PaintBox->Canvas->Brush->Color=clWhite;
            PaintBox->Canvas->FillRect(rect);
            PaintBox->Canvas->CopyRect(rect, GraphicsBitmap->Canvas, rect);
            res=true;
        }
    
        delete GraphicsBitmap;
        delete GDIPlusImage;
        delete wPicName;
    
        return res;
    }
    //---------------------------------------------------------------------------
    

    Die GDIPlus.dll habe ich ins Projektverzeichniss kopiert (Win 2000), die LIB per IMPLIB aus der DLL erzeugt und auch mit ins Projektverzeichniss gepackt.
    Der Befehl zum Erzeugen der LIB:
    implib gdiplus.lib gdiplus.dll
    Die LIB muß natürlich dem Projekt hinzugefügt werden.

    PS: Hatte keinen Bock alles ausführlich zu dokumentieren, aber ich glaube so schwierig ist es nicht sich damit zurecht zu finden, oder 🙄

    [ Dieser Beitrag wurde am 29.06.2003 um 17:32 Uhr von Peter editiert. ]



  • Peter, alter Haudegen 😃

    Interesant. Hatte ich noch nie ausprobiert.
    🕶

    [ Dieser Beitrag wurde am 29.06.2003 um 17:52 Uhr von AndreasW editiert. ]



  • Hi Andreas 🙂
    Jou, GDIPlus ist recht interessant. Hatte die vor einiger Zeit entdeckt als es darum ging, TIF Dateien anzuzeigen. Leider konnte ich an dem damaligen Projekt nicht dran bleiben, da was anderes in der Prioritätenliste ganz vorne auftauchte 😃 Aber ich bin mir sicher, irgendwann kommt das Thema wieder hoch 🕶



  • Original erstellt von Peter:
    Leider konnte ich an dem damaligen Projekt nicht dran bleiben, da was anderes in der Prioritätenliste ganz vorne auftauchte 😃

    ohhh ja, das kommt mir sehr bekannt vor... 😉



  • Was ist denn nun?
    Erst drängeln sie, dann opfert Peter seinen Sonntag und jetzt gibt's hier keine Rückmeldungen!?



  • 🙂 Dann wirds wohl doch nicht sooo dringend gewesen sein, sind ja jetzt immerhin 2 Monate vergangen :D:D:D


Anmelden zum Antworten