Die Windows GDI+ (Teil 1)
-
Oh oh, VC++6 ist schon asbach uralt!!! Von 1998, da ist sicherlich kein gdiplus dabei und somit nützen auch die spitzen Klammern nichts. Welcher idiotische Buchverlag legt denn VC++6 einem DX9-Buch bei?
Wenn das mit den spitzen Klammern nicht klappt (was ich vermute) bitte hier weiter lesen:
du brauchst bei VC++6 erstmal ein aktuelles Platform SDK.
http://www.microsoft.com/downloads/details.aspx?FamilyID=e15438ac-60be-41bd-aa14-7f1e0f19ca0d&DisplayLang=enOder am besten gleich ein aktuelles und kostenloses VisualC++:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-143003.html
Das Platform SDK brauchst du da trotzdem, wenn du es noch nicht hast!!!
-
Hab vor 10 Minuten auch gemerkt, dass meine Version von 1998 ist.. naja, man sollte eben doch nicht so viel Wert auf die Software legen, die man in der Schule bekommt
Vielen Dank für die Links und für deine Hilfe, ich hoffe ich krieg das noch hin.
Ich wusste garnicht, dass es eine kostenlose Version von Visual C++ gibt o_o werd ich gleich mal ausprobieren, danke!
-
Sorry fürn Doppelpost, ich glaub ich sollte mich langsam hier registrieren..
ich hab jetzt das SDK installiert, aber kann die aktuelle VC++ Version nicht installieren, da ich kein Service Pack 2 habe (und auch keins haben will!).
Hab es grad nochmal probiert, ich bekomme nur noch einen Fehler, wenn ich den Quelltext aus dem Tutorial probiere: unerwartetes Dateiende.
Keine Ahnung obs daran liegt, dass mein VC++ so alt ist.. kann man da noch irgendwas machen, oder sollte ich nach einer anderen Möglichkeit suchen, um mit Grafiken zu arbeiten?
Ich such eigentlich nur eine einfache Lösung wie ich transparente PNGs anzeigen kann..
-
Wo passiert denn das unerwartete Dateiende? Bitte immer die Fehlermeldung posten.
Hast du auch <windows.h> vorher inkludiert?
Sind in den Compiler-Pfadeinstellungen auch die Pfade für das neue SDK eingetragen? (kenne leider die Install-Routine vom SDK nicht)
Wenn GDI+ erstmal läuft (bei dir scheint es ein Sonderfall zu sein) ist es ganz einfach mit der GDI+. Andere Libs müsstest du ja auch erstmal einrichten. Und das aktuelle PSDK kann man immer gut gebrauchen, nicht nur für die GDI+ alleine.
-
ich hab einfach das SDK installiert, mehr nicht.
Dann deinen Quelltext:
#include <windows.h> // für die GDI+ wird auch windows.h benötigt #include <gdiplus.h> // dieser Header ist für alle GDI+ Klassen, Funktionen usw. using namespace Gdiplus; // 01 INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow) { GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); // 02 // ... paint(hdc); // ... GdiplusShutdown(gdiplusToken); // 03 } void paint(HDC hdc) { Graphics graphics(hdc); // 04 Pen pen(Color(255, 0, 0, 255)); // 05 graphics.DrawLine(&pen, 0, 0, 200, 100); // 06 }
eingefügt, und bekomm am ende folgende Fehlermeldung:
fatal error C1010: Unerwartetes Dateiende waehrend der Suche nach der Direktive fuer die vorkompilierte Header-Datei
wenn ich draufklicke zeigt er mir die zeile mit dem letzten } an
Wo stellt man denn die Compiler Pfadeinstellungen um? Ich kenn mich da nicht so aus..
danke nochmal!
-
Ehm, "Vorkompilierte Header"-Problem. Das hat noch nichts mit GDI+ zutun, das würde auch bei einem super einfachen HelloWorld-Konsolen-Programm erscheinen. Um nihct zu sagen: bei jedem Programm das du kompilieren wollen würdest. Warum? Weil du ein neues Projekt mit Pre-Compiled Headers (PCH) angelegt hast und du vergessen hast als ERSTES Include "stdafx.h" einzufügen. Diese Inklude-Datei müsste in deinem Projektvrzeichnis liegen. Man kann auch Projekte ohne PCH-Support anlegen, dann wäre der Fehler nicht erschienen.
Übrigens, zu jedem Fehler kann man den Fehlercode in der MSDN-Indexsuche eingeben. Gib mal C1010 in der MSDN ein. Kann Wunder bewirken.
-
Das mit stdafx.h hab ich auch schon ausprobiert, wenn ich das mache, bekomm ich immer den Fehler:
fatal error C1083: Include-Datei kann nicht geoeffnet werden: 'gdiplus.h': No such file or directory
ich hab wirklich nur die Zeile #include "stdafx.h" davorgeschrieben, mehr nicht.
das mit der MSDN-Fehlersuche wusste ich zwar nicht, aber helfen konnte mir das diesmal auch nicht.
Danke trotzdem für den Tipp und für deine Hilfe!
-
Doch, es hat schon was gebracht stdafx.h zu inkludieren. Damit ist schon mal der Pre-compiled Header C1010 verschwunden!
So, jetzt taucht der NÄCHSTE Fehler auf, nämlich gdiplus.h wird nicht gefunden. Nun, und da wette ich, das das neue PlatformSDK zwar jetzt schön warm und trocken auf deiner Platte liegt, aber das VC++ es noch nicht kennt. (woher auch?) Das mußt du in die Compiler-Pfad einstellungen eintragen. Weiß ich jetzt leider nicht auswendig, deshalb kannst du dir das hier abschauen (wobei ich mal vermute das das PSDK auch eine readme-Datei hat, wo das auch drin steht!!!!!!!!): http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk/
Wobei du Step 4 und wohl auch Step 5 bei deinem VC++6 weglassen kannst.
So, wenn du das nicht schaffst, dann weiß ich auch nicht weiter.
-
hab das mit dem SDK hingekriegt, aber er spuckt mir immernoch den oben genannten Fehler für die gdiplus.h aus.. ich denk mal, meine Version vom Visual Studio C++ kann mit GDI+ einfach nicht umgehen.
Werd mir wohl ne andere Methode suchen müssen, um mit Grafiken zu arbeiten, vielleicht DirectX, mal sehen.Dennoch vielen vielen Dank für die ganze Hilfe!
-
Das er gdiplus.h nicht findet, kann schlecht was mit der Compilerversion zu tun habe. Er findet ja nur die Datei nicht. Wenn er die Datei gefunden hat, und dann was von error faselt, kann es schon eher sein, das der Compiler zu alt ist. Wobei das nicht sein kann, weil als damals GDI+ erschien, es nur den VC++6 von MS gab!!! 2001 gab es WinXP mit GDI+ und 2002 erschien erst VC++7. Und ich bin der Meinung, ich hatte es damals selbst noch mit der 6er ausprobiert.
Aber gut, ist deine Sache wie du weiter verfährst.
-
Ab sofort gibt es die Beispiele aus dem Tutorial auch als VisualC++ 2003 Projekte mit Sourcecode zum Download.
Ebenfalls habe ich eine MFC-Beispielanwendung beigelegt, die die GDI+ nutzt. Da ja schon oft im MFC-Forum die Frage kam, ob man die GDI+ auch mit der MFC nutzen könnte.
Hier das selbstentpackende Archiv (239 KB):
http://www.kharchi.de/gdiplus/GDI-Plus-Tutorial.exe
-
vllt noch auf
//-------------------------------------------------------------------------- // Status return values from GDI+ methods //-------------------------------------------------------------------------- enum Status { Ok = 0, GenericError = 1, InvalidParameter = 2, OutOfMemory = 3, ObjectBusy = 4, InsufficientBuffer = 5, NotImplemented = 6, Win32Error = 7, WrongState = 8, Aborted = 9, FileNotFound = 10, ValueOverflow = 11, AccessDenied = 12, UnknownImageFormat = 13, FontFamilyNotFound = 14, FontStyleNotFound = 15, NotTrueTypeFont = 16, UnsupportedGdiplusVersion = 17, GdiplusNotInitialized = 18, PropertyNotFound = 19, PropertyNotSupported = 20 };
kurz eingehen ... sonnst ganz nettes Tutorial
-
Im Turbo C++ meckert der Compiler bei Inkludierung von gdiplus.h und Einbindung von GdiPlus.lib:
[C++ Fehler] GdiplusGraphics.h(34): E2015 Mehrdeutigkeit zwischen 'Gdiplus::Graphics::Graphics(void *)' und 'Gdiplus::Graphics::Graphics(void *,int)'
Die zugehörige Zeile ist das return in:
static Graphics* FromHDC(IN HDC hdc) { return new Graphics(hdc); }
Es gibt auch eine Warnung:
[C++ Warnung] GdiplusEnums.h(23): W8058 Präcompilierter Header: Initialisierte Daten im Header kann nicht erzeugt werden
Was kann das alles zu bedeuten haben?
-
Also zum TurboC++ kann ich leider absolut nichts sagen. Die Frage wäre ja erstmal, ob dieser überhaupt mit den lib-Dateien von MS auskommt?
static Graphics* FromHDC(IN HDC hdc)
Was bedeutet das IN?
Komisch ist auch, das TurboC++ die Graphics-Ctors als void* erkennt? Obwohl der Parameter HDC ist... Hast du auch #include <windows.h> vor dem gdi-Include?
Die zweite Meldung mit den Präcompiled-Headern (PCH) scheint bestimmt sowas zu sein, das du dein Projekt für PCHs konfiguriert hast. Beim MSVC muß man mind. einmal einen Build starten (nicht nur Kompilieren der einen cpp-Datei!). Ansonst einfach die PCH-Funktion für das Projekt abschalten, falls man sich damit nicht auskennt.
-
Artchi schrieb:
Also zum TurboC++ kann ich leider absolut nichts sagen. Die Frage wäre ja erstmal, ob dieser überhaupt mit den lib-Dateien von MS auskommt?
Die Frage stellt sich gar nicht erst, denn alle SDK-LIBS und -Headers sind dabei.
Artchi schrieb:
static Graphics* FromHDC(IN HDC hdc)
Was bedeutet das IN?
Na, "rein", denke ich.
Artchi schrieb:
Komisch ist auch, das TurboC++ die Graphics-Ctors als void* erkennt? Obwohl der Parameter HDC ist...
#define HDC *void
Artchi schrieb:
Hast du auch #include <windows.h> vor dem gdi-Include?
Ja, hab ich.
Artchi schrieb:
Die zweite Meldung mit den Präcompiled-Headern (PCH) scheint bestimmt sowas zu sein, das du dein Projekt für PCHs konfiguriert hast. Beim MSVC muß man mind. einmal einen Build starten (nicht nur Kompilieren der einen cpp-Datei!). Ansonst einfach die PCH-Funktion für das Projekt abschalten, falls man sich damit nicht auskennt.
Danke, Artchi. Ich werd's mal versuchen.
-
OK, wenn das PSDK schon beim TC++ dabei ist, wird es auch damit laufen.
Naja, das IN "in" heißt, war mir schon klar. Nur es ist nicht gerade Standard-C++. Vielleicht erweitert es den HDC-Parameter um irgendwas, das es für den Graphics-Ctor undeutlich wird. Um genau zu sein: warum steht da das IN??? Ich würde es spontan weg lassen.
-
Nun, ich habe jetzt auf jeden Fall herausgefunden, wie ich den Fehler nicht mehr bekomme:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-170397-and-highlight-is-gdi.html
Die Warnung mit den vorkompilierten Headern bleibt. So sah sie aus:
[C++ Warnung] GdiplusEnums.h(23): W8058 Präcompilierter Header: Initialisierte Daten im Header kann nicht erzeugt werden
Wenn ich darauf doppelt klicke, markiert er mir im Code folgende Zeile:
const float FlatnessDefault = 1.0f/4.0f;
Vielleicht ist es nicht OK, const-Variablen in Header-Dateien zu erstellen? Die Turbo C++ Hilfe sagt zu der Warnung folgendes:
Borland-Hilfe schrieb:
(Die Kommandozeilenoption zur Unterdrückung dieser Warnung lautet -w-pch)
Die vorcompilierte Header-Datei konnte aus einem der folgenden Gründe nicht angelegt werden:
Grund Erklärung
Schreiben fehlgeschlagen: Der Compiler konnte die vorcompilierte Header-Datei nicht abspeichern. Dies tritt auf, wenn Sie eine ungültige Position für die Zwischenspeicherung von Header-Dateien angegeben haben oder wenn die Platte voll ist.Quelltext in der Header-Datei: Eine der Header-Dateien enthält einen Funktionsrumpf, der nicht inline ist.
Initialisierte Daten in der Header-Datei: Eine der Header-Dateien enthält die Definition einer globalen Variablen. (In C eine globale Variable, in C++ jegliche Variable, die nicht als extern deklariert wurde.)
Header-Datei unvollständig: Die vorkompilierte Header-Datei endete in der Mitte einer Deklaration, zum Beispiel innerhalb einer Klassendefinition (dies passiert häufig, wenn eine schließende Klammer } fehlt).
-
Mußt du so machen:
// HEADER extern const float FlatnessDefault; // CPP const float FlatnessDefault = 1.0f/4.0f;
Wenn es aber eh global ist, würde ich noch static dazu schreiben.
-
Artchi schrieb:
// CPP const float FlatnessDefault = 1.0f/4.0f;
Es gibt aber keine GdiplusEnums.cpp. Soll ich das nun in jedem Projekt wieder neu schreiben, wenn ich GDI+ verwenden will?
-
achso, die Variable ist nicht von dir??? Das ist ne GDI+-Variable? Also an der GDI+ selbst sollte man nichts machen müssen. Das muß doch von Haus aus funktionieren!
Prinzipiell inkludiert man gdiplus.h und gut ist. Die FlatnessDefault ist dann doch schon in gdiplus.lib drin. Der Header sagt ja nur, was in der Lib vorhanden ist.
Ich habe jetzt momentan leider keinen Zugriff auf die GDI+ Files um selber nachzuschauen. Muß ich zu Hause machen. Kann dir jetzt da nichts weiter sagen. Da es sich aber um ein Warning handelt, kompiliert doch dein Projekt trotzdem. Warnings sollte man natürlich verhindern, aber benutze es erstmal.