begin process at 2008 08 21 14:52:35
1 229 438 membres
257 nouveaux aujourd'hui
14 263 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

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


Information sur la source

Catégorie :Control Classé sous : subclassing, mousein, mouseleave, usercontrol, mouseevent Niveau : Expert Date de création : 16/03/2007 Date de mise à jour : 19/03/2007 15:02:25 Vu / téléchargé: 4 348 / 581

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (31)
Ajouter un commentaire et/ou une note


Description

Bonjour à tous,

En ce moment les codes sont rares, celui la il datait un peu et je viens juste de le finir, alors je vous en fait profiter.

Il s'agit d'une PictureBox, mais en mieux ^^, c'est à dire qu'elle gère des evenements supplémentaires :
- MouseWheel
- MouseIn
- MouseLeave

Et elle se comporte (presque, au maximum) comme une PictureBox classique, pour que l'integration se fasse le plus facilement possible.


Il s'agit d'un UserControl, et pour obtenir les evenements supplémentaires, j'utilise le SubClassing. Seulement ici un problème s'est présenté : on ne peut (théoriquement) pas placer la fonction de CallBack du sous classement dans un UserControl, ce qui est impératif si on veut pouvoir soulever des evenements à partir de cette fonction.
La solution m'a été apportée par EBArtSoft, grace à un petit traficage de la mémoire et avec des injections assembleur (qui me dépassent de beaucoup, bien que j'ai compris le principe).

Donc un énorme merci à lui ;-)
(c'est cette partie du code qui justifie le niveau expert au passage, car le reste n'est pas si compliqué, c'est du subclassing standard)

Source

  • Ajouter MyPictureBox sur votre Form
  • Utilisez la comme n'importe quelle autre PictureBox, et profitez des évenements supplémentaires.
  • C'est tout !
Ajouter MyPictureBox sur votre Form

Utilisez la comme n'importe quelle autre PictureBox, et profitez des évenements supplémentaires.

C'est tout !

Conclusion

/!\ ATTENTION /!\
Bien entendu comme il s'agit de SubClassing, ne pas cliquer sur le bouton STOP de l'IDE, sinon votre Visual Basic restera bien gelé :-(


Voilà, si vous voulez que j'ajoute des propriétés, méthodes ou évenements, n'hésitez pas à demander.
Si vous trouvez des bugs aussi ;)

A noter egalement que je compte étendre cela à tous les controles VB existants, mais bon ça demandera du temps donc c'est un projet à long terme.

En esperant que ça vous serve.
MadMatt
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

19 mars 2007 13:03:18 :
Suppression de MouseOver
19 mars 2007 14:03:05 :
mise à jour de la description
19 mars 2007 14:42:31 :
Ajout de propriétés manquantes
19 mars 2007 15:02:25 :
Correction d'un bug sur Align
  • signaler à un administrateur
    Commentaire de MadM@tt le 16/03/2007 22:33:57

    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 ,)

  • signaler à un administrateur
    Commentaire de DARKSIDIOUS le 17/03/2007 06:58:44 administrateur CS

    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

  • signaler à un administrateur
    Commentaire de MadM@tt le 17/03/2007 16:10:49

    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 ;)

  • signaler à un administrateur
    Commentaire de violent_ken le 18/03/2007 10:40:08

    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


    @+

  • signaler à un administrateur
    Commentaire de MadM@tt le 18/03/2007 21:27:01

    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+

  • signaler à un administrateur
    Commentaire de PCPT le 19/03/2007 07:46:22 administrateur CS

    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
    ++

  • signaler à un administrateur
    Commentaire de Renfield le 19/03/2007 08:54:23 administrateur CS

    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.

  • signaler à un administrateur
    Commentaire de moustachu le 19/03/2007 09:02:33

    Bonjour,

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

    Moustachu

  • signaler à un administrateur
    Commentaire de Renfield le 19/03/2007 09:29:10 administrateur CS

    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.

  • signaler à un administrateur
    Commentaire de moustachu le 19/03/2007 09:32:32

    Merci de la réponse, c'est bien ce qui me semblait. Mais quelle est la différence avec un mousemove ?

    Moustachu

  • signaler à un administrateur
    Commentaire de Renfield le 19/03/2007 09:37:44 administrateur CS

    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 ^^

  • signaler à un administrateur
    Commentaire de moustachu le 19/03/2007 09:44:10

    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

  • signaler à un administrateur
    Commentaire de moustachu le 19/03/2007 12:20:02

    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

  • signaler à un administrateur
    Commentaire de MadM@tt le 19/03/2007 12:41:25

    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

  • signaler à un administrateur
    Commentaire de MadM@tt le 19/03/2007 13:01:39

    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 ;)

  • signaler à un administrateur
    Commentaire de moustachu le 19/03/2007 13:11:29

    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

  • signaler à un administrateur
    Commentaire de MadM@tt le 19/03/2007 14:06:25

    Ah oui, c'est fait ^^

  • signaler à un administrateur
    Commentaire de MadM@tt le 19/03/2007 14:45:03

    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)

  • signaler à un administrateur
    Commentaire de Renfield le 19/03/2007 14:52:01 administrateur CS

    pas accessible tout le temps ?

    mettre ton controle Alignable a True
    et passer par UserControl.Extender.Align pour acceder a ce parametre.

  • signaler à un administrateur
    Commentaire de MadM@tt le 19/03/2007 15:01:15

    Ok j'accédais directement à UserControl.Align, merci c'est mis à jour ^^

  • signaler à un administrateur
    Commentaire de EBArtSoft le 19/03/2007 15:40:30 administrateur CS

    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

  • signaler à un administrateur
    Commentaire de bouv le 20/03/2007 09:01:08

    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... ^^

  • signaler à un administrateur
    Commentaire de PCPT le 25/03/2007 14:59:48 administrateur CS

    salut,
    cette source peut te donner quelques idées
    http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=51493&lngWId=1

    ++ ;)

  • signaler à un administrateur
    Commentaire de MadM@tt le 25/03/2007 17:15:46

    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 ;)

  • signaler à un administrateur
    Commentaire de monsieurlemouche le 03/05/2007 23:41:38

    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

  • signaler à un administrateur
    Commentaire de MadM@tt le 03/05/2007 23:46:44

    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

  • signaler à un administrateur
    Commentaire de monsieurlemouche le 04/05/2007 00:25:45

    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

  • signaler à un administrateur
    Commentaire de Renfield le 04/05/2007 06:52:15 administrateur CS

    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.

  • signaler à un administrateur
    Commentaire de Renfield le 04/05/2007 07:18:26 administrateur CS

    voir :

    http://www.vbfrance.com/code.aspx?ID=42562

  • signaler à un administrateur
    Commentaire de monsieurlemouche le 04/05/2007 09:26:56

    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.

  • signaler à un administrateur
    Commentaire de Renfield le 04/05/2007 09:54:23 administrateur CS

    précisément le but de la source que j'ai fait et posté a ton attention ^^

Ajouter un commentaire

Discussions en rapport avec ce code source

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
extraction dinformatio...
Budget : 300€
campagne Adwords
Budget : 5 000€

Snippets en rapport

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS