MYPICTUREBOX - UNE PICTUREBOX AMÉLIORÉE, GÈRE LES ÉVENEMENTS MOUSEIN, MOUSELEAVE

MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 - 16 mars 2007 à 22:33
cs_MeSod Messages postés 89 Date d'inscription dimanche 21 septembre 2008 Statut Membre Dernière intervention 26 avril 2016 - 14 oct. 2010 à 19:29
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/41873-mypicturebox-une-picturebox-amelioree-gere-les-evenements-mousein-mouseleave-mouseover-usercontrol-ocx

cs_MeSod Messages postés 89 Date d'inscription dimanche 21 septembre 2008 Statut Membre Dernière intervention 26 avril 2016
14 oct. 2010 à 19:29
Bonsoir,
je remonte un peu le sujet, mais je cherche pour les besoin d'un de mes programme. a faire une picture box transparente. je m'explique :
C'est une picturebox qui contiendra plusieur picturebox pour former un petit bonhomme, (plus simple pour le déplacement)
le contenant doit etre transparent et le contenu visible, c'est faisable avec cette picture box ? =S
Cordialement MeSod
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
4 mai 2007 à 09:54
précisément le but de la source que j'ai fait et posté a ton attention ^^
monsieurlemouche Messages postés 102 Date d'inscription lundi 29 décembre 2003 Statut Membre Dernière intervention 28 juin 2007
4 mai 2007 à 09:26
salut renfield,
je ne suis pas en mesure de tester dans l'immédiat la propriété hitbehavior mais je vais le faire dans la journée.
cependant, je précise qu'il est possible de détecter le click souris, comme je l'ai dit mais c'est très laborieux car il faut la placer avec beaucoup de précision si la ligne est de faible largeur.
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
4 mai 2007 à 07:18
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
4 mai 2007 à 06:52
tu peux, si,si, detecter un click sur ta ligne...

joue avec le HitBehavior de ton controle en mode WindowLess (obligatoire)

une petite nouveauté propre à VB6 et qui permet de detecter le click n'importe ou dans le controle windowless, même s'il se produit dans une des parties transparentes de ce dernier.
monsieurlemouche Messages postés 102 Date d'inscription lundi 29 décembre 2003 Statut Membre Dernière intervention 28 juin 2007
4 mai 2007 à 00:25
salut et merci pour ta rapidité,
les singlés d'info ne dorment-ils jamais?
bon, en tout cas je suis rassuré pour la picturebox, c'était vraiment tout bête.
j'en suis au tout début des ocx et je me débat avec les rudiments
je cherche à associer la propriété click à un controle line.
cela semble simple, à première vu dans la mesure ou la classe usercontrole bénéficie d'un évènement click et avec la propriété backstyle à transparent, on peut détecter le click quand la souris est sur l'objet line.
Mais...
pour une ligne de drawwith=1, il est assez laborieux de pointer précisemment la ligne, à moins d'avoir une ligne d'épaisseur plus importante, mais je ne le souhaite pas.
je vais essayer d'évaluer la position de la souris et la comparer à la position de la droite (calcule de la distance d'un point à une droite: facile)
y a-t-il mieux?
avec les masks, les machins ou les bidules?
monsieurlémouche
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
3 mai 2007 à 23:46
Bonsoir monsieurlemouche,
Pour le coup de la picturebox qui n'apparait pas, c'est parce que il n'y a pas de picturebox en fait, c'est l'usercontrol lui meme qui va jouer ce role (car un usercontrol peut faire toutes les meme choses qu'une picturebox). Donc il suffit de mettre sa propriété Border à Solid (ou un truc dans le genre) et ça a exactement la meme apparence qu'une picturebox classique. Pour ce qui concerne le comportement c'est dans le code.

Pour les Line, il est impossible de le faire (à ma connaissance) car les controles Line sont en fait des simples traits dessinés à l'execution, ce ne sont pas des controles à proprement parler. VB utilise en fait la méthode Form.Line (ou PictureBox.Line selon que la ligne est dans une form ou une picturebox).

Voilà ces infos sont un peu approximatives, si quelqu'un peut me completer
monsieurlemouche Messages postés 102 Date d'inscription lundi 29 décembre 2003 Statut Membre Dernière intervention 28 juin 2007
3 mai 2007 à 23:41
salut,
je lis vos comentaires et j'essaie de comprendre,
mais pour moi qui est le niveau zéro, éventuellement 1- , c'est difficile de tout comprendre.
je vais donc poser une question de débutant (bah oui, il en faut)
sur le controle, en phase de conception, le picturebox n'apparait pas. A quel moment (je suppose que c'est de manière dynamique) est-il définit?

Autre question mais qui n'a rien a voir avec cette source: comment s'y prendre pour réaliser un controle du type Line (c'est à dire avec deux poignées de dimensionnement) et non un cadre comme le usercontrol classique? Est-ce réalisable avec VB6?
merci de vos réponses.

monsieurlémouche
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
25 mars 2007 à 17:15
Ben le truc c'est que on peut rajouter plein plein d'outils pour améliorer la Picturebox, mais le but de ce controle c'était surtout de rajouter tout ce qui peut manquer aux controles VB et qu'on peut avoir avec le subclassing (car ces evenements on peut les avoir dans d'autres langages). C'était vraiment pour combler des "manques" des controles VB en fait. Après bien sur on peut ajouter plein d'outils, mais la ça sera plus une vrai picturebox, ça sera plus lourd et dédié à quelque chose de plus précis.
Ici ça reste dans l'"esprit" picturebox (c'est à dire, sans utilité précise de base) ^^ (ouais ouais je sais je parle trop pour rien dire lol)
Mais merci pour les suggestions (et puis y'a aussi le fait que j'ai pas énormément de temps en ce moment ;)
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
25 mars 2007 à 14:59
salut,
cette source peut te donner quelques idées
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=51493&lngWId=1

++ ;)
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
20 mars 2007 à 09:01
Salut,
Plutot que supprimer completement l'evenement MouseOver pourquoi ne pas laisser le choix de l'obtenir ou non ? Par exemple à l'aide d'une propriété (ex: MouseOverEnabled)

Sinon pour le problème de l'instabilité VB lorsque l'on fait du subclassing sans DLL. Je suis sûr que EBArtSoft est capable de nous pondre un Add-in pour VB qui corrigera le problème... ^^
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
19 mars 2007 à 15:40
Le probleme de l'ide ne vient pas de tel ou tel code ou de telle ou telle methode il vient simplement du fait que vb decharge le programme en memoire quand on cliqsue sur stop ce qui est logique. Hors lorsque l'on fait un stop "brutal" on ne libere generalement pas le sousclassement ce qui fait que le programme cherche en vain une fonction dont l'adresse en memoire ne correspond plus a une adresse de fonction valide ce qui provoque l'exception que l'on connais bien. C'est pour cela qu'une dll resou de maniere quasi radicale le probleme on pourris aussi bien dans l'ide tester la validité de la zone memoire avant d'y acceder mais on perdrait en performance dont a vous de voir... soit vous avez confiance en vous et vous codez a la volé avec un code ide soit vous faites les flipette et vous vous trainez une dll ;-p

Bien sur je blague... quoi que :p
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
19 mars 2007 à 15:01
Ok j'accédais directement à UserControl.Align, merci c'est mis à jour ^^
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 mars 2007 à 14:52
pas accessible tout le temps ?

mettre ton controle Alignable a True
et passer par UserControl.Extender.Align pour acceder a ce parametre.
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
19 mars 2007 à 14:45
J'ai ajouté hDC, CurrentX, CurrentY, Appearance, Circle, Image, hWnd, Align (que je n'ai pas pu stocker dans le PropBag car cette propriété n'est pas accessible "tout le temps", c'est bizarre j'ai du louper un truc)
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
19 mars 2007 à 14:06
Ah oui, c'est fait ^^
cs_moustachu Messages postés 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Dernière intervention 1 janvier 2012
19 mars 2007 à 13:11
Bien, bien, c'est surtout que je comprenais pas à quoi ça servait en fait (question candide, pas présomptieuse. ;o) )

Modifie également le descriptif de ta source si tu as supprimé l'évènement.

++
Moustachu
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
19 mars 2007 à 13:01
Ah pour le MouseOver j'ai compris, en fait cet evenement est déclenché quand la souris est au dessus du controle depuis le dernier appel de TrackMouseEvent, et quand il est déclenché il faut rappeler TrackMouseEvent. Seulement (et ça j'ai pas compris), quand on appelle TrackMouseEvent depuis l'evenement Hover, ça marche pas, mais quand on l'appelle depuis MouseMove, ça marche. Donc ce qu'il faut faire pour l'activer (si ça interesse quelqu'un), il faut appeler TrackMouseEvent depuis MouseMove ET MouveHover...
Bon vu les ressources que ça doit consommer completement inutilement, je l'ai supprimé.
Merci pour avoir noté le bug ;)
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
19 mars 2007 à 12:41
Salut à tous et merci pour les commentaires.
Déjà, mince lol, je savais pas que ça existait déjà sous forme de controle tout pret une picturebox qui gerait ces evenements en subclassing (sur vbfrance je parle), evidemment je n'y aurais pas posté si celle ci n'apportait rien de plus (enfin j'en ai pas trouvé).
Sinon merci pour stdFont, je n'y retrouvais plus.
Sinon je vais ajouter les propriétés manquantes, et pourquoi pas d'autres propriétés supplémentaires (bien qu'à la base le but c'était seulement de rajouter les evenements manquants pour pouvoir faire des boutons personnalisés dynamiques).
Pour ta DLL Renfield, je essayer de l'integrer seulement pour le mode IDE

Euh pour le coup du MouseOver, normalement ça devrait le déclencher en continu effectivement (et je suis d'accord ça doit consommer des ressources, je ne sais pas si il vaut vraiment le coup cet evenement), mais tu dit qu'il fonctionne comme un MouseMove :s
Je suis en train de regarder
cs_moustachu Messages postés 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Dernière intervention 1 janvier 2012
19 mars 2007 à 12:20
Rebonjour,

J'ai un peu plus testé le code que ce matin. En effectuant un debug.print "Mouse Over" dans l'évènement MouseOver de la pictureBox, l'évènement semble déclenché que lorsque la souris bouge ? Vous me confirmez ou ais-je loupé un truc ? :o)

++
Moustachu
cs_moustachu Messages postés 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Dernière intervention 1 janvier 2012
19 mars 2007 à 09:44
Ah...Tout le temps ?? C'est pas un peu beaucoup ça ? :o)

Ca peut servir à quoi d déclencher tout le temps cet évènement ?

++
Moustachu
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 mars 2007 à 09:37
juste que le MouseMove, comme son nom l'indique, ne se déclenche que si la souris bouge.

là, MouseOver se déclenche tout le temps que le curseur survolle le controle, qu'il bouge ou non ^^
cs_moustachu Messages postés 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Dernière intervention 1 janvier 2012
19 mars 2007 à 09:32
Merci de la réponse, c'est bien ce qui me semblait. Mais quelle est la différence avec un mousemove ?

Moustachu
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 mars 2007 à 09:29
le code nous dit :

Case WM_MOUSEHOVER
RaiseEvent MouseOver
If MouseOverRaised = False Then
RaiseEvent MouseIn
MouseOverRaised = True
End If

Case WM_MOUSELEAVE
RaiseEvent MouseLeave
MouseOverRaised = False

MouseOver sera donc déclenchée régulièrement pour indiquer que le curseur se trouve sur le controle.
MouseIn et MouseOut pour dire que l'on vient dessus, ou que l'on s'en va.
cs_moustachu Messages postés 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Dernière intervention 1 janvier 2012
19 mars 2007 à 09:02
Bonjour,

Quel est l'évènement MouseOver ? MouseIn MouseOut je vois bien mais MouseOver, pas trop.

Moustachu
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
19 mars 2007 à 08:54
survollé les commentaires (pas regardé le code)

ok pour utiliser ma dll de subclassing, ce qui stabiliserai l'IDE.
mais en compilé, aucune raison de se trainer la dll a cote de l'OCX.
possible de repasser par le code de EB et l'injection ASM.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
19 mars 2007 à 07:46
salut MadM@tt (et tout le monde),
j'ai regardé ton code en diagonale sans DL, il manque en effet toutes les propriétés pour le rendre "au moins mieux" :s
qui plus est il y en a déjà sur VbF.
bref voir toutes les remarques de violent_ken, pis... gérer les gifs par exemple, png, fichier distant, la transparence, le repeat, mozaïque, autosize, scrollbar, etc... non? ;)

font, c'est stdFont à déclarer withevents
++
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
18 mars 2007 à 21:27
Salut Violent_Ken et merci ,)
C'est sympa d'avoir listé les 3 méthodes possibles (du moins ce qu'on connait), ça ouvre des possibilités, je vais jeter un coup d'oeil pour voir comment fait Paul Caton.
Sinon merci pour les propriétés, je vais y ajouter dès que je peux, par contre au niveau de Font c'est un type spécial que je n'ai pas réussi à retrouver, si quelqu'un le connait...
A+
violent_ken Messages postés 1812 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 26 octobre 2010 2
18 mars 2007 à 10:40
Ahhh, cette source m'aurait été très utile il y a quelques temps ;)
Il est vrai que le subclassing dans un fichier qui n'est pas un *.bas pose problème...

Donc plusieurs solution :
-dll de Renfield, mais çà ajoute une dépendance
-méthode d'EBArtSoft, mais j'avoue que j'ai rien compris à la partie UserControl_Initialize ^^
-la méthode de Paul Caton (que j'avais utilisée à l'époque) ==> http://www.pscode.com/vb/scripts/ShowCode.asp?txtCodeId=54117&lngWId=1

En tout cas c'est super intéressant comme code !

On pourrait ajouter facilement quelques propriétés importantes comme : hDC, CurrentX, CurrentY, Appearance, Circle, Font[bold, name...], Image et hWnd


@+
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
17 mars 2007 à 16:10
Salut DKS,
Effectivement je viens de voir sa DLL et elle permetterait de résoudre aussi le problème de l'injection assembleur d'EBArtSoft. En plus ça rendrait le code plus stable.
Ben il faut que je trouve le temps et je met ça en place alors, Merci ;)
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
17 mars 2007 à 06:58
tu devrais aller voir la classe de subclassing de Renfield : elle permet de faire du subclassing de façon plus sûre.

Il l'utilise nottament pour ses contrôles XP.

DarK Sidious
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
16 mars 2007 à 22:33
Si vous voulez que je rajoute des propriétés, des méthodes, des evenements, ou si vous voyez un bug, n'hésitez pas à commenter ,)
Rejoignez-nous