PDA

Visualizza la versione completa : [C++] Disegni che si cancellano


maxcorelli
28-07-2011, 13:07
Ciao a tutti,
Sono alle prese con la progettazione di un programma di disegno. Programmo in win32, adoperando ovviamente il c++.
Il compilatore da me in uso Dev-C++, ma ora passiamo al codice e vi illustro il problema:
Dalla procedura di un dialogo (hWndDlg) parte il disegno su una STATIC (hwndLavagna) figlia della finestra principale (hWndMainFrame):


//...
case IDOK:
hDC = GetDC(hwndLavagna);
Ellipse(hDC, 20, 20, 100, 100);
ReleaseDC(hwndLavagna, hDC);
EndDialog(hWndDlg, 0);
return TRUE;
//...

Fin qui tutto bene e funziona alla perfezione, ma quando ridisegno la finesra principale, cio la metto a riposo a icona, la ingrandisco o la ridimensiono, il l'ellisse sparisce.
Magari SaveDC() e RestoreDC() possono aiutarmi? ho provato a fare una ricerca su Google ma non ho capito come utilizzare le due funzioni.
Qualcuno potrebbe aiutarmi? Ringrazio comunque in anticipo.

MItaly
28-07-2011, 13:32
L'area della finestra viene ridisegnata quando la finestra viene ridimensionata/spostata/parti della finestra che erano coperte da altro diventano visibili/eccetera.
Il modo corretto per gestire la questione disegnare nel WM_PAINT, ovvero quando Windows ti dice "OK, ora bisogna ridisegnare lo sfondo della finestra, tieni questo DC e lavora". Per forzare un WM_PAINT puoi usare la InvalidateRect, oppure puoi usare un approccio ibrido e disegnare quando ti serve, ma salvarti quello che hai disegnato (o in termini di "ho disegnato un ellisse fatto cos, una linea fatta cos, ..." o in una bitmap) e ridisegnarlo nel WM_PAINT.

maxcorelli
03-09-2011, 14:47
Mi scuso se non ho risposto ma sono stato via parecchi giorni.
Intanto ringrazio MItaly per la risposta.
Se provassi a tenermi in un array le informazioni per il disegno, dentro la WM_PAINT potrei scandirmi questo array e disegnare il tutto ogni volta alla chiamata di InvalidateRect. Invece quando parlavi dell'approccio ibrido come potrei fare? Per esempio se volessi disegnare su una bitmap?
Scusatemi ma sto cercando di imparare :-)

MItaly
03-09-2011, 15:00
Originariamente inviato da maxcorelli
Invece quando parlavi dell'approccio ibrido come potrei fare?
L'approccio ibrido che intendevo disegnare come fai adesso quando ti pare, ma aggiungere anche in tale circostanza l'oggetto da disegnare alla "lista delle cose da disegnare" che viene letta nel WM_PAINT.


Per esempio se volessi disegnare su una bitmap?
Devi usare un "memory DC" e selezionarci dentro una bitmap. Qui (http://msdn.microsoft.com/en-us/library/dd183377%28v=vs.85%29.aspx) ci sono un po' di informazioni su come gestire le bitmap.

Loading