Domanda

C'è un modo per determinare se un HDC utilizza canale alfa? Ho letto 333559 e < a href = "https://stackoverflow.com/questions/685684/how-to-programmatically-detect-if-a-bitmap-has-alpha-channel"> domanda 685.684 , ma le loro domande sono circa BITMAP . A quanto pare, alcuni HDC dispone canale alfa (anche se non possono utilizzarle. Chiamare questo "Tipo 1"), mentre altri no ( "Tipo 2"). So che questo nel modo seguente:

Dato un HDC,

  1. Crea un DC compatibile e creare una sezione DIB. Selezionare il HBITMAP creato nella DC compatibili.

  2. BitBlt la fonte HDC alla DC compatibili. Ora esaminare i bit sezione DIB. Per il tipo 2 HDC, dopo ogni 3 byte è un byte sempre 0 (come 255 255 255 0); per il tipo 1, questi byte sono usualy 255 (come 250 240 230 255). Per evitare falsi positivi, ho memset i bit a tutti 0x80 prima delle chiamate.

  3. Utilizzare GetDIBits direttamente sul HDC fonte, specificare il HBITMAP come GetCurrentObject (HDC, OBJ_BITMAP). Per entrambi i tipi di HDC, il 4 ° byte sono sempre 0.

  4. Modificare il bitmap DC chiamando ExtTextOut. Per il tipo 2, ExtTextOut sempre impostato il 4 ° byte a 0. Per il tipo 1, ExtTextOut sempre lasciare intatti.

Ho anche notato che l'HDC fonte che vengono creati dalle API (CreateCompatibleDC (), BeginPaint () ...) sono sempre di tipo 2. Tipo 1 HDC sono da controlli standard (come il testo del menu). Anche il HDC ho CreateCompatibleDC da un tipo 1 diventa un tipo 2.

Quindi, da un lato, sono frustrato che Microsoft non fornisce parità informativa per gli sviluppatori (un altro esempio può essere che non si può conoscere la direzione di un HBITMAP dopo la sua creazione), d'altra parte, sono ancora chiedendo c'è un modo per distinguere questi HDC.

Grazie per l'aiuto.

È stato utile?

Soluzione

Ho appena imitare il comportamento di GDI e tutto funziona bene ora.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top