Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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)

Geschrieben

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.

Geschrieben

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 )

    {

        ...

    }

}

Geschrieben

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.

Geschrieben

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

Geschrieben

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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...