GDI+
-
GDI+ ist eine DLL und in XP bereits integriert. Für z.B. Win 2000 kann man das Teil auch bei Microsoft downloaden. Eine Referenz gibts in der MSDN.
Entsprechende Header-Dateien sind wenigstens beim BCB6 dabei.
-
Hallo Peter,
du hast nicht zufällig noch eine Kopie deines Beitrages mit dem ausführlichen GDI+-Beispiel rumliegen (nach dem erst alle geschrien haben und was dann anschliessend ignoriert wurde ;))?
Habe gestern auch schon 'ne Weile hier rumgesucht, aber scheinbar ist der Thread den Umbauarbeiten des Forums zum Opfer gefallen.
-
du hast nicht zufällig noch eine Kopie deines Beitrages mit dem ausführlichen GDI+-Beispiel rumliegen
Den Beitrag mit dem Beispiel wollte ich heute morgen auch schon hier rein kopieren, hab den auf meiner Platte hier im Geschäft jedoch nicht gefunden. Vielleicht daheim
Ich schau mal heute Abend nach.
-
Ich hab windows XP.
Was heißt das jetzt für mich? Kann ich jetzt GDI+ benutzen?
-
Ich denke schon. Allerdings hab ichs auf XP noch nicht probieren können kann also somit nicht sagen, ob man da die GDI-DLL auch explizit laden muß oder nicht. Kannst Du ja dann ausprobieren und hier Deine Ergebnisse mitteilen

-
Also, das mit den HEadern stimmt.
Ich hab mal im Borland Ordner nach gdiplus gesucht, und hab da was gefunden. Ich hab einfach mal #include <gdiplus.h> gemacht, und auch das hat geklappt (außer dieser eine Fehler mit dem Ambiguity, da hab ich einfach den Quelltext etwas verändert ;)) - nur leider ob das dann auch ganz klappt konnte ich nicht ausprobieren. Ich kenn mich noch nicht genug mit GDIPlus aus, und schon garnicht wie ich das direkt mit Borland C++ Builder kombinieren kann...
-
Zum Probieren hab ich hier ein wenig Quellcode.
Das Programm läd z.B. eine TIFF-Datei und zeigt sie auf der Form an.
Man braucht lediglich eine Form, eine Paintbox und einen Knopf.
Den Namen der Form, des Knopfes und der Paintbox kann man in der Headerdatei ablesen
Header-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 unter Projekt -> Optionen -> Compiler -> Warnungen unterdrückt // evtl. andere Warnungen auf ähnliche Weise ********************************************************************************** //--------------------------------------------------------------------------- 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; //--------------------------------------------------------------------------- #endifCPP-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; } //---------------------------------------------------------------------------Keine Garantie auf Fehlerfreiheit

-
Ach so, ganz wichtig !
Aus der GDIPLUS.DLL muß eine GDIPLUS.LIB erzeugt und dem Projekt hinzugefügt werden. Das geht mit implib.exe (beim BCB mit dabei)
Ich glaube es ging so:implib gdiplus gdiplus.dll
-
Boah super, es klappt! Danke, danke.
Die Library habe ich von .NET geholt und mit coff2omf umgewandelt, ist doch das gleiche oder?
Wo kann ich jetzt lernen, wie GDIplus funktioniert? Was man damit machen kann etc. - wo gibt es die wichtigsten Infos/Unterschiede zum normalen GDI (Canvas)?
(Kann man damit Bilder rotieren?)nochmal danke!
-
Lernen wie GDI+ funktioniert ? Ich studiere in solchen Fällen die entspr. Funktionen (MSDN), recherchiere ggf. im Internet (Google) und schreibe kleine Testprogramme um die Funktionen, welche ich gerade brauche, ausprobieren zu können. Denk aber dran, GDI+ ist eigentlich Win API und hat primär nichts mit der VCL zu tun.
Interessant wäre noch, ob man bei XP auch die GDIPLUS.LIB einbinden muß, oder ob die GDI+ wie die "normalen" API-Funktionen einfach so zur Verfügung stehen. Konnte das bisher leider noch nicht ausprobieren
-
Denk aber dran, GDI+ ist eigentlich Win API und hat primär nichts mit der VCL zu tun.
Was meinst du damit? Ich möchte nämlich GDI+ hauptsächlich für mein Grafikprogramm benutzen, statt Canvas, da es 1. schneller und 2. mehr Funktionen hat.
-
Er meint damit, dass Fragen zu den Details von GDI+ in's WinAPI-Forum gehören.
Die BCB-spezifischen Sachen sind ja soweit abgehandelt.