Newsgroup: it.comp.programmare.win32
Titolo: InvalidateRect e UpdateWindow

Eccomi di nuovo qui... Altro dubbio!
Ho questi trap di WM_LBUTTONDOWN e WM_LBUTTONUP:
  case WM_LBUTTONDOWN:
    hdc=GetDC(hwnd);
    InvalidateRect(hwnd, NULL, TRUE);
    UpdateWindow(hwnd);
    sprintf(buff, "Mouse Down");
    TextOut(hdc, 300, 300, buff, strlen(buff));
    ReleaseDC(hwnd, hdc);
    return(0);
  case WM_LBUTTONUP:
    hdc=GetDC(hwnd);
    InvalidateRect(hwnd, NULL, TRUE);
    UpdateWindow(hwnd);
    sprintf(buff, "Mouse Up");
    TextOut(hdc, 300, 300, buff, strlen(buff));
    ReleaseDC(hwnd, hdc);
    return(0);
Da quanto ho capito WM_PAINT viene spedito solo se e' l'unico
messaggio in coda... InvalidateRect di per se' non invia nulla, quindi
l'UpdateWindow forza la ricezione di un WM_PAINT. Nel libro di Petzold
e' riportato un esempio (lo riassuo per brevita') sul messaggio
WM_VSCROLL: in pratica calcola delle nuove coordinate per il testo che
viene stampato alla ricezione della WM_PAINT. Una volta calcolati i
nuovi valori invoca una InvalidateRect ed esce dalla gestione di
WM_VSCROLL.
Come mai non serve l'UpdateWindow? E' possibile che il mio programmino
abbia tanti messaggi in coda da inibire l'invio di un WM_PAINT in modo
non forzato?
Grazie in anticipo per ogni chiarimento!

 ha scritto nel messaggio
news:fd7dnucq41d89t9lu...@4ax.com...

Hai pressochè capito tutto, c'è un unica assunzione nel tuo ragionamento che
va rivista.
L'InvalidateRect non è vero che di per se non invii nulla... anzi.
Questa funzione avvisa il sistema che una parte della finestra ha bisogno di
rifarsi il trucco,
il sistema se ne avvede e quando non ci sono altre incombenze(coda dei
messaggi vuota) l'autorizza ad appagare la vista(WM_PAINT).
L'esempio del Petzold da te citato non ha bisogno di forzare il WM_PAINT
perchè evidentemente gli basta aggiornare l'output solo quando la coda dei
messagi è vuota.(nel caso di uno scroll di una finestra "pesante" in un
sistema lento, immagina se l'utente debba aspettare che windows gli
ridisegni tutto per agire sul cursore della scrollbar).
Nel tuo caso invece.... non capisco l'utilità dell'InvalidateRect e del
sucessivo Update.(di fatto ti forzano il WM_PAINT ma allora perchè disegnare
dopo e non dentro il WM_PAINT?)
(supongo scopo didattico)
E cmq ricorda che qualsiasi disegno a video che fai al di fuori del WM_PAINT
potrebbe andare perso nel caso in cui il sistema decida che la tua finestra
debba essere ridisegnata.
(quindi la scritta mouseup e mouse down la devi mettere opportunamente anche
nel WM_PAINT).
Ciao
Molebio

 disegnare dopo e non dentro il WM_PAINT?) (supongo scopo didattico)
Esatto, l'ho fatto solo per fare un esperimento. Avevo pensato a come
poter implementare delle scritte che appaiono solo in determinate
condizioni (i.e. pressione del mouse). Usare il WM_PAINT mi sembrava
laborioso...
Vediamo se ho capito correttamente: se nel mio esempio elimino
l'UpdateWindow il trap a WM_LMOUSE invalida la finestra, avvisa windows
che a tempo debito sara' necessario un repaint e stampa la scritta. A
quel punto puo' arrivare la WM_PAINT che mi pulisce l'area client
(perdendo di fatto la stringa)... Infatti l'unico modo per vedere
qualcosa e' premere il tasto del mouse come ai tempi di Hyper Olympics
in sala giochi! :)
Se lascio l'UpdateWindow il WM_PAINT viene invocato subito, la
BeginPaint valida l'area (tutta), la stringa viene stampata e la message
queue rimane vuota perche' la finestra va bene cosi' com'e'...
L'esempio del Pezold funziona perche' dopo l'InvalidateRect nella
WM_VSCROLL non ci sono messaggi in attesa e quindi la WM_PAINT viene
lanciata in "tempi brevi"
Spero di aver capito bene...
-- 
       Tremal-Naik -- Ghouls Emperor -- GnuPGid: 0xF093D6AD
E.A. Poe Klingon Translation Project: 
http://www.cs.unibo.it/~mbenini
List of my abandonware games: 
http://www.cs.unibo.it/~mbenini/abandon
    My miniatures page: 
http://www.cs.unibo.it/~mbenini/miniature

 Spero di aver capito bene...
Bravo =)
Ciao
Molebio

Scusare raga,
mi permetto di allacciarmi alla vostra discussione perkè penso di avere un
problema simile.
Io ho una lista ke carica migliaia di righe, vorrei ottimizzarla in
velocità, soprattutto riguardo alla visualizzazione, quindi mi kiedevo come
posso fare a bloccare il refresh della lista finke nn è totalmente riempita
e fare il refresh solo alla fine... oppure accetto qlq altra dritta...
Tnks in anticipo...
Kenny.

 Kenny.
Ciao