Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

HICON -> QIcon/QPixmap?

Empfohlene Antworten

Veröffentlicht

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"?

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)

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.

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 )

    {

        ...

    }

}

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.

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

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.