Newsgroup: it.comp.lang.visual-basic
Titolo: Problema con usercontrol e double click

Ciao!
Sebbene abbia parecchia esperienza VB ne ho poca
con gli UserControl e ho un problema. Su internet
ho trovato un controllo (axButton) che e' un pulsante
con testo e icona e puo' essere visualizzato come
toolbar e come pulsante normale. Questo pulsante
mi passa l'evento click ma non riesco a fare in
modo di evitare che mi cerchi di prendere il
doppio click. Vediamo se riesco ad essere piu'
chiaro: in pratica se faccio due click veloci il
pulsante non si preme due volte perche' dopo il
primo click attende il tempo di doppio click
per rilevare di nuovo l'evento click. In pratica
e' impossibile usare il pulsante cliccandoci
velocemente tante volte (a me serve per scorrere
su di una serie di record e non e' carino che
sia lento).
In realta' la soluzione l'ho trovata solo che
non mi fido: in pratica imposto per un attimo
il tempo di doppio click e poi lo riporto
al suo valore originale, cosi' il pulsante non
attende 500(per esempio) millisecondi ma 1
e quindi posso essere veloce.
Questa soluzione non mi piace perche' e'
semi stabile, ovvero se il mio programma che
usa il pulsante si inchioda con il pulsante
premuto (e l'utente con il dito abbassato
sul pulsante del mouse) rimane il tempo di
doppio click a 1 e vi assicuro che non e'
simpatico...
Qualcuno ha qualche idea? Io vorrei in pratica
che il mio user control non beccasse il doppio
click, proprio lo ignorasse...
Grazie 1000!
Andrea De Togni
--
 |\-/|                    Con Affetto e Rispetto,
 \\ //                        Andrea De Togni
  | |                          ICQ#28636782
   -
FantaCalcio? FC Manager: 
http://www.fantacalcio.it/fantamanager

>click, proprio lo ignorasse...
Se lo user control ti mette a disposizione l'evento doppio click chiama il tuo evento click dall'evento doppio click.
Se non lo fa ma hai i sorgenti e' ancora meglio perche' puoi fare la stessa cosa all'interno dello user control.
Se non hai i sorgenti non saprei.
Antonio

perche' puoi fare la stessa cosa all'interno dello user control.
I sorgenti li ho, ho provato a mettere
sia Call UserControl_Click sia togliendo
il Call e mi dice che non e' definita la
funzione UserControl_Click.
Altre idee?
Ciao

>funzione UserControl_Click.
Se hai i sorgenti la soluzione e' vicina :-)
All'inizio dello user control dovrebbe esserci la definizione dell'evento Click (dello user control che sara' disponibile a chi lo usa)
Nello user control dovresti avere un pulsante.
Sull'evento click del pulsante dovrebbe esserci una cosa tipo RaiseEvent Click..
Sull'evento DblClick del pulsante dovresti fare la stessa cosa che viene fatta nel clik oppure chiamare il click del pulsante, quinda qualcosa del tipo Button_Click.
Antonio

RaiseEvent Click..
il fatto e' che il pulsante nell'evento click non ha nulla
perche' fa tutto dagli eventi MouseDown e MouseUp. Il
raise del Click viene fatto nel mouseup. E nell'evento
DblClick non posso fare quello che viene fatto nel
MouseDown e Up perche' non ho i valori di
Button, Shift, x e y.
Tuttavia se nel dblclick faccio il raise del click
mi viene beccato il click e il pulsante "funziona"
velocemente, con lo sgradevole effetto collaterale che
non si "preme" al secondo click. Inacettabile...
Ho notato infine che se mentre faccio click veloci
mi muovo lentamente con il mouse, il pulsante funziona
egregiamente perche' Windows non mi becca il doppio click
se non e' nello stesso punto. Ecco, io vorrei che windows
ignorasse il doppio click.
Dannato! :-)
Ciao!

>risolvere la cosa...
.. oops!
Probabile soluzione da provare:
cambiare lo stile della finestra eliminado il flag che dice di gestire il doopio click (CS_DBLCLKS).
Bisognerebbe chiamare la funzione GetWindowLong per leggere lo stile corrente, eliminare il flag e chiamare SetWindowLong.
A te la prova!
Antonio

>
Mi e' venuto in mete dopo che potrebbe anche bastare una SendMessage di WM_LMOUSEDOWN.
Antonio

Ce l'ho fatta!
E senza modificare il dblclicktime!!!!
Ho seguito questo ragionamento: dato che alcuni controlli
beccano il doppio click e altri no, ci deve essere un modo
per "filtrare" l'evento doppio click. Ci deve essere
un'api che mi permetta di disabilitare alcuni eventi.
Cerca cerca cerca nell'MSDN ho trovato che una classe
finestra ha una proprieta', Style, che definisce
alcuni comportamenti, tra cui ha un bel bit
chiamato CS_DBLCLKS! Se questo bit e' settato
la finestra (un pulsante e' in effetti una
finestra e ha un suo hWnd) riceve i doppi
click, altrimenti no. E di conseguenza ecco
il codice che imposta il bit a 0 in modo
da non prendere il doppio click:
dim WinStyle as long
WinStyle = GetClassLong(UserControl.hwnd, GCL_STYLE)
WinStyle = (WinStyle And Not (CS_DBLCLKS))
WinStyle = SetClassLong(UserControl.hwnd, GCL_STYLE, WinStyle)
Messo questo codice nell'evento Initialize funziona che
e' una meraviglia.
Deh, che fatica pero'...:-)
CiaO!

stile corrente, eliminare il flag e chiamare SetWindowLong.
Deh, ho trovato questa soluzione (vedi altro
msg) e dopo ho letto questo tuo msg. Solo che con
GetWindowLong non ha funzionato, mentre
gira con GetClassLong. Poco male.
Ciao e grazie!