Segfault_ii Geschrieben 14. August 2006 Teilen Geschrieben 14. August 2006 Hallo. Direkt nach meinem Systemmenü-Problem mal gleich noch eine Frage: Hat schonmal jemand ein HICON in einem Qt-Programm dargestellt? Ich versuche ein HICON in ein QIcon bzw. ein QPixmap zu konvertieren, bin damit jedoch bisher nicht sehr erfolgreich... Hier der Code, den ich dazu verwende: QPixmap Tools::windowsIconToPixmap( const HICON hIcon ) { HDC hDC = CreateCompatibleDC( GetDC( 0 ) ); HBITMAP hBitmap = CreateCompatibleBitmap( hDC, GetSystemMetrics( SM_CYICON ), GetSystemMetrics( SM_CYICON ) ); HBITMAP hOldBitmap = (HBITMAP)SelectObject( hDC, hBitmap ); DrawIcon( hDC, 0, 0, hIcon ); SelectObject( hDC, hOldBitmap ); DeleteDC( hDC ); QPixmap pxTemp = QPixmap::fromWinHBITMAP( hBitmap, QPixmap::NoAlpha ); DeleteObject( hBitmap ); return pxTemp; } Ich erhalte das Icon in einer Schwarz/Weiß-Version. Sollte der Device-Context hDC nicht mit der Farbtiefe des Displays "arbeiten"? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Schnitzelfritz Geschrieben 14. August 2006 Teilen Geschrieben 14. August 2006 Wenn du nur den Handle des HICON als HBITMAP brauchst, dann solltest du GetIconInfo verwenden. Du benötigst dafür noch die ICONINFO Struktur als Parameter: ... ICONINFO nfo; GetIconInfo ( hIcon, &nfo ); // das ist der Handle für das Icon als HBITMAP nfo.hbmColor; // das ist der Handle für den transparenten Bereich des Icons nfo.hbmMask; ... Falls du noch die transparente Farbe brauchst musst du die beiden Handles noch untersuchen. (GetPixel) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Segfault_ii Geschrieben 14. August 2006 Autor Teilen Geschrieben 14. August 2006 Hi! Danke für die schnelle Antwort. Der Code funktioniert soweit. Jedoch müsste ich noch herausfinden, ob die jeweiligen Bitmaps einen Alpha-Kanal haben oder nicht. Bevor ich das Icon darstelle muss es in ein QPixmap konvertieren. Diese Funktion muss jedoch übergeben bekommen ob ein Alpha-Kanal vorhanden ist oder nicht. Wenn ich den Alpha-Kanal ignoriere habe ich den (erwarteten) schwarzen Kasten ums Icon, wenn ich davon ausgehe, dass immer ein Alpha-Kanal vorliegt sehen Icons ohne Alpha-Kanal nach dem Konvertieren sehr ... seltsam ... aus. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Schnitzelfritz Geschrieben 14. August 2006 Teilen Geschrieben 14. August 2006 Hm... hab ich jetzt auch keine Patentlösung parat. Vielleicht kannst du es über GetObject rausfinden, ob es sich um ein 32 Bit Bitmap handelt (ich glaub mit niedrigerer Bit Tiefe gehen keine Alpha Kanäle :confused: ) ICONINFO nfo; ... BITMAP bm; if ( GetObject ( nfo.hbmColor, sizeof(BITMAP), &bm ) == sizeof(BITMAP) ) { // evtl. Alpha Kanal if ( bm.bmBitsPixel == 32 ) { ... } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Segfault_ii Geschrieben 14. August 2006 Autor Teilen Geschrieben 14. August 2006 Hmm... Das hab ich probiert, aber leider erhalte ich für jedes Icon 32 BitsPerPixel. Ich vermute, das BITMAP wurde bereits für die auf dem Desktop verwandte Auflösung konvertiert, so dass die BitsPerPixel immer der Farbtiefe des Desktops entsprechen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
josa Geschrieben 15. August 2006 Teilen Geschrieben 15. August 2006 Hi! Benutzt Du die GPL-Version von Qt oder besitzt Du eine kommerzielle Lizenz? Trolltech selbst kennt wohl das Problem und bietet im Rahmen der Qt Solutions eine Möglichkeit an, ICO-Dateien direkt zu verwenden. Die Möglichkeit gibt es sowohl für Qt3 als auch für Qt4. Viele Grüße Jochen Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Segfault_ii Geschrieben 16. August 2006 Autor Teilen Geschrieben 16. August 2006 Hi! Ich benutze die GPL-Version von Qt. Über eine kommerzielle Version verfüge ich leider nicht. Allerdings würd es mir auch nur bedingt helfen, eine .ICO-Datei zu laden. Mein Code bekommt ein HICON übergeben, es ist zu dem Zeitpunkt also schon geladen. Aber so nebenbei: Ich kann es nicht glauben, dass es keine Möglichkeit zu geben scheint, auf einen Alpha-Kanal zu prüfen... Das kann doch nicht so schwierig sein. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.