Pergunta

Existe uma maneira de determinar se um HDC usa o canal alfa? Eu li Pergunta 333559 e Pergunta 685684, mas suas perguntas são sobre bitmap. Aparentemente, algum HDC possui canal alfa (embora eles não o usem. Chame isso de "tipo 1") enquanto outros não ("tipo 2"). Eu sei disso fazendo o seguinte:

Dado um HDC,

  1. Crie um CC compatível e crie uma seção DIB. Selecione o HBITMAP criado no DC compatível.

  2. Bitblt o HDC de origem para o DC compatível. Agora examine os bits da seção DIB. Para o HDC tipo 2, após cada 3 bytes, há um byte sempre 0 (como 255 255 255 0); Para o tipo 1, esses bytes são usuais 255 (como 250 240 230 255). Para evitar o falso positivo, eu mato os bits para todos os 0x80 antes das chamadas.

  3. Use GetDibits diretamente no HDC de origem, especifique o HBITMAP como getCurrentObject (HDC, Obj_bitmap). Para ambos os tipos de HDC, os 4º bytes são sempre 0.

  4. Altere o bitmap DC chamando exttextout. Para o tipo 2, o exttextout sempre define os 4º bytes para 0. Para o tipo 1, o exttextout sempre os deixa intocados.

Também notei que o HDC de origem criado por APIs (CreateCompatiBledC (), BeginPaint () ...) é sempre o tipo 2. O HDC tipo 1 é de controles padrão (como o texto do menu). Até o HDC I CreateCompatiBledC de um tipo 1 se torna um tipo 2.

Então, por um lado, estou frustrado por a Microsoft não fornecer informações iguais aos desenvolvedores (outro exemplo pode ser que você não pode saber a direção de um hitmap depois de ser criado), por outro lado, ainda estou me perguntando Lá uma maneira de distinguir esses HDC.

Obrigado pela ajuda.

Foi útil?

Solução

Acabei de imitar o comportamento do GDI e tudo funciona bem agora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top