Newsgroup: it.comp.programmare.win32
Titolo: aiutatemi (DC, bitmap, ecc...)

vorrei fare un'applicazione che visualizza uno splashscreen con mappa di
trasparenza
questa cosa l'ho già fatta in VB e non è stato difficilissimo
adesso lo voglio rifare in C++ (magari in MFC se è più semplice, ma credo
che sia meglio con le API e basta)
illustro un attimo la logica del programma:
innanzitutto in VB invece di creare dei DC virtuali avevo delle PictureBox,
quindi vorrei sapere come faccio a caricare una BITMAP dal disco e tenerla
in memoria (in un Device Context?)
devo sapere le dimensioni in pixel dell'immagine
POINTAPI imgSize;
imgSize.x = ...; imgSize.y = ...;
così va bene?
poi, una volta caricate le due uimmagini (Sprite e Alpha, due bitmap di
uguali dimensioni. la seconda a 256 livelli di grigio) devo prendere la
parte di schermo di dove c'è il dialog, e questo credo di saperlo fare in
parte:
[ps. come dichiaro una variabile DC?]
TIPO_DATI_DC DeskDC;
DeskDC = GetDC( GetDesktopWindow() );
devo avere altri due DC per le due immagini
la prox cosa che devo sapere è come leggere pixel per pixel questi DC (es.
voglio il valore RGB del pixel x:45,y:178 del DC mioDC)
quindi mi creo un altro DC che poi blitterò sul dialog
adesso leggendo pixxel per pixel dai 3 DC (DeskDC, SpriteDC e AlphaDC) devo
ricavare un quarto pixel che equivale alla sovrapposizione del pixel letto
da SpriteDC su DeskDC col valore alpha di AlphaDC
le ruotine per fare questo le ho in VB:
Function LinearB(inValA As Byte, inValB As Byte, inPos As Single) As Byte
    LinearB = (inValA * (1 - inPos)) + (inValB * inPos)
End Function
Private Function FadePix(PixA As RGBTRIPLE, PixB As RGBTRIPLE, inAmt As
Integer) As RGBTRIPLE
    FadePix.rgbtRed = LinearB(PixA.rgbtRed, PixB.rgbtRed, inAmt)
    FadePix.rgbtGreen = LinearB(PixA.rgbtGreen, PixB.rgbtGreen, inAmt)
    FadePix.rgbtBlue = LinearB(PixA.rgbtBlue, PixB.rgbtBlue, inAmt)
End Function
immagino che sapete qual'è il tipo RGBTRIPLE... cmq lo tradurrei in questo
modo:
byte LinearB( byte inValA, byte inValB, int inPos )
{ return (inValA * (1 - inPos)) + (inValB * inPos); }
RGBTRIPLE FadePix(RGBTRIPLE PixA,
                             RGBTRIPLE PixB,
                             int inAmt) {
    RGBTRIPLE tempValue;
    tempValue.rgbtRed = LinearB(PixA.rgbtRed,PixB.rgbtRed,inAmt);
    tempValue.rgbtGreen = LinearB(PixA.rgbtGreen,PixB.rgbtGreen,inAmt);
    tempValue.rgbtBlue = LinearB(PixA.rgbtBlue,PixB.rgbtBlue,inAmt);
    return tempValue;
}
ditemi se c'è qualcosa di scorretto
es. non so se devo usare il tipo BYTE o il tipo char... non sono uguali?
comunque una volta che ho questa routine, in due cicli for annidati leggo i
pixel dai 3 dc e li inserisco nel quarto DC:
for (int imageY = 1; imageY <= IMG_HEIGHT; imageY++) {
    for (int imageX = 1; imageX <= IMG_WIDTH; imageX++) {
        // leggo un pixel da DeskDC (pixDesk), uno da SpriteDC (pixSprite)
        // che devono essere di tipo RGBTRIPLE
        // e uno da AlphaDC (pixAlpha) che deve essere un int dato
        // che sono 256 livelli di grigio
        // poi con FadePix() inserisco il pixel del quartoDC
        pixelDelQuartoDC = FadePix(pixDesk,pixSprite,pixAlpha);
        }
    }
e poi con BitBlt(...) lo blitto sulla dialog, che è una finestra senza
titlebar senza border... e per magia sembra che il logo sia veramente
sfumato....
ma senza di voi la magia sarà un prog in VB, che per un'immagine 300x400
impiega 30 secondi con un Pentium III a 700MHz... shig :(
grazie anticipatamente
--
ciao
xAERO

 DeskDC = GetDC( GetDesktopWindow() );
ok...
HDC hDcDesk, hDcSprite, hDcAlpha, hDcOut;
hDcDesk = GetDC( GetDesktopWindow() );
mi sono bloccato qui! :'(


 so che farmewne....  :(
Per caricare una img da file:
HBITMAP hbmp=(HBITMAP)LoadImage(NULL,"path://myfile",IMAGE_BITMAP,0,0,
LR_LOADFROMFILE );
CBitmap CImg=CBitmap::FromHandle(hbmp);
BITMAP  myBmp;
CDC CMemDC,CVisual;
CVisual.Attach(ilMioDC);
CMemDC.CreatCompatibleDC(&CVIsual);
CMemDC.SelectObject(&CImg);
CImg.GetBitmap(&myBmp);
CDC.StretchBlt(YOUR_X,YOUR_Y,myBmp.bmWidth,myBmp.bmHeight,&MemDC,0,0,
myBmp.bmWidth,myBmp.bmHeight,SRCCOPY);
Sent via Deja.com 
http://www.deja.com/
Before you buy.

 myBmp.bmWidth,myBmp.bmHeight,SRCCOPY);
come faccio senza usare MFC?
con MFC è tutto troppo semplice (bello direte voi), ma voglio capire quello
che faccio... :)
--
ciao
xAERO

 ha scritto nel messaggio
news:8t8vj7$m4srr$1...@ID-51253.news.dfncis.de...

Nella mia home page c'e' una classe per una gestione di bitmap che puo'
tornarti utile :-)
http://digilander.iol.it/npaolini
Ciao
Nazzareno

grazie
