Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Richiesta sull'evento Resize

Salve a tutti!
Il form principale del mio programma ha la proprieta' BorderStyle impostata
a 2- Sizable. Ovviamente, nel momento in cui clicko con il tasto del mouse
sul bordo, si attiva l'evento Resize, che contiene una routine. Tale
routine, pero', viene ripetuta in continuazione fino a quando non rilascio
il tasto del mouse. A quel punto, l'evento Resize e' concluso e amen. Tutto
cio' e' perfettamente corretto e coerente. Io vorrei, pero', far si' che la
mia routine venisse eseguita una sola volta, alla fine del ridimensionamento
del form. Avete idee su come fare? Ho cercato su google, ma ho trovato altri
problemi/soluzioni relativamente al Resize, e tra l'altro il
MouseDown/MouseUp mi funzionano solo SUL form, non sul bordo (mi pare che
sul bordo gli eventi in questione non scattino proprio... sbaglio?).
Mille grazie per l'attenzione! :)
- SonicBoom -

 del form. Avete idee su come fare?
imposta un flag boolean dichiarato a livello di form nella routine
private sub sbMiaRoutine()
    if flag then exit sub
    flag=true
    ...
    ...
    ...
end sub
CIAO

 ha scritto nel
messaggio news:lCGN8.3863$Kt3....@twister2.libero.it...

Cosě la funzione viene eseguita una sola volta e a quanto ho capito non gli
interessa questo ...
lui vuole fare eseguire la routine di resize solo quando viene lasciato
andare il tasto del mouse ...
mi sa che deve subclassare gli eventi mouseup e mousedown del form, perchč
gli eventi esposti da vb non tengono conto del bordo
... potresti anche giocare su un timer ...
esempio .. un timer di 2 secondi ...
lo attivi (lo fai partire) ogni volta che "accade" l'evento resize .. per
cui mentre stai ridimensionando non va in timeout.
Se si verifica il timeout del timer allora ri-dimensioni il contenuto
all'interno ...
l'inconveniente č che il resize avviene anche se hai il bottone del mouse
premuto ma il mouse fermo.
Saluti

 gli eventi esposti da vb non tengono conto del bordo
Ringrazio entrambi.
Effettivamente Fox (saluti a Scully!) ha interpretato bene il mio pensiero.
Credo che dovro' affidarmi al subclassing, perche' l'idea del timer e' buona
ma non ottimale...
Mille grazie in ogni caso!
- SonicBoom -

 del form.
Spero di non dire una castroneria, perché vado di fretta:
metti la routine da eseguire esterna alla _resize, setta
un flag all'_interno_ della resize, e dalla MouseUp, _se_
il flag è settato, esegui la routine e resetti il flag.
Vado ad orecchio, ma dovrebbe andare, se ho capito
quello che ti serve. :-)
Bye, G.

 > il tasto del mouse.
Aspè, ho letto meglio... a me questo non succede !
La _resize viene chiamato solo al rilascio del mouse.
Sei sicuro di quello che dici ? Crea un lavoro nuovo,
metti solo un
    MsgBox "Chiamato da resize"
nella _resize e vedi che succede.
Bye, G.

"Paperino" <non...@lo.dico> ha scritto

hmmm... col msgbox blocchi il codice... puo' chiamarlo una volta sola.
prova questa sotto:
Private Sub Form_Resize()
    If WindowState = 1 Then Exit Sub
    On Error Resume Next
    Caption = (Width \ Screen.TwipsPerPixelX) & " × " & (Height \
Screen.TwipsPerPixelY)
End Sub
ciao, a.

 nella _resize e vedi che succede.
Ciao Paperino.
Ho letto anche il tuo suggerimento e il comportamento che t'ho descritto si
verifica puntualmente anche con il solo MsgBox.
Non credo di aver capito a fondo il tuo primo suggerimento: dovrei usare
_DUE_ flag distinte in _Resize e _MouseUp, una sola o cosa? Ma il tuo
suggerimento non e' sostanzialmente quello di Claudio Gamberini?
Credo di dover usare, come suggerito da Fox Mulder, il subclassing. Mi
informero' in proposito sul sito comune.
Grazie comunque!
- SonicBoom -

 prova questa sotto:
[CUT]
Il comportamento resta, comunque, lo stesso: la caption cambia dal momento
in cui premo il tasto del mouse sul bordo del form, fino a quando non lo
rilascio. Io vorrei che la routine venisse eseguita una sola volta, al
momento del rilascio, cioe' quando, presumibilmente, l'utente ha finito il
ridimensionamento del form stesso.
Ciao,
- SonicBoom -

 wrote in message
news:bqGN8.3808$Kt3....@twister2.libero.it...


     If FormWidth <> Me.Width or FormHeight <> Me.Height then
sarebbe verificata e mi parte il codice.
O mi sbaglio?
Comunque grazie!
- SonicBoom -

 il flag è settato, esegui la routine e resetti il flag.
Purtroppo non viene scatenato il mouse up dopo il resize!
La soluzione in un'altro post ;-)
Lokar
--
Sito Comune: 
http://www.it-lang-vb.net/
Manifesto: 
http://www.it-lang-vb.net/docs/Manifesto.txt


Meglio un Me.Print "Resize"
Cmnque a me scatena l'evento in continuo man mano che faccio il resize.


 Lokar
Grazie, ciao!
- SonicBoom -

 wrote in message
news:K_IN8.4618$j65.1...@twister1.libero.it...


[SonicBoom]

Il problema era molto stimolante per cui mi ci sono messo d'impegno.
Mouse Hook questo sconosciuto!
Leggevo qua e la che funziona solo se l'hook (una funzione callback)
viene messo in una DLL (ma mi e' parso di capire anche che questo e'
valido solo se si intende fare hook fuori dal contesto
dell'applicazione, infatti cosi' funziona!).
Non avendo mai affrontato l'argomento (se non a livello teorico) mi son
detto: "Su! Qualcosa di nuovo da imparare!".
Un po' di ApiGuide, un po' di google (incontrando anche vecchi post del
"buon" Zanna in veste di "studente" e non di "maestro"), un po' di
fantasia ed ho tirato fuori il codice che segue.
Copia, incolla e compila per provarlo, sostituisci le varie Form1.Print
con un'opportuna sub di resize dei controlli =)
Per spiegazioni... sono qua =)
1 Form -- Nome Form1 (Metti Autoredraw a true per le print)
1 Modulo -- Nome come ti pare ;)
'**************************
'INIZIO MODULO
'**************************
Option Explicit
Public bMustResize As Boolean
Public Const WH_MOUSE = 7
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As
Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function SetWindowsHookEx Lib "user32" Alias
"SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal
hmod As Long, ByVal dwThreadId As Long) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As
Long) As Long
Public hHook As Long
Public Function MouseProc(ByVal idHook As Long, ByVal wParam As Long,
ByVal lParam As Long) As Long
   If bMustResize Then
      If wParam = 514 And bMustResize Then
         'Form1.Cls
         Form1.Print "Ridimensionato da Hook"
         bMustResize = False
      End If
   End If
   MouseProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
End Function
'**************************
'FINE MODULO
'**************************
'**************************
'INIZIO FORM
'**************************
Option Explicit
Private PreviousState As Long
Private Sub Form_Load()
   hHook = SetWindowsHookEx(WH_MOUSE, AddressOf MouseProc,
App.hInstance, App.ThreadID)
End Sub
Private Sub Form_Activate()
   bMustResize = False
End Sub
Private Sub Form_Unload(Cancel As Integer)
    'remove the windows-hook
    UnhookWindowsHookEx hHook
End Sub
Private Sub Form_Resize()
   If Me.WindowState = vbNormal Then
      'Si sta ridimensionando!
      If PreviousState = vbNormal Then
         bMustResize = True
      'Si viene da uno stato della finestra diverso
      Else
         Form1.Print "Ridimensionato da Ripristina"
      End If
   ElseIf Me.WindowState = vbMaximized Then
      Form1.Print "Ridimensionato da Ingrandisci"
   ElseIf Me.WindowState = vbMinimized Then
      'Tipicamente non fa nulla ;)
   End If
   PreviousState = Me.WindowState
End Sub
'**************************
'FINE FORM
'**************************
Una piccola sfida davvero stimolante ;-) THNX!
btw hth
Happy Coding =)


 Form_MouseDown.
Questo e' molto interessante...
L'unico dubbio che mi resta e' quanto espresso anche da Lokar: dopo il
resize viene scatenato l'evento mouseup? Mi pare di no, pero' non ci
giurerei...
Grazie in ogni caso!
- SonicBoom -


...e mi ringrazi tu???
Sono io che mi prostro con la mia faccia sotto ai tuoi piedi... e tu puoi
pure muoverti!!!! :)
Mille grazie ancora!
- SonicBoom -

 wrote in message
news:wjJN8.4612$Kt3....@twister2.libero.it...


 Lokar
Non funziona alla grande, funziona alla _GRANDISSIMA_!!! :)
Yuppi! :)
Grazie ancora dal tuo umilissimo servo!
- SonicBoom -

 - SonicBoom -
Sembra che tu abbia scordato .Mode = vbModeZerbino ;)
In ogni caso, quel 514 e' davvero bruttino, probabilmente esiste una
bella costante per dire la stessa cosa (a naso WM_MOUSEUP o qualcosa del
genere). Inoltre mi sono accorto che mentre il "Ripristina" dopo aver
massimizzato _deve_ ridimensionare, il "Ripristina" dopo aver
minimizzato non ne ha bisogno per cui la Form_Resize diventa:
'*** BEGIN FORM RESIZE ***
Private Sub Form_Resize()
   If Me.WindowState = vbNormal Then
      If PreviousState = vbNormal Then
         bMustResize = True
      ElseIf PreviousState = vbMaximized Then
         Form1.Print "Ridimensionato da Ripristina"
      ElseIf PreviousState = vbMinimized Then
         'Tipicamente non fare nulla ;)
      End If
   ElseIf Me.WindowState = vbMaximized Then
      Form1.Print "Ridimensionato da Ingrandisci"
   ElseIf Me.WindowState = vbMinimized Then
      'Tipicamente non fare nulla ;)
   End If
   PreviousState = Me.WindowState
End Sub
'*** END FORM RESIZE ***
Happy Coding e fammi sapere se funziona soprattutto! (dimmi su che
sistema lo stai provando, io VB6 SP5 Win98) =)


 sistema lo stai provando, io VB6 SP5 Win98) =)
Erm... mi vergogno un po', vista la ritrosia di voi guru, ma... WinXP! Fra
due giorni lo provo su un NT 4.0 con qualche Service Pack (attualmente non
so quali...).
Grazie ancora!!!
- SonicBoom -

 Cmnque a me scatena l'evento in continuo man mano che faccio il resize.
Ecco, questo continua a non tornarmi. A me lo scatena
SOLO quando rilascio il mouse. Che versione di SO e di VB usi ?
Bye, G.

 qualche Service Pack (attualmente non so quali...).
Ottimo, era cio' che speravo (cioe' che funzionasse stabilmente anche su
altri sistemi, come XP, fammi sapere per NT). Io personalmente,
comunque, non ho nulla contro Windows XP, anzi, c'e' da dire che
rispetto ai predecessori e' dieci volte piu' stabile... nonostante la
frivolezza dell'aspetto "puffoso". In ogni caso si puo' pure
personalizzare per tornare alla vecchia interfaccia WinXX-Style.
Happy Coding =)


 personalizzare per tornare alla vecchia interfaccia WinXX-Style.
E' la prima cosa che ho fatto! :) Proprieta' del Sistema -> Avanzate ->
Effetti Visivi -> Regola in modo da ottenere le prestazioni migliori.
Ciao!
- SonicBoom -

 SOLO quando rilascio il mouse. Che versione di SO e di VB usi?
Win98SE VB6 SP5.
SonicBoom WinXP (stesso fenomeno).
Tu?
Sottoscrivo e confermo quanto detto. L'evento Resize viene scatenato "in
continuo" man mano che si ridimensiona il form.


 SOLO quando rilascio il mouse. Che versione di SO e di VB usi ?
Ho il sospetto che il problema sia altrove:
Per quanto ne so, l'evento Resize in VB viene richiamato *sempre* al termine
dell'operazione di dimensionamento, quello che succede pero' e' che, se in
Windows e' attiva l'opzione "Mostra contenuto finestra durante le opzioni di
trascinamento" (attiva per default), il S.O. scatena una serie di
resize/refresh a breve intervallo per produrre l'effetto grafico suddetto, a
cui ormai non si fa piu' caso, ma che ad esempio era assente ai tempi di
Win3.1
Scommetterei che Paperino non ha l'opzione attiva...
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 Scommetterei che Paperino non ha l'opzione attiva...
Mi hai anticipato di una frazione di secondo ;-) Il problema e' proprio
li'!
Happy Coding =)


 si scrive un programma?
Beh, se vogliamo il tuo codice prima della soluzione di Lokar era
formalmente piu' corretto, perche' si comportava in maniera conforme al S.O.
e a quanto scelto dall'utente... il senso di quella opzione e' proprio di
mostrare sempre la finestra durante tutta l'operazione di dimensionamento,
compresi gli eventuali "pasticci" che si possono produrre prima del
termine... l'importante e' che l'aspetto finale sia quello previsto.
In teoria il fatto di eseguire un unico Resize o 500 in rapida sequenza non
dovrebbe cambiare il risultato se l'evento e' gestito correttamente (in
generale eh, non ti sto dicendo che avevi scritto una schifezza), poi mi
rendo conto che se il codice e' pesante, e' meglio cercare qualche
compromesso... credo che ad esempio i programmi di disegno/grafica3D e robe
simili, seguano gli stessi criteri per evitare di fare una "scartavetrata"
di rendering in pochi secondi.


 Scommetterei che Paperino non ha l'opzione attiva...
E tu pensi che io tenga attiva _quella roba_ ? LOL :-)
Comunque il problema rimane.
Cioč, il fatto che la MS cambia le carte in tavola senza dire
niente, a me da un bel po' fastidio, non so a voi. Se uno nella
Resize ha messo qualcosa di pesante, cosě si schianta la
macchina solo ridimensionando una finestra. :-(
Bye, G.

 Scommetterei che Paperino non ha l'opzione attiva...
Addirittura? Bisognerebbe controllare questo genere di opzioni pure qunado
si scrive un programma? Ora provo a disattivare l'opzione suddetta e
verifico il comportamento del classico esempio (cambiamento della caption in
funzione del _resize).
Comunque grazie per la preziosa informazione!
- SonicBoom -

 di rendering in pochi secondi.
Hai colto in pieno il problema. Il mio programma grafica dei dati in tre
picturebox. Al resize ridimensiono le pb e, di conseguenza, anche i dati che
ci sono dentro. Non sto dicendo che il mio programma e' esente da errori o
che sia scritto a perfezione (anzi, sono sicuro che se vi dessi il codice
sorgente mi ridereste in faccia...) pero' t'assicuro che e' fastidioso
vedere il sistema rallentare paurosamente quando deve ridisegnare nVolte *
60000 punti in poche frazioni di secondo...
"Mostra contenuto finestre..." e' un'opzione effettivamente di default in
praticamente tutti i SO MS dal 98 in poi (non vorrei sbagliarmi, ma mi pare
proprio di si), e che tra l'altro anche sul 95 si poteva usare con TweakUI,
pero' io credevo che influenzasse solo le finestre di Explorer.exe, e non
tutte le finestre, di un qualsiasi programma. Avendo poi provato il software
su WinXP, WinNT 4.0 e WinME ero sicuro che fosse questo il comportamento
tipico dell'evento resize!
In ogni caso mi hai chiarito parecchi dubbi! Grazie!
- SonicBoom -

 macchina solo ridimensionando una finestra. :-(
Beh, la novita' non e' proprio dell'altro ieri... ma in ogni caso e' un
opzione dichiaratamente "anti performante" (nel suddetto Plus! veniva
consigliata solo per PC di classe Pentium, mi pare) e tutti i programmi sono
soggetti al potenziale rallentamento; possiamo discutere sul fatto che sia
attiva di default, ma se l'utente ritiene che con il suo PC se la puo'
permettere, allora se la tiene com'e'...
tra parentesi, in un certo senso, la funzione si autolimita; mi spiego:
immagina di avere nel Resize qualcosa del genere
Dim i As Long, j As Long
For i = 0 To 10000
    j = i
Next
rimpicciolendo la finestra di X pixel, la routine verra' scatenata Y volte
(dipende dal PC e da quanto sei svelto col mouse ;-))
ora prova a rallentare ancora, passando da 10.000 a 1.000.000... la routine
e' piu' pesante, e' vero, ma il resize diventa di conseguenza anche meno
"fluido"; per giungere alla stessa dimensione X il numero di iterazioni non
sara' piu' Y, ma potrebbe arrivare a Y/10 proprio in virtu' della
scattosita' dell'operazione
Poi, certo, e' sempre piu' bello quando il programma risponde prontamente,
ma se uno smanetta con una finestra graficamente pesante, non puo'
pretendere (dal programmatore) sempre la velocita' della luce...


 Giusto... veniva inclusa solo se installavi Plus!
Incredibile come MS sia riuscita a VENDERE una patch!


 nVolte * 60000 punti in poche frazioni di secondo...
Approposito, che funzioni usi per disegnare?


 ha scritto nel messaggio
news:FkYN8.13$Bf....@nreader1.kpnqwest.net...


> Approposito, che funzioni usi per disegnare?
Tempo fa avevo "inaugurato" un thread. Vedi qui
http://groups.google.com/groups?hl=it&lr=&threadm=hswx8.4403%24W9.101112%40t
wister2.libero.it
&rnum=48&prev=/groups%3Fq%3Dgroup:it.comp.lang.visual-basic
%2Bauthor:SonicBoom%26start%3D40%26hl%3Dit%26lr%3D%26as_qdr%3Dm3%26selm%3Dhs
wx8.4403%2524W9.101112%
2540twister2.libero.it
%26rnum%3D48
Comunque ora come ora uso ancora (!!) il line puro e semplice perche' non
sono riuscito a risolvere un problema piuttosto serio con il tipo POINTAPI
:(
Ciao,
- SonicBoom -
PS Magari se sei interessato alla questione e qui diamo fastidio possiamo
continuare in mail privata.

 continuare in mail privata.
Perche'? Non parliamo di implementazioni grafiche in VB?
A meno che non ci caccino, direi che possiamo continuare qui =)


 :(
Che problema? =)


 punti pena freeze/crash/chipiunehapiunemetta!
Lo so, e' stato lo stesso suggerimento di Roberto Piazzolla. Pero' mi da
fastidio proprio il drawwidth... Ho provato a seguire il consiglio di Roby
(spostare l'offeset di un pixel e rigraficare gli stessi dati per n volte
(con n pari al drawwidth "teorico")), ma mi pare un bel casino...
Insomma, poiche' il programma e' (virtualmente!!!) finito, credo che per ora
lo lascero' cosi' (comunque non e' neanche lentissimo... dai, non buttiamoci
giu').
Ciao,
- SonicBoom -

 PolyLine.
I grafici sono "semplici": sono sismogrammi a tre componenti. Devo graficare
la componente verticale, e le corrispondenti Nord/Sud ed Est/Ovest. In media
i file (sono file ASCII) sono composti da 8/10mila punti per ogni


 Che problema? =)
Bah, in realta' non e' un problema gravissimo: semplicemente dovrei
assegnare ad ogni
punto anche una coordinata temporale, cosa che un po' mi secca perche'
attualmente me
la calcolo "al volo". E poi io ho dichiarato tutte le componenti come
double, invece con
il POINTAPI dovrei fare una conversione in long. Non e' neanche gravissimo
come
problema, pero' poiche', come ti dicevo nell'altro post, il programma e'
virtualmente
finito, onestamente rimettere mano al codice per ripartire da zero (o quasi)
sicuramente
mi farebbe perdere il treno con la prossima seduta di laurea! :) (cosa che
vorrei davvero
evitare!)
Ciao,
- SonicBoom -