J'ai, il y a quelques jours, rencontré un problème avec une ListView avec la propriété CheckBoxes activée.
Lorsque l'on effectue un double clic sur un item, cela a pour conséquence de modifier l'état de la CheckBox de ce même item. La 2ème conséquence qui en découle est que les évenements ItemCheck et ItemChecked sont également appelés.
Il n'est par ailleurs pas possible de savoir si les évenements ItemCheck ou ItemChecked ont été appelés à la suite d'un double clic car l'évenement DoubleClick ne se produit qu'après les 2 premiers.
Cela devient vite un problème lorsque :
- on souhaite gérer les 2 évenements (DoubleClick et ItemCheck) indépendamment
- on ne souhaite pas que le double clic change l'état de la CheckBox
Après de longues recherches et un post sur le forum CS, je n'ai trouvé aucune réponse satisfaisante. Je me suis donc tourné vers le SubClassing.
Vous trouverez donc ici un exemple illustrant comment isoler les 2 méthodes (ItemCheck et DoubleClick) grâce au SubClassing (en pure .Net)
Intéressant. Grâce à ta source j'ai pu subclasser un column header d'une listview, afin de pouvoir attraper les mousemove ! (impossible normallement à partir de la listview, dès qu'on arrive sur le header les WM_MOUSEMOVE ne se lancent pas)
-----------------
Cependant, je ne comprend pas un de tes points. Peut-être le même que PCPT (?) :
'Renvoi les messages de sous-classement (si on le souhaite)
Protected Overrides Sub WndProc(ByRef m As Message)
If mSubClass Then 'If Subclassing Enabled then RaiseEvent
RaiseEvent CallBackProc(m)
End If
MyBase.WndProc(m) <<<<<<< ICI (?)
End Sub
Pourquoi faire passer en dernier TOUS les messages, même quand tu les a déjà redirigés ? J'aurais plutôt vu un
'Renvoi les messages de sous-classement (si on le souhaite)
Protected Overrides Sub WndProc(ByRef m As Message)
If mSubClass Then 'If Subclassing Enabled then RaiseEvent
RaiseEvent CallBackProc(m)
else
MyBase.WndProc(m) <<<<<<< LA !!
End If
End Sub
Car avec ton code, cela fait donc DOUBLE EMPLOI avec la même commande dans :
Private Sub CallBackProc(ByRef m As System.Windows.Forms.Message)
Je veux dire que tu lance MyBase.WndProc(m) 2x dans le cas ou il était subclassé...
Tiens-moi au courant STP, je ne comprends pas ^^
Merci d'avance!
on verra par la suite, rien ne presse
compris pour le subclass permanent et son appel. tout s'explique ;)
merci
bonne continuation
LOL j'ai fait la même reflexion pendant très longtemps. DotNet est si, DotNet est ça.
En fait, il faut simplement se lancer, faire un premier pas et on se rend compte du temps que l'on peut gagner à programmer en .NET
Depuis que j'y ai gouter, je ne touche plus mon VB6 (juste pour relire d'anciens codes et les porter en .Net)
Sinon, pour répondre à ta question. Je reconnais ne pas avoir été très clair. Plus même je me suis carrement mal exprimé.
La class n'a en fait rien a voir dans le sous-classement de la fenêtre elle-même. Disons que toutes les fenêtres en VB.Net le sont automatiquement.
Et pour récupérer les messages il suffit d'ajouter : Protected Overrides Sub WndProc(ByRef m As Message)
je comprends de quoi tu parles mais pas le "pourquoi" dans le fonctionnement
(j'sens que je ne vais pas me mettre à dotnet encore un moment ^^)
tu déclares withevents la class SubClass
tu l'instancies au LOAD avec le handle de la LV, puis active (enabled)
l'instance reçoit bien uniquement les events de la LV non?
puis elle raise TOUT de la LV uniquement
ta form reçoit "CE" TOUT, et tu n'annules que le DBL_CLICK
je ne vois pas comment la form devrait recevoir ses propres évents en ajoutant ta protected sub
tu peux expliquer stp?
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.