Originariamente inviato da MItaly
...
Sei sicuro di aver implementato correttamente questa tecnica?
No non ne sono sicuro.
Metto il codice relativo all'evento WM_PAINT, sperando sia sufficiente.
codice:
case WM_PAINT:
// Se ridimensiono o sposto la finestra non disegno
if(bRidimensionamento)
return 0;
// Se non voglio il grafico
if(!bDisegna)
return 0;
// Calcolo il rettangolo dove disegnare
// rBordi è un RECT
// rD è il rettangolo GetClientRect
bGenerico=calcolaRettangolo(hWnd,&rD,rBordi);
hdc = BeginPaint(hWnd, &ps);
// Creo un DC compatibile per la bitmap
// e creo la bitmap per il double buffering
hMemDC=::CreateCompatibleDC(hdc);
if(hMemDC!=NULL)
{
hMemBit=::CreateCompatibleBitmap(hdc,rD.right-rD.left,rD.bottom-rD.top);
if(hMemBit!=NULL)
{
hOldBit=(HBITMAP)::SelectObject(hMemDC,hMemBit);
// Se utilizzo la bitmap il punto in alto a destra è (0,0)
// Se non utilizzo la bitmap devo inserire i dati di rBordi
::Rectangle(hMemDC,0,0,rD.right-rD.left,rD.bottom-rD.top);
/*
disegnaPianoCartesiano(hMemDC,rD,10,10);
disegnaLinee(hMemDC,rD,valori,coloriLinee);
*/
// Disegno i dati man mano che arrivano
disegnaLinea(hMemDC,rD,valoriLog,coloriLinee);
// Copio la bitmap su schermo usando rBordi per il posizionamento voluto
BitBlt(hdc, rBordi.left,rBordi.top, rD.right - rD.left, rD.bottom - rD.top, hMemDC, 0, 0, SRCCOPY);
// Riseleziono la precedente bitmap e elimino la bitmap temporanea
SelectObject(hMemDC, hOldBit);
DeleteObject(hMemBit);
}
DeleteDC(hMemDC); // Libero il DC temporaneo
}
EndPaint(hWnd, &ps);
break;
La funzione disegnaLinea si occupa di disegnare i valori del vector<double> valoriLog.
Nei miei intendimenti e per quel poco che so del double buffering, dovrebbe essere corretta come implementazione.