begin process at 2012 02 16 23:05:04
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Control

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

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


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :7 367 / 789

Auteur : MadM@tt

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (32)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
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

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

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

 Sources du même auteur

Source avec Zip COMMUNICATION INTER-PROCESSUS (IPC)
Source avec Zip OPÉRATIONS SUR LES CHAINES DE CARACTÈRE OPTIMISÉES ET ÉTENDU...
Source avec Zip Source avec une capture FISHTANK - SCREENSAVER INTERACTIF : AQUARIUM AVEC POISSONS V...
Source avec Zip Source avec une capture RÉCUPÉRER LA TEMPÉRATURE DES DISQUES DURS
Source avec Zip Source avec une capture WIN++ OPTIONS AVANCÉES SUR LES FENETRES ET PROCESSUS WINDOWS...

 Sources de la même categorie

Source avec Zip COMMUNICATION MODBUS MASTER par sergelapointe
Source avec Zip Source avec une capture DÉPLACEMENT AVEC FLÈCHES DANS UN PAVÉ DE TEXTBOX 9X9 DYNAMIQ... par EhJoe
Source avec Zip Source avec une capture Source .NET (Dotnet) CONTROLSTARS EN RÉPONSE À JAKNIGHT007 par bigboss9
Source avec Zip Source avec une capture Source .NET (Dotnet) CALENDRIER ANNUEL NORME ISO par Prog1001
Source avec Zip Source avec une capture Source .NET (Dotnet) CONTROLE STARS par jaknight007

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) DEMO SUBCLASING VB.NET par Iznogood1
Source avec Zip Source avec une capture SYSTRAY + BALLOON EN UN SEUL CONTRÔLE UTILISATEUR par jack
Source avec Zip Source avec une capture SUBCLASSING : SOUS-CLASSEZ FACILEMENT UNE FENETRE AVEC UN US... par MadM@tt
Source avec Zip Source avec une capture CONTRÔLES STYLE XP (16 USERCONTROLS: LISTBOX, OPTION, FRAME,... par violent_ken
Source avec Zip Source avec une capture GEREZ LES EVENEMENTS MOUSE_WHEEL, MOUSE_ENTER, DBL_CLICK, MO... par violent_ken

Commentaires et avis

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

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

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

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


@+

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+

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

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.

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

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.

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

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

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

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

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

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

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

Commentaire de MadM@tt le 19/03/2007 14:06:25

Ah oui, c'est fait ^^

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)

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.

Commentaire de MadM@tt le 19/03/2007 15:01:15

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

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

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

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

++ ;)

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

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

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

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

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.

Commentaire de Renfield le 04/05/2007 07:18:26 administrateur CS

voir :

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

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.

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

Commentaire de MeSod le 14/10/2010 19:29:07

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

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Evenements MouseOut et MouseIn sur un usercontrol sans hWnd [ par MoiOlivier ] Bonjour à tous,Tout est à peu près dans le titre.J'ai un usercontrol dont la propriété Windowless est à True (donc ce controle n'a pas de hWnd), et ce Création d'un control CheckBox [ par TheLordFreddy ] Salut!je veux créer un control transparent:je met un label et un dessin (en forme de case) sur le UserControlpuis je met la propriété B Les classes en .NET et l'IDE [ par mastercatz ] Bonjour.En fait j'ai créé une classe qui permet, avec GDI+, de faire une textbox. J'ai préféré la faire moi meme pour qu'elle problème usercontrol [ par tmcuh ] Voilà mon problème réside dans la restitution des attributs. J'ai crée un controle avec une image dedans, une liste enumérati creer un usercontrol [ par mikoteam ] bonjours a tous je voudrais creer un truc simple pour grand nombre d entre vous mais tres dur pour moi    j aimerais créer un user VB.NET Usercontrol et backcolor transparent [ par liquide ] Salut a tous,(VB.Net 2005 Edition Beta)je cherche la possibilité sur un Usercontrol de le rendre transparent en backcolor, la methode du Backcolo Drag drop dans un activeX [ par vfi ] Bonjour,J'ai un projet VB6 , contenant une form et un usercontrol.Sur ma form, j'ai un label et le usersercontrol.Dans mon usercontrol j'ai un autre l Difference entre 2 Bitmap [ par beniguane ] Salut la commuauté, Je fais un petit jeu qui manie des images. Afin de pouvoir gagner, il faut qu'un certain nombre d'images soient identiques. dataenvironment [ par webadmin ] bonjourj'ai un projet controle activeX, je veux faire passer en paramètre la valeur du champs text du usercontrol, dans une commande du dataenvir fermeture d'un ocx [ par pointdalattitude ] Bonjour,Je voulai savoir si c'était possible de fermer mon control activex avec un bouton de commande.J'ai essayer en placant un CommandButton su


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,530 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales