O HDC usa o canal alfa?
-
22-09-2019 - |
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,
Crie um CC compatível e crie uma seção DIB. Selecione o HBITMAP criado no DC compatível.
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.
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.
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.
Solução
Acabei de imitar o comportamento do GDI e tudo funciona bem agora.