2010-07-23 5 views
2

J'ai une application avec un arrière-plan transparent dans la zone client qui est dessinée en noir parce que la fenêtre n'est pas en couches. Dans chacun de ses messages WM_PAINT je fais un BitBlt à une mémoire-DC, après que j'utilise le memory-DC avec UpdateLayeredWindow à une fenêtre de toile en couches.BitBlt + UpdateLayeredWindow et CreateDIBSection en profondeur de couleur de bureau 16 bits

configuration de la mémoire-DC:

HDC hdcMemory = CreateCompatibleDC(NULL); 
HBITMAP bmpMemory = CreateDIBSection(hdcMemory, (BITMAPINFO*)&m_BitmapInfoHeader, 
DIB_RGB_COLORS, (void **)&m_pDIBSectionBits, NULL, (DWORD)0); 
SelectObject(hdcMemory, bmpMemory); 

En WM_PAINT utiliser la fonction BitBlt pour copier la zone client des applications DC informations à la mémoire DC. Après cela, je fais un UpdateLayeredWindow avec le DC de la mémoire à un DC de toile en couches (c'est un CWnd). Donc, c'est en temps réel, et le résultat est: J'ai la fenêtre d'application normale et une fenêtre en couches en outre avec une forme irrégulière et la transparence par pixel. Tout fonctionne très bien avec une profondeur de couleur de 32 bits pour le bureau!

Si je passe en 16 bits, la fenêtre de canevas en couches est brouillée. Le dessin est mauvais et toute la fenêtre est cliquable. Il pense que c'est à cause du manque d'informations sur les canaux alpha.

J'ai donc beaucoup cherché sur Google pour trouver une solution. Je trouve que, dans cette situation, je dois créer la mémoire DC avec

HDC hdcMemory = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL); 

au lieu de CreateCompatibleDC (NULL). Parce que le DC compatible me donnerait un DC 16 bits.

Le dessin est meilleur avec CreateDC. Mais toute la fenêtre est toujours cliquable et la transparence est dessinée en noir dans la fenêtre superposée. Donc je pense que le problème est avec BitBlt ou BitmapInfoHeader de CreateDIBSection.

  1. Je ne sais pas si d'utiliser BitmapInfoHeader.biBitCount = 32 ou BitmapInfoHeader.biBitCount = 16 bits. Pensez que c'est 32. Et qu'en est-il de la biCompression -> BI_RGB ou BI_BITFIELDS? Comment ajouter les informations de canal alpha à la mémoire-DC après BitBlt (..., SRCCOPY) le DC de 16 bits à la mémoire-DC, de sorte qu'il fonctionne avec UpdateLayeredWindow? (peut-être: pré-multiplier les canaux rgb avec le canal alpha?) Ne sais pas comment faire.


Je me suis un peu plus près le problème de la profondeur de couleur de bureau 16 bits.

HDC hdcMemory = CreateCompatibleDC(NULL); 

Ce qui précède semble fonctionner. Mais le résultat que ma fonction UpdateLayeredWindow produit semble désordonné.

Donc, c'est parce que la couleur noire est manquante! Chaque pixel entièrement noir devient transparent. Vous pouvez voir à travers et cliquez sur. Tous les autres pixels perdent leur partie noire et ne font que cliquer.

J'ai fait un test: J'ai ouvert Windows Paint.exe, fait une surface de la largeur et de la hauteur des fenêtres et noir comme couleur pleine. Puis je l'ai mis sous ma fenêtre en couches (avec la couleur noire manquante), j'ai pris la fenêtre en couches comme fenêtre forgeround, et ta-da, ma fenêtre en couches semble normale en combinaison avec le noir brillant Paint.exe .

Donc j'ai expiré avec BitBlt et son paramètre d'opération raster à nouveau. Mais pas de chance.

Comment est-ce que je peux mélanger la couleur noire avec BitBlt à mon DC avant de dessiner avec UpdateLayeredWindow?

Répondre

Questions connexes