Die Windows GDI+ (Teil 1)



  • Artchi schrieb:

    Wie meinst du das mit den GUI-Funktionen? GDI+ ist eine Grafikbibliothek, nicht mehr und nicht weniger. Wenn du GUIs programmieren willst, kannst du z.B. die MFC nehmen. Es gibt ja auch noch andere GUI-Libs, z.B. wxWidgets.

    Oder was hast du genau vor?

    das meinte ich schon.



  • 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



  • Eigentlich mußt du (wenn du ein Fenster erstellt hast) nur die Paint-Message nutzen und den HDC an GDI+ übergeben (wie im ersten Codebeispiel zu sehen).

    Bei diesem Artikel handelt es um eine GDI+-Einführung. Es wird nicht behandelt wie man ein Fenster öffnet oder dergleichen. Wenn du die GDI+ nutzen willst, mußt du dich erstmal informieren wie man ein Fenster öffnet - unabhängig von GDI+. Danach kannst und weißt du auch wo du den hier gezeigten Code implementieren mußt.

    Ich will hier auch nichts schreiben, wie man ein Fenster öffnet. Dazu würdes eines neuen Tutorial bedürfen, was ich nicht leisten kann/will.



  • Vielleicht noch als Tip, falls du garnicht weißt wo du mit Fensterprogrammierung anfangen sollst:

    http://smartwin.sf.net



  • Ich habe das Beispiel in einkleines Testprogramm übertragen. Beim Schreiben zeigt VC alle Auswahlmöglichkeiten (sprich Memberfunctionen) an. Auch das Kompilieren klappt reibungslos.
    Beim Linken hagelt es dann Fehlermeldungen.

    Um zu vermeiden, das VC irgendwelche Voreinstellungen vornimmte, habe ich das ganze nochmals mit einem leeren Projekt versucht. Fehlanzeige!

    Eine von 8 Fehlern !
    Error 1 error LNK2019: unresolved external symbol _GdipCreatePen1@16 referenced in function "public: __thiscall Gdiplus::Pen::Pen(class Gdiplus::Color const &,float)" (??0Pen@Gdiplus@@QAE@ABVColor@1@M@Z) Grafiktest.obj

    Ich habe die neueste SDK installiert, ebenso.

    Wer kann helfen?



  • Sind die anderen sieben Fehler auch unresolved external symbol bei GDI+ Funktionen? Hast du das hier beachtet:

    Um die GDI+ nutzen zu können, muss die gdiplus.lib dem Linker mitgeteilt werden



  • Die anderen Fehler sind ebenso "unresolved external symbol" !

    Ich vermute ja auch so einen Fehler, aber nach dem ich alle directories unter options nochmals überprüft habe ... ?!
    Unter den Show directories for: Libary files steht:
    C:\Programme\Microsoft Platform SDK for Windows XP SP2\lib

    in diesem Verzeichnis ist die lib auch vorhanden.

    Oder habe ich etwas übersehen.

    Danke für Eure Antworten.



  • Naja, wie ich geschrieben habe: du mußt die lib deinem Linker bekannt machen.

    Füge sie direkt in dein Projekt hinzu: Projekteigenschaften->Linker->Eingabe->Zus. Abhängigkeit. Dort einfach gdiplus.lib eintragen (ohne Pfad oder sowas). Dann weiß dein Linker, das er die lib dazulinken muß. Er sucht sie in den Pfadangaben, die du in der IDE eingetragen hast.

    Einige Bibliotheken (z.B. Boost) machen es heute schlauer, die tragen in ihre eigenen Header ein #pragma ein und sagen dem Linker dort, welche Lib gelinkt werden soll. Ist aber nicht immer der Fall, bei der GDI+ auch nicht. Also von Hand eintragen. 😉



  • Besten Dank für den Tip. 👍 Darauf muss man erst mal kommen. 💡

    Schade nur das in der Hilfe dazu kaum etwas steht.



  • Hmm.. ich habe leider ein paar Probleme mit GDI+

    Ich hab ein neues Win32 Projekt erstellt, die gdiplus.lib in den Linker eingetragen, und das Makro WIN32_LEAN_AND_MEAN aus der stadfx entfernt.

    Wenn ich nun den code einfüge, oder nur bei einem "Hallo Welt"-Projekt
    #Include "gdiplus.h" schreibe, spuckt er mir Fehler aus.

    Am Anfang hieß es immer er könnte die Datei nicht finden. Dabei stand im Text doch, dass sie ab Windows XP standartmäßig dabei wäre, und ich benutze XP.
    Ich hab mir dann die ganzen Header-Dateien, eine DLL und die lib-Datei runtergeladen und in den Projektordner eingefügt.
    Nun heißt es zwar nicht mehr, dass die Datei nicht existieren würde, aber Fehler bekomme ich dennoch. Ganz viele Zeilen in der Datei "gdiplusinit.h" (39, 40, und 97) verursachen Fehler.

    Ich weiß nicht was das jetzt bedeutet, und wie ich das beheben kann... kann mir jemand bitte helfen?



  • Wenn ich nun den code einfüge, oder nur bei einem "Hallo Welt"-Projekt
    #Include "gdiplus.h" schreibe, spuckt er mir Fehler aus.

    Mit spitzen Klammern inkludieren! Das ist wichtig, denn in Anführungsstrichen heißt, das gdiplus.h angeblich in deinem eigenen Projektverzeichnis liegt (was aber eigentlich nicht der Fall ist). Die gdiplus.h liegt aber in deinem Compiler-Path, deshalb spitze Klammern verwenden.

    Am Anfang hieß es immer er könnte die Datei nicht finden. Dabei stand im Text doch, dass sie ab Windows XP standartmäßig dabei wäre, und ich benutze XP.

    Damit war die gdiplus.dll (also die Enduser-Variante) gemeint. Was soll denn ein WinXP-Anwender mit einer Header-Datei anfangen?

    Ich hab mir dann die ganzen Header-Dateien, eine DLL und die lib-Datei runtergeladen und in den Projektordner eingefügt.

    Naja, das macht man aber eigentlich nicht, auch wenn es irgendwie doch funktioniert. Du hättest einfach den gdiplus.h mit den spitzen Klammern inkludieren sollen. Wenn das nicht gegangen wäre, hättest du wahrscheinlich kein aktuelles PlatformSDK oder kein aktuelles VC++ (mind. 2003er).

    Ganz viele Zeilen in der Datei "gdiplusinit.h" (39, 40, und 97) verursachen Fehler.

    Ja, ich wette es hat was mit den fehlenden spitzen klammern zu tun. An der Basis falsch angefangen zieht das unendlich viele Fehler nach sich. Welches VC++ hast du denn?



  • Ich benutze Visual C++ 6.0, lag bei "Jetzt lerne ich DirectX9 und Visual C++" als CD dabei.

    Ich werd das mit den Spitzen klammern mal ausprobieren, danke für den Tipp!



  • 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=en

    Oder 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.


Anmelden zum Antworten