Newsgroup: it.comp.programmare.win32
Titolo: colore di trasparenza per una bitmap...

salve a tutti
ho bisogno di usare BitBlt(...) (o qualcosa di simile) per disegnare una
bitmap su una finestra
questa bitmap sta nelle risorse. ecco come faccio nella WndProc():
 static HDC hdcMem;
 static HBITMAP hbmpClose;
 switch (message)
 {
  case WM_CREATE:
   hbmpClose=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_CLOSE));
   hdcMem=CreateCompatibleDC(GetDC(NULL));
   SelectObject(hdcMem,hbmpClose);
   ReleaseDC(NULL,GetDC(NULL));
   return 0;
  case WM_PAINT:
   hdc=BeginPaint(hWnd,&ps);
   BitBlt(hdc,5,5,18,18,hdcMem,0,0,SRCCOPY);
   EndPaint(hWnd,&ps);
   break;
  case WM_DESTROY:
   DeleteDC(hdcMem);
   DeleteObject(hbmpClose);
   PostQuitMessage(0);
   break;
solo che vorrei fare in modo che tutti i pixel viola siano trasparenti
io pensavo che questa cosa veniva fatta in automatico, invece quando uso
BitBlt disegna anche il viola.
forse devo usare qualche operatore raster particolare al posto di SRCCOPY?
grazie a tutti
0x54F8A7DE - kernel panic

 BitBlt disegna anche il viola.
Per disegnare un bitmap in trasparenza (senza il colore di sfondo) ti
serve un altro bitmap ausiliario, generalmente detto "maschera", in
bianco e nero. Per ogni pixel del bitmap principale che vuoi che venga
disegnato, nella maschera` dovrai far corrispondere un pixel nero; tutti
gli altri pixel dovranno essere bianchi. Ovviamente la maschera la puoi
costuire tu prima con un programma di fotoritocco, oppure crearla al
volo a runtime. Dopodiche` fai cosi`:
1) Prima blitti la maschera sul bitmap principale usando la modalita`
SRCERASE (che e` la AND con sorgente invertita), in modo che le zone di
sfondo diventino nere;
2) Poi blitti la maschera anche nel DC principale ma usando la modalita`
SRCAND, in modo che le zone che dovranno essere occupate dal disegno
diventino nere;
3) Infine blitti il bitmap principale nel DC usando la modalita`
SRCPAINT (che e` la OR). Cosi` facendo avrai il disegno che occupera`
tutte e sole le zone che hai annerito nel punto 2.
---
Bye! Lorenzo Lutti
http://antani.virtualave.net/

 tutte e sole le zone che hai annerito nel punto 2.
innanzitutto grazie per la risposta
perň ci sono un paio di cose che ho da dire:
1) in genere, in tutti i programmi di disegno o cmq che usano grafica, nelle
maschere di trasparenza il nero č un pixel trasparente, e il bianco un pixel
opaco. cmq teoricamente potrei risolvere con BitBlt( SRCINVERT ) se sapessi
come fare
2) io vorrei farmi una funzione TransBlt(....), che č identica a BitBlt()
solo che prima di usare BitBlt legge il pixel 1x1 del DC sorgente e in base
a quello fa la trasparenza
potrei usare SetPixel() e GetPixel() per creare la maschera al volo, ma sono
LENTISSIMI. come potrei fare?
grazie
0x54F8A7DE - kernel panic

 LENTISSIMI. come potrei fare?
Infatti non e` il modo giusto. Ti consiglio di usare GetDIBits(),
elaborare il buffer che ti restituisce, e poi SetDIBits().



C'è un passaggio in più, ecco un pezzo di un mio prog che funzia
benissimo:
BitBlt(TargetDC, X, Y, iImageWidth, iImageHeight, hdcMask, 0, 0,
SRCAND);
BitBlt(TargetDC, X, Y, iImageWidth, iImageHeight, hdcImage, 0, 0,
SRCPAINT);
non ho capito l'utilizzo del SRCERASE, cosa intendi per "zone di
sfondo" che diventano nere?
MadMage

 elaborare il buffer che ti restituisce, e poi SetDIBits().
ho letto i capitoli 15 e 16 della bibbia di Petzold, ma non spiega
chiaramente come usare queste funzioni...
in particolare non capisco quale deve essere il sorgente (se l'hBitmap o
l'hdc) e non capisco perchč ci devono essere tutte e due
e poi pBits cosa č? un'array di semplici bit? cioč me li devo elaborare a
mano per convertirli in un'array bidimensionale di RGBTRIPLE? (o COLORREF)
ti sarei grato se mi puoi spiegare bene come usarla
praticamente io ho un DC sorgente (il DC della finestra)
voglio semplicemente ottenere l'array di bit, modificare il pixel 56x23 per
esempio, e impostarlo a RGB(0,0,0)
come si fa?


 C'č un passaggio in piů
E` vero, l'ho messo per "sicurezza" nel caso che il tuo bitmap sorgente
non disponga gia` dello sfondo nero da prima (puo` essere comodo,
specialmente per i bitmap scuri, usare sfondi vivaci).


 RGBTRIPLE? (o COLORREF)
E` il buffer che tu devi passare alla funzione e che ricevera` i dati di
ritorno. La quantita` di dati che ti ritornano te la devi calcolare tu,
dipende dal numero di scanlines che vuoi leggere e dalla dimensione di
ogni scanline (che a sua volta dipende dal numero di byte usati per
rappresentare ogni pixel).
