PDA

Visualizza la versione completa : [C/C++] Win32 API: Significato della funzione BitBlt


giorgio_kollias
24-07-2012, 05:56
Salve a tutti, ho cominciato da poco a programmare con le Win32 API, ed ho trovato un algoritmo con cui caricare una bitmap che utilizza la funzione BitBlt, solo che non ho capito a che cosa serve.
La traduzione della spiegazione del msdn è "La funzione BitBlt esegue un trasferimento di blocchi di bit dei colori corrispondenti ai dati in un rettangolo di pixel, dal Device Contest di origine ad un Device Contest destinatario", ma non ho ancora capito che significhi!!! chi mi può dare una spiegazione più "capibile" possibile?

oregon
24-07-2012, 09:50
In pratica, sposta pezzi di immagine così come rappresentata nel device context (non contest) ...

giorgio_kollias
24-07-2012, 20:02
Allora, vediamo se ho capito:


1. Preparo la finestra ad essere disegnata, preparando una struttura di disegno (PAINSTRUCT ps) [HDC retPaint=BeginPaint(HWND hwnd, &ps)] (ritorna NULL se non è disponibile nessun DC)
2. Creo una memory DC solo se il DC (in questo caso il monitor) è disponibile (cioè se BeginPaint() ha ritornato un nonNULL) [HDC hDC=CreateCompatibleDC(retPaint)] (ritorna l'handle della DC)
3. Seleziono un oggetto graphics (la superficie su cui disegnare) (passando come primo parametro la handle del DC e come secondo la handle dell'oggetto) [SelectObject(hDC, HBITMAP hObj)]
4. Prelevo le informazioni dell'oggetto grafico fornendogli la propria handle, il numero di informazioni (quelle di un bitmap[BITMAP bmp]), e il buffer(bmp) [GetObject(hObj, sizeof(BITMAP bmp), &bmp)]
5. Tramite la funzione BitBlt, trasferisco le immagini da file al DC???

E qual è questo DC d'origine??

Grazie mille per la risposta :)

oregon
24-07-2012, 20:09
Da file ? La BitBlt lavora da memoria a memoria ...

Ma tu, cosa vuoi fare ?

Lascia perdere, per ora, la generica domanda sulla BitBlt e spiega cosa vuoi fare ...

MItaly
24-07-2012, 20:18
Se quello che vuoi fare è disegnare un'immagine sullo schermo dovrai:
- caricare la bitmap con la LoadImage;
- creare un memory DC;
- selezionare nel DC in questione l'HBITMAP ottenuto prima (salvando la bitmap "stock" che ci stava dentro prima);
- nel WM_PAINT, ottenere il DC di output con la BeginPaint;
- usare BitBlt per copiare l'immagine contenuta nel memory DC al DC della finestra;
- cleanup (EndPaint, SelectObject con la bitmap stock riottenendo l'HBITMAP di prima, DeleteObject sulla bitmap, DeleteDC sul memory DC).

giorgio_kollias
25-07-2012, 01:27
Ok, grazie mille a tutti e due, avevo capito male io... :)

Loading