Question

Est-il possible que je peux déterminer si un HDC utilise le canal alpha? Je lis Question 333559 et < a href = "https://stackoverflow.com/questions/685684/how-to-programmatically-detect-if-a-bitmap-has-alpha-channel"> question 685684 , mais leurs questions sont sur BITMAP . Apparemment, certains HDC a canal alpha (mais ils ne peuvent pas l'utiliser. Appelez ce « type 1 ») tandis que d'autres ne le font pas ( « type 2 »). Je sais que cela en procédant comme suit:

Etant donné un HDC,

  1. Créer un DC compatible et créer une section DIB. Sélectionnez le HBITMAP créé dans le DC compatible.

  2. BitBlt la source HDC au DC compatible. Examinons maintenant les bits de section DIB. Pour le type 2 HDC, tous les 3 octets il y a un octet toujours 0 (comme 255 255 255 0); pour le type 1, ces octets sont usualy 255 (tel que 250 240 230 255). Pour éviter de faux positifs, je Memset les bits à tous 0x80 avant les appels.

  3. Utilisez GetDIBits directement sur le HDC source, spécifier le HBITMAP comme GetCurrentObject (HDC, OBJ_BITMAP). Pour les deux types de HDC, 4e octets sont toujours 0.

  4. Changer le bitmap DC en appelant ExtTextOut. Pour le type 2, ExtTextOut toujours défini 4e octets à 0. Pour le type 1, ExtTextOut les laisser toujours intacte.

J'ai aussi remarqué que le HDC source qui sont créés par les API (CreateCompatibleDC (), BeginPaint () ...) sont toujours de type 2. Type 1 HDC sont des contrôles standards (comme le texte de menu). Même le HDC I CreateCompatibleDC d'un type 1 devient un type 2.

Alors, d'une part, je suis frustré de voir que Microsoft ne fournit pas d'informations égales aux développeurs (un autre exemple peut être que vous ne pouvez pas connaître la direction d'un HBITMAP après sa création), d'autre part, je suis demande encore est-il un moyen de distinguer ces HDC.

Merci pour l'aide.

Était-ce utile?

La solution

Je viens de mimer le comportement du GDI et tout fonctionne bien maintenant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top