Newsgroup: it.comp.lang.c++
Titolo: InvalidateRect (cerco consigli)

Ho costruito una classe di finestre che gestisce la visualizzazione di un
segnale che effettuo
tramite chiamate alle istruzioni moveto e lineto, la windowprocedure di
questa classe si
occupa di disegnare il reticolo sulla stessa, il colore di fondo etc.etc.
il mio problema e' questo:
quale e' il miglior sistema per visualizzare un segnale su questa window, io
attualmente
simulo una base dei tempi che fa' scorrere l'asse x di questa window e non
appena il
contatore raggiunge la dimensione rect.right effettuo un invalidaterect.
In questo modo pero' la visualizzazione non e' molto fluida in quanto in
segnali rapidi
questo continuo invalidare la window produce un noioso sfarfallio (invalido
con l'opzione false e
il wm_paint della window effettua un paintrect con il colore di fondo
selezionato e ridisegna il
reticolo).
Vorrei ottenere un effetto scorrimento in modo che quando il contatore x
raggiunge la dimensione
rect.right della windows il segnale scorra verso sinistra evitando
l'invalidaterect.
spero di aver sintetizzato in maniera chiara il problema.
Sono graditi consigli di tutti i generi.......grazie
Roberto

sinistra evitando l'invalidaterect.
senza ridisegnare l'intera finestra.
Se non fosse per il reticolo, la soluzione sarebbe abbastanza
evidente: ScrollWindow con cx pari a -1 (o comunque al numero
di pixel di cui vuoi scrollare) e cy pari a 0, poi subito UpdateWindow --
la ScrollWindow invalida il solo "rettangolino" (striscia verticale di
pixel sulla estrema destra) che ha "vuotato", e li` la tua routine
che gestisce WM_PAINT disegnera` il nuovo valore.
Ma questo, naturalmente, farebbe "scorrere" anche il reticolo,
il che tu non desideri.  Secondo me, la soluzione piu` semplice
potrebbe essere quella di togliere il reticolo dalla "finestra di
segnale" vera e propria, e disegnarlo invece in una altra finestra,
di background trasparente, che se ne "resta incollata" sempre
subito sopra quella dedicata a mostrare il segnale vero e proprio.
Questo tipo di approccio e` spesso fruttuoso quando una finestra
mostra, assieme, alcuni dati che devono scrollare, e altri che
invece devono restare fermi... usare _due_ finestre, di cui
quella "superiore" con un backround trasparente, e tenerle
accuratamente "incollate" fra di loro (normalmente si fa per uno
"sprite" che scrolla sopra uno "sfondo" fermo -- qui, scrolla
lo "sfondo", che mostra il segnale, ed e` "fermo" l'overlay,
che mostra il reticolo -- ma il principio non e` poi tanto diverso).
[Hmmm... una piccola prova mostra che la cosa non e` poi
cosi` semplice -- lo scroll tende a "spalmare" la griglia, se
essa e` visualizzata al momento della ScrollWindow -- ma
toglierla e rimetterla produce un flicker anche peggiore, anche
con CS_SAVEBITS... ma i gradi di liberta` in gioco sono tanti,
puo` darsi che una qualche combinazione funzioni, per cui
ti lascio comunque questo suggerimento sperando che tu
trovi una combinazione per te soddisfacente].
Alex

.......


registrazione della classe o nell'editor di risorse (dove per
Il parametro di stile WS_EX_TRANSPARENT deve essere usato
nella CreateWindowEx, mi pare (e` infatti uno dei parametri
"estesi", come indica il suo nome).  Comunque, come ti accennavo,
nelle brevi prove che ho fatto questa parte (reticolo trasparente,
fermo, sovrapposto alla finestra che scorre) dava qualche
problema anche a me, quindi non ho al momento una soluzione
pronta.
Alex

 subito sopra quella dedicata a mostrare il segnale vero e proprio.
E se invece la griglia viene disegnata in risposta a WM_ERASEBKGND ?
In questo modo dovrebbe 'starsene ferma'.
Non ho provato, e` solo un suggerimento.
Roberto.