Die Windows GDI+ (Teil 1)
-
Ich kriege zur Laufzeit die Fehlermeldung: "Der Heap wurde beschädigt" und dann hört es auch schon mit der Fehlerbeschreibung meines VS2005 auf.
Das Objekt, wird in der Get-Routine mit der schon beschriebenen Routine angelegt und vom Destuktor des Hüllobjekts gelöscht. Es wird weder durch Kopierkonstruktor noch durch Zuweisungsoperator einem zweiten Objekt zugewiesen.
Entschuldigung, dass ich das vergessen hab zu schreiben.
-
Also ich kann erstmal nur raten, auch wenn nachfolgendes sich erstmal banal anhört:
Ist der Pointer gültig, der zurück gegeben wurde? (also nicht null?)
War das Image-Objekt auch gültig?Mach mal folgendes, nachdem du FromImage() aufgerufen hast (kannst du aber immer machen, wenn du etwas in der GDI+ erzeugen lässt, also z.B. auch Images):
Gdiplus::Status s = Gdiplus::GetLastStatus(); if(s == Gdiplus::Ok) ok! else hier die Fehlerbehandlung bzw. eine eigene Exception werfen...
Hier mal ne Übersicht, zu den Errorcodes:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdicpp/GDIPlus/GDIPlusreference/enumerations/status.aspFalls das nicht besser ist, mußt du mal relevante Codeschnippsel posten.
-
Mein Problem war das Löschen des Objektes nicht das Anlegen.
Selbst wenn ich beim Anlegen des Objekts eine Fehlermeldung bekomme, muss ich davon ausgehen können, dass ein zurückgeliefertes Objekt auch mit delete zu löschen ist.
(Ein Objekt sollte nie in einen solchen Zustand versetzt werden können, dass man es nicht mehr löschen kann und genau das ist an der Stelle passiert.)Ich hab mittlerweile herausgefunden, dass beim Zeichnen das falsche Graphics-Objekt verwendet wurde und dadurch die Speicherverwaltung von GDI+ durcheinander gekommen ist.
Damit ist der Fehler weg und das Vertrauen in GDI+ ungemein gefördert.
-
Hatte vor einiger Zeit GDI+ Pakete für MinGW und BC5.5 erstellt. Man kann sie unter http://www.dhost.info/voodoocpp/index.php?page=progs/libs downloaden. Header und import Bibliotheken sind enthalten. Dokumentation und gdiplus.dll muss man sich von MS besorgen.
Das IN/OUT bei den Methodendefinitionen ist an sich überflüssig. Das sind defines die zu nichts expandieren.
-
Artchi schrieb:
Die GDI+ ist nämlich ansonsten eher kein Problemkind. Und wenn sie beim TC++ im Lieferumfang war, müsste sie auch funktionieren.
Naja, stimmt zwar in der Regel schon, aber ich hatte auch erst vor kurzem Probleme mit besagter GdiplusEnums.h. Und ich benutze MSVC 2005, und da sollte es eigentlich gar keine Probleme geben. Wie dem auch sei... hab halt massig Fehler gekriegt obwohl der Code korrekt war. Letztendlich hab ich dann einfach die afxdisp.h vor dem Gdiplus Header inkludiert und dann ging wieder alles. Lag halt wohl irgendwie daran dass ich auch die MFC teilweise benutze. Ist aber trotzdem nicht gerade toll
Wobei dass ja sogar noch geht wenn ich mir andere Sachen vom Platform SDK anschaue.. was MS da z.T. für ne Scheisse gebaut hat...
-
jano schrieb:
Hallo.
Ich bin sicher es hat damit zu tun das ich grundsätzlich noch nicht so fit bit mit dem MVC++ 2005 Express und c++.
Ich bekomme nur Fehlermeldungen.Folgendes habe ich gemacht.
1. File/New Projekt
2. Auswahl WIN32/Win32 Console Applikation
3. Next => Windows Applikation
4. OK drücken
5. Wo muß ich den nun den Code einbinden?Sorry. Sicher dumme Frage.
Danke jano
Console Applikation ist nicht die richtige Auswahl. Wie bitte schön möchtest du in ein DOS Consolenfenster etwas grafisches zeichnen??
-
Man kann auch in einem Konsolenprogramm ein grafisches Fenster öffnen. Also kein Problem.
-
Gibt es schon eine Fortsetzung des Tutorials?
-
Bisher gibt es kein Teil 2. Es gab bisher auch nicht wirklich einen Wunsch nach einem weiteren Teil. Wennaber hier schon die ersten Nachfragen kommen, kann ich mir was überlegen.
-
Hallo
Ich fänd es auch schön, wenn du noch ein weiterer Artikel hinzukommen würde. Viellecith was mit Bitmaps udn noch ein paar versteckten Gimmicks, weil das alles ja sehr selbsterklärend wirkt.
chrische
-
Nja eigentlich ist doch alles logisch ...
aja ... schöne Serie zum Theme:
http://www.codeguru.com/cpp/g-m/gdi/gdi/article.php/c10673/
http://www.codeguru.com/cpp/g-m/gdi/gdi/article.php/c10621/
http://www.codeguru.com/cpp/g-m/gdi/gdi/article.php/c10559/
http://www.codeguru.com/cpp/g-m/gdi/gdi/article.php/c3681/
http://www.codeguru.com/cpp/g-m/gdi/gdi/article.php/c3657/
http://www.codeguru.com/cpp/g-m/gdi/gdi/article.php/c3677/
http://www.codeguru.com/cpp/g-m/gdi/gdi/article.php/c3675/
http://www.codeguru.com/cpp/g-m/gdi/gdi/article.php/c3655/
http://www.codeguru.com/cpp/g-m/gdi/gdi/article.php/c3679/
http://www.codeguru.com/cpp/g-m/gdi/gdi/article.php/c3667/
-
mein tipp: lasst die finger vom gdi+. es wird nicht weiter entwickelt, hat tausend bugs die nicht gefixt werden und ist laaaaangsaaaam.
-
Hallo
Na das ist doch mal eine fundierte Meinung.
chrische
-
chrische5 schrieb:
Na das ist doch mal eine fundierte Meinung.
jeder der sich mal ernsthaft (abseits eures heimprogrammiererniveaus) mit gdi+ auseinandergesetzt hat, wird meine äußerst fundierte meinung teilen.
-
Hallo
zzZZz schrieb:
chrische5 schrieb:
Na das ist doch mal eine fundierte Meinung.
jeder der sich mal ernsthaft (abseits eures heimprogrammiererniveaus) mit gdi+ auseinandergesetzt hat, wird meine äußerst fundierte meinung teilen.
Wow, du zeigst aber Krallen. Du äußerst halt nur eine Meinung, ohne Links oder ähnliches und dazu bist du nicht registriert und von daher weiß man halt nicht, was man von deiner Meinung halten soll. Obwohl ich ihr nicht einmal entgegen stehe.
chrische
-
in welcher Programmiersprache ist GDI+ entwickelt worden? C# oder C++? wenn man sich die Headerdateien so anschaut so sind die C++ Klassen einfach nur ein Wrapper um irgendeine Bibliothek, die z. B. mit C# programmiert worden sein könnte...
-
GDI+ ist eine native API neben der GDI. Hat absolut nichts mit C# zu tun, da man für die GDI+ kein .NET-Framework benötigt. Aber das .NET-Framework macht tatsächlich von GDI+ gebrauch. Mehr nicht.
-
Mich würde aber jetzt auch mal interessieren was so schlimm an GDI+ sein soll? Ich habe das hier nämlich auf der Arbeit eingesetzt und war eigentlich ganz zufrieden damit. Es ist natürlich etwas "langsam", da ich verdammt viele Daten zeichnen muss, aber ich denke beim normalen "nativen" GDI wäre das auch nicht wirklich schneller. Soll aber nicht heißen, dass ich denke ich wüsste es besser. Ich würde nur wirklich gerne *fundiert und begründet* wissen, was so schlecht an GDI+ ist.
-
zZzZz schrieb:
mein tipp: lasst die finger vom gdi+. es wird nicht weiter entwickelt, hat tausend bugs die nicht gefixt werden und ist laaaaangsaaaam.
Hallo, kann man das jetzt ernst nehmen oder eher der "Anti-Microsoft-User" Abteilung zuordnen? Ich möchte mich nämlich im Gebiet Bildbearbeitung festsetzen (im Laufe der Zeit eine eigne Bildbearbeitungssoftware ins Leben rufen) und frage mich, ob GDI+ einen guten "Start" darstellt?
Dem Autoren dieser Einführung möchte an dieser Stelle einen großen Dank
aussprechen.MfG
Martin
-
MartinG schrieb:
zZzZz schrieb:
mein tipp: lasst die finger vom gdi+. es wird nicht weiter entwickelt, hat tausend bugs die nicht gefixt werden und ist laaaaangsaaaam.
Hallo, kann man das jetzt ernst nehmen oder eher der "Anti-Microsoft-User" Abteilung zuordnen? Ich möchte mich nämlich im Gebiet Bildbearbeitung festsetzen (im Laufe der Zeit eine eigne Bildbearbeitungssoftware ins Leben rufen) und frage mich, ob GDI+ einen guten "Start" darstellt?
Für den Fall, dass unser "zZzZ-Freund" rechtbehält könntest du die Befehle von GDI+, die du brauchst durch eigene Klassen aufrufen. Du könntest auch Befehle von DX dazumixen und desssen Vorteile nutzen, z.B um schnell ein Gitternetz zu zeichnen.
Der Aufwand wäre hoch aber wenn du dich in der Graphikbearbeitung festsetzten möchtest, könnte es das Wert sein.
Falls nun tatsächlich aus irgendwelchen Gründen GDI+ nicht mehr so toll ist und du auf etwas anderes umsteigen möchtest, müsstest du nur eine Stelle deines Projektes anpassen.