Segfault_ii Geschrieben 14. August 2006 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"?
Schnitzelfritz Geschrieben 14. August 2006 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)
Segfault_ii Geschrieben 14. August 2006 Autor 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.
Schnitzelfritz Geschrieben 14. August 2006 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 ) { ... } }
Segfault_ii Geschrieben 14. August 2006 Autor 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.
josa Geschrieben 15. August 2006 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
Segfault_ii Geschrieben 16. August 2006 Autor 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.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden