View Full Version : [GDI+ | C++] Usare GDI+ in eventi diversi da WM_PAINT
stdecden
01-09-2007, 17:11
Salve a tutti,
come si fà ad usare gdi + in eventi diversi da WM_PAINT come ad esempio WM_MOUSEMOVE??
variabilepippo
01-09-2007, 17:35
come si fà ad usare gdi + in eventi diversi da WM_PAINT come ad esempio WM_MOUSEMOVE??
Perché le funzioni della GDI+ non dovrebbero funzionare anche in risposta al messaggio WM_MOUSEMOVE (http://www.codeguru.com/cpp/g-m/gdi/gdi/article.php/c3661/)??? :confused:
stdecden
01-09-2007, 18:23
Semplicemente non mi disegna nulla!!
Se peró apro una voce del menú la porzione di finestra sottostante si aggiorna ed il resto no...
Forse sbaglio q.cosa nel codice
variabilepippo
01-09-2007, 18:28
Forse sbaglio q.cosa nel codice
Probabilmente sì... :rolleyes:
stdecden
01-09-2007, 21:14
Ho capito l'errore ma non so come risolverlo :cry:
allora l'errore é che creavo il DC tramite:
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd,&ps);
mentre MSDN dice espressamente che non puó essere utilizzata fuori da WM_PAINT. Ma allora quale funzione devo utilizzare?????? :help:
mentre MSDN dice espressamente che non puó essere utilizzata fuori da WM_PAINT. Ma allora quale funzione devo utilizzare?????? :help:GetDC()/ReleaseDC().
È chiara anche un'altra cosa: bisogna valutare bene cosa devi disegnare al di fuori di WM_PAINT e quanto tale operazione di disegno deve essere "persistente" o meno.
Mi spiego meglio: per esempio a seguito di WM_LBUTTONDOWN prendi il HDC e disegni direttamente un pallino nel punto del click. Successivamente potrebbe arrivare un WM_PAINT. Se volevi rendere tale pallino persistente, devi memorizzarti da qualche parte una informazione che l'hai disegnato in modo che al WM_PAINT lo ridisegni.
stdecden
02-09-2007, 11:37
È chiara anche un'altra cosa: bisogna valutare bene cosa devi disegnare al di fuori di WM_PAINT e quanto tale operazione di disegno deve essere "persistente" o meno.
Ne sono consapevole... infatti volevo usarlo solo per evidenziare in che parte del controllo si trovava il mouse. Infatti ho giá fatto qualcosa del genere in vb.net e mi funzionava benissimo! Grazie ancora per la tua risposta
Tutto ciò è sbagliato, se WM_PAINT esiste è perchè devi disegnare solo lì, non ha senso disegnare in WM_LBUTTONDOWN e poi anche in WM_PAINT. Basta memorizzare da qualche parte che deve essere disegnato un pallino (es disegnaPallino = true), e forzare un repaint della finestra con InvalidateRect, RedrawWindow o SetWindowPos.
Tutto ciò è sbagliato, se WM_PAINT esiste è perchè devi disegnare solo lìMi dispiace dirlo ma tale affermazione è falsa.
Da MSDN When to Draw in a Window (http://msdn2.microsoft.com/en-us/library/ms534902.aspx) dice:
If an action requires immediate feedback, the application can draw while the action takes place, without waiting for WM_PAINT. For example, a typical application highlights the area the user selects rather than waiting for the next WM_PAINT message to update the area.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.