PDA

Visualizza la versione completa : [C++] BitBlt copia quel che non deve?


newbie
18-01-2006, 17:00
Stavo tentando, in VC++ .NET 2003, il contenuto di una System::Windows::Forms::PictureBox (pBox1) in un'altra (pBox2) usando la funzione API BitBlt. Ecco il codice che ho usato:



Graphics *gSorg = pBox1->CreateGraphics();
Graphics *gDest = pBox2->CreateGraphics();
//reperisce gli HDC necessari per BitBlt
HDC dc1 = (HDC)gSorg->GetHdc().ToPointer();
HDC dc2 = (HDC)gDest->GetHdc().ToPointer();
//fa la copia
BitBlt(dc2, 0, 0, pBox1->Width, pBox1->Height, dc1, 0, 0, SRCCOPY);
gSorg->ReleaseHdc(dc1);
gDest->ReleaseHdc(dc2);


Il risultato, abbastanza assurdo, è che il contenuto di pBox1 viene copiato... assieme a quello che la copre! Se, ad esempio, sovrappongo in parte un pulsante a pBox1, in pBox2 apparirà anche la parte del pulsante sovrapposta. http://forum.html.it/forum/faccine/014.gif

Samuele_70
18-01-2006, 18:32
Originariamente inviato da newbie
...
Il risultato, abbastanza assurdo, è che il contenuto di pBox1 viene copiato... assieme a quello che la copre! Se, ad esempio, sovrappongo in parte un pulsante a pBox1, in pBox2 apparirà anche la parte del pulsante sovrapposta. http://forum.html.it/forum/faccine/014.gif

Si me lo faceva anche a me, con il builder... :master:
Purtroppo credo non ci siano soluzioni. :bhò:

newbie
18-01-2006, 19:36
Praticamente il mio problema sarebbe copiare il contenuto di una PictureBox in una HBITMAP, e tentavo di farlo così:
- ottenerne il Graphics, ed estrarne un HDC
- creare una System:: Drawing::Bitmap vuota, con le stesse dimensioni del Graphics
- creare un altro Graphics collegato alla Bitmap (in modo che ciò che è disegnato sul Graphics vada nella Bitmap) ed ottenerne l'HDC
- con BitBlt :cry:, copiare i dati da un HDC all'altro, quindi da un Graphics all'altro, quindi dalla PictureBox alla Bitmap
- ricavare dalla Bitmap il suo HBITMAP
- e il gioco è fatto...

Tutto questo per registrare un fielato AVI contenente tutto cio che appare nella PictureBox... il problema è che la libreria che uso per farlo accetta solo frame in formato HBITMAP :dhò:
Esiste un altro modo per farlo in VS.NET 2003?

Loading