Die Windows GDI+ (Teil 1)
-
Hallo
Ich habe Probleme mit GDI+ beim einbinden. Ich habe mir ein TestProject von VC++ 2005 EE erstellen lassen. Dann die gdiplus.h und die gdiplus.lib eingebunden und nun bekomme ich 77 Fehlermeldungen.
// GDI_Test.cpp : Definiert den Einstiegspunkt für die Anwendung. // #include "stdafx.h" #include "GDI_Test.h" #include "gdiplus.h" // dieser Header ist für alle GDI+ Klassen, Funktionen usw. #pragma comment (lib,"GdiPlus.lib") #define MAX_LOADSTRING 100 using namespace Gdiplus;
Kompilieren... GDI_Test.cpp c:\programme\microsoft platform sdk for windows server 2003 r2\include\gdiplusimaging.h(67) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. c:\programme\microsoft platform sdk for windows server 2003 r2\include\gdiplusimaging.h(67) : error C2440: 'Initialisierung': 'const char [37]' kann nicht in 'int' konvertiert werden Es gibt keinen Kontext, in dem diese Konvertierung möglich ist c:\programme\microsoft platform sdk for windows server 2003 r2\include\gdiplusimaging.h(67) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'IImageBytes'
-
Hallo
Den Fehler hast du aber nicht bei diesem Codeausschnitt bekommen, oder?
chrische
-
Nein. Ich habe mir eine Windows-Anwendung mit VC++ 2005 erstellen lassen die ja auch ein Standard-Fenster erstellt und dann die Lib und die Headerdatei eingebunden . Oder sollte ich ein leeres Project erstellen?
-
Willste nicht mal den Header aus den Compiler-Pfaden inkludieren? Also mit spitzen Klammern? Und hast du auch vor dem gdi-Header den <windows.h> inkludiert? LEAN AND MEAN Makros abgeschaltet? Steht alles in meinem Artikel.
-
Den header hatte ich in <>, hatte es nur mal zum Test geändert und die GdiPlus.h ins Projectverzeichnis kopiert. Die windows.h steht schon in die stdafx.h.
LEAN AND MEAN Makros abgeschaltet?
Wo kann ich die Abschalten bzw. was heisst das.
Bin noch nicht lange dabei.EDIT: gefunden, alles klar.
Danke euch.
-
Die GDI+ Tutorial-exe weigert Vista sich auszuführen(DOS?),
der ZIP-Ordner Clock enthält 0 Bytes
-
Die GDI+ Tutorial EXE ist ein 7zip-Selbstentpacker. Hem... kann sein das die nicht unter Vista funktioniert.
Die Dateien sind eh nicht mehr online. Ich werde die mal heute abend neu hochladen und die URLs dann bekannt geben.
-
Downloads wurden korrigiert.
-
Moin,
als erklärter Nicht-Fan von .NET versuche ich ein Semi-Transparentes Fenster mit GDI+ zu erzeugen was auch super funktioniert und echt klasse aussieht mit den richtigen PNGs.
Allein: bei jedem Aufruf alloziert das Programm einige neue kB die nicht wieder freigegeben werden. Man stelle sich den folgenden Ausschnitt als Hintergrund einer Uhr vor, die sekündlich aktualisiert wird, dann ist der Speicher sehr schnell aufgebraucht.CRect crWindow; GetWindowRect( crWindow ); HDC hdc = ::GetDC( this->GetSafeHwnd() ); if( hdc != NULL ) { Bitmap *pbmClone = m_bmBackground->Clone( 0, 0, m_bmBackground->GetWidth(), m_bmBackground->GetHeight(), PixelFormatDontCare ); Graphics gr( pbmClone ); HBITMAP hbmBack; Color clrBm; pbmClone->GetHBITMAP( clrBm, &hbmBack ); HDC dcMem = ::CreateCompatibleDC( hdc ); if( dcMem != NULL ) { HBITMAP hbmOld = ( HBITMAP )::SelectObject( dcMem, hbmBack ); CPoint ptZero( 0, 0 ); CSize szWnd( crWindow.Size() ); CPoint ptBase( crWindow.TopLeft() ); BLENDFUNCTION blendFunc; blendFunc.AlphaFormat = AC_SRC_ALPHA; blendFunc.BlendFlags = 0; blendFunc.BlendOp = AC_SRC_OVER; blendFunc.SourceConstantAlpha = iAlpha; if( !UpdateLayeredWindow( this, hdc, &ptBase, &szWnd, dcMem, &ptZero, ::GetSysColor( COLOR_3DFACE ), &blendFunc, ULW_ALPHA ) ) { MessageBeep( -1 ); } ::SelectObject( dcMem, hbmOld ); } ::DeleteDC( dcMem ); delete pbmClone; ::ReleaseDC( this->GetSafeHwnd(), hdc ); ::DeleteDC( hdc ); }
Was mache ich falsch?
btw. Gute Einführung! Mehr davon!
-
Moin,
so still hier auf einmal
Fehler gefunden und hat nichts mit GDI+ zu tun.
Ich hätte erwartet, dass eine Methode die den Namen GetHBitmap trägt, mir ein Handle auf den Speicher gibt, der ohnehin benutzt wird. Tut es aber nicht. Die Methode legt ein komplett neues HBITMAP-Objekt im Speicher an, der über DeleteObject(), eine GDI-Funktion, wieder freigegeben werden sollte. Steht nur leider so nicht im MSDN. Schade!
Ist allerdings als Hinweis irgendwo in der .NET Dokumentation zu GetHBitmap, wo ich es gefunden und ausprobiert habe.
Viel Spaß noch!
-
Ich hab da noch ne Frage:
da ich auch noch keine Ahnung habe wollte ich mal Fragen (bevor ich mich einarbeite), ob man das ganze auch auf einem Dialogfenster darstellen kann oder geht das nur auf einem SDI-Editier-Hintergrund?
Wenn es auf einem Dialogfenster geht: muss man da irgendein Hintergrund einstellen oder kann man nach dem positionieren direkt auf dem grauen Bildschirm schreiben?
Wenn es nicht geht: womit macht man sowas?Micha
-
Geht natürlich auch mit Dialogen. Dialoge sind auch nur Fenster.
-
Also das Zeichnen in einer SDI geht ja, aber bei einem Dialogfeld bzw. in einer MFC-Anwendung gibts noch Probleme:
In welche Funktion schreib ich denn das rein? Wenn ich LineTo verwende hab ich das gleiche Problem.
-
In dem Artikel ist doch ein MFC-Beispiel als Download bei, einfach da abschauen wie es gemacht wurde.
-
Meinst du das Beispiel auf seite 2? das ist nicht mehr erhältlich.
Ich hatte mich ungenau ausgedrückt: ich wollte auf einem Dialogfeld (einer MFC Anwendung) zeichnen.
Wo schriebe ich da meine zeichenbefehle rein?Micha
-
Nein, in dem GDI+ Tutorial auf Seite 1 im Text ist eine ZIP Datei zum Download. Da sind Beispiel-Projekte drin.
-
Ich habe zum Thema GDI in WinAPI vor einigen Jahren ein kleines Tutorial geschrieben: http://www.henkessoft.de/C++/WinAPI/WinAPI_GDI/WinAPI_7_GDI.htm
Das passt vielleicht auch zum Thema hier.
-
GDI != GDI+
-
@Mr X:
@Erhard Hankes: