Afficher sur une image dans userform un curseur en croix qui touche aux bords

Résolu
Signaler
Messages postés
36
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
31 mars 2008
-
Messages postés
36
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
31 mars 2008
-
Bonjour,

J'aimerai avoir un curseur en croix qui touche aux bords de mon image. Il serait constitué de deux barres, une verticale et une horizontale avec pour centre ma souris.
Cela me servirait pour la lecture de graphiques

Merci par avance à ceux qui veulent ien me répondre

Eleasias

28 réponses

Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
74
Pourtant pas compliqué : tu as tous les éléments.

voilà ce que je viens de faire pour tester (pas de tete, donc, ce coup ci)

1- ajouter une nouvelle UserForm
2- y ajouter une image, avec un JPEG affiché dedans
3- ajouter deux autres images ("Line1" et "Line2") dont tu changeras le BorderColor pour modifier la couleur des traits
4- code :

Private Sub UserForm_Activate()
SetupLines
End Sub

Private Sub UserForm_Resize()
SetupLines
End Sub

Private Sub Image1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Line1.Top = Y
Line2.Left = X
End Sub

Private Sub SetupLines()
Line1.Left = 0
Line1.Width = Me.Width
Line1.Height = 1

Line2.Top = 0
Line2.Height = Me.Height
Line2.Width = 1
End Sub
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
74
Pour le Zoom, suffit d'observer et de faire un produit en croix....


Option Explicit

Private Sub UserForm_Activate()
SetupLines
End Sub

Private Sub UserForm_Resize()
SetupLines
End Sub

Private Sub Line1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
CursorMoved X, Line1.Top
End Sub

Private Sub Line2_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
CursorMoved Line2.Left, Y
End Sub

Private Sub Image1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
CursorMoved X, Y
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
CursorMoved X, Y
End Sub

Private Sub CursorMoved(ByVal X As Single, ByVal Y As Single)
Line1.Top = Y
Line2.Left = X
End Sub
Private Sub SetupLines()
Line1.Left = 0
If Me.Zoom <> 100 Then
Line1.Width = 100 * Me.Width / (100 - Me.Zoom)
Else
Line1.Width = Me.Width
End If
Line1.Height = 1
Line1.ZOrder 0
Line1.BorderColor = vbRed

Line2.Top = 0
If Me.Zoom <> 100 Then
Line2.Height = 100 * Me.Height / (100 - Me.Zoom)
Else
Line2.Height = Me.Height
End If
Line2.Width = 1
Line2.ZOrder 0
Line2.BorderColor = vbRed
End Sub
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
15
Salut,

Défois que :

Private Sub Form_Load()
Me.MousePointer = 2
End Sub

A toi par la suite à placer ton curseur à l'endroit désiré...
A+
Exploreur

 Linux a un noyau, Windows un pépin

Un jeu en flash sympa...? Voir ici
Si vous voulez vous inscrire
mettez comme parrain : exploreur
Messages postés
36
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
31 mars 2008

D'abord merci de ta réponse mais ce n'est pas exactement ce que je veux.

Je me suis probablement mal expliqué : ce que tu m'as donné change seulement le curseur de forme.

Je voudrais la forme croix comme tu m'a donné mais dont les extrémités verticales et horizontales ne mesurent pas 10 pixels. Il me faudrait une croix dont les extrémités touchent les bords de mon image (avec une taille à rallonge suivant l'endroit où l'on se place).

J'espère que je me suis bien exprimé, merci d'avance

Eleasias
Messages postés
4822
Date d'inscription
lundi 11 novembre 2002
Statut
Membre
Dernière intervention
15 novembre 2016
15
Re,

Ah..oui...un peu comme les logiciels de dessins indus...? Mais là, je ne sais pas.

A+
Exploreur

 Linux a un noyau, Windows un pépin

Un jeu en flash sympa...? Voir ici
Si vous voulez vous inscrire
mettez comme parrain : exploreur
Messages postés
36
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
31 mars 2008

(Désolé j'ai quelques bugs je crois)

Oui c'est bien cela, c'est pour trouver une abscisse avec une ordonnée ou vice et versa sur un graphe en jpeg

Eleasias
Messages postés
36
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
31 mars 2008

J'espère que quelqu'un pourra m'aider et surtout que j'ai été assez clair.
Je suis débutant en VBA et j'espère que ce n'est pas d'un niveau trop élevé pour moi.

(Comment je fais pour supprimer mon message raté s'il vous plaît)

Eleasias
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
74
MousePointer a mettre en custom
ainsi, VB utilisera l'image MouseIcon comme curseur.
Messages postés
36
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
31 mars 2008

Oui mais je voudrais un curseur très grand (qui touche aux 4 côtés d'une image 270*486) et qui ne dépasse pas de l'image .
Le centre de la croix (comme un curseur cross) sera le pointé de la souris.

Eleasias
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
74
ah, ok, j'avais pas vu ca ainsi.

déplace des controles Line en fonction des coordonnées de la souris (MouseMove)

en gros :


Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Line1.X1 = X
Line1.X2 = X

Line2.Y1 = Y
Line2.Y2 = Y
End Sub
Messages postés
36
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
31 mars 2008

Euh ca c'est une macro esclave nan?
Il faut l'appeler de ma fenêtre qui fixe mes paramètres d'image mais les valeurs Button, Shift, X et Y je ne vois pas comment les incrémenter.De plus que définis-tu par Button et Shift?
Merci pour ton aide.

Eleasias
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
74
c'est pas a definir ou autre... MouseMove est l'un des evenement standard.

quel est ton cadre exact de travail (est-ce bien du VB6, j'en doute)
Messages postés
36
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
31 mars 2008

Oui je travail sur Microsoft Visual Basic 6.3, mais je suis débutant et je ne connais pas grand chose.
Tu penses qu'avec le code que tu m'as donné avant, en tant que macro privée, me permet d'avoir ma "croix géante".

Eleasias
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
74
oui...

oublie le mot "macro" dans le cadre de VB6, ca prete a confusion.

"tu penses qu'avec...." fais le test ^^ (fonctionne impec chez moi...)
bien sur, faut avoir ajouté deux controles Line sur ta form et les avoir bien placés (a voir dans le Form_Resize)
Messages postés
36
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
31 mars 2008

Je suis vraiment désolé mais je ne connais pas tout ca et quand je vais voir ce qu'est "Resize" l'aide me dit que ca s'applique à des cellules. De plus je n'ai jamais utilisé les contrôles Line et je ne vois pas comment ça marche.

Eleasias
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
74
....
c'est du VBA que tu fais, pas du VB6 !

comme quoi, c'est important, dès le départ, où se trouve ton image ?
Messages postés
36
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
31 mars 2008

Excuse moi je ne connais pas la différence je t'ai juste donné le nom de mon logiciel (j'espère ne pas être trop embètant mais j'ai eu des cours que très sommaires sur VBA).

En fait j'ai une UserForm1 où je fais "ouvrir" un fichier grâce au chemin d'accès et qui m'emmène vers une autre userform2.
La userform2 contient un cadre image, et mon image est  chargée et redimensionnée au format du cadre image. Mon image est un scan d'un graphe, c'est pourquoi j'ai besoin de cet outil.

Eleasias
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
74
pas très joli visuellement, mais a voir:


Private Type POINT
x As Long
y As Long
End Type

Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Private Declare Function GetClientRect Lib "user32.dll" (ByVal hwnd As Long, ByRef lpRect As RECT) As Long
Private Declare Function GetCursorPos Lib "user32.dll" (ByRef lpPoint As POINT) As Long
Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long
Private Declare Function LineTo Lib "gdi32.dll" (ByVal hDc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function MoveToEx Lib "gdi32.dll" (ByVal hDc As Long, ByVal x As Long, ByVal y As Long, ByRef lpPoint As Any) As Long
Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hwnd As Long, ByVal hDc As Long) As Long
Private Declare Function ScreenToClient Lib "user32.dll" (ByVal hwnd As Long, ByRef lpPoint As POINT) As Long

Private Sub Image1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal x As Single, ByVal y As Single)
Dim hwnd As Long
Dim hDc As Long
Dim tPt As POINT
Dim tR As RECT
hwnd = GetForegroundWindow
GetClientRect hwnd, tR
GetCursorPos tPt
ScreenToClient hwnd, tPt

Me.Repaint

hDc = GetDC(hwnd)
MoveToEx hDc, 0, tPt.y, ByVal 0&
LineTo hDc, tR.Right, tPt.y
MoveToEx hDc, tPt.x, 0, ByVal 0&
LineTo hDc, tPt.x, tR.Bottom

ReleaseDC hwnd, hDc
End Sub
Messages postés
36
Date d'inscription
mardi 18 mars 2008
Statut
Membre
Dernière intervention
31 mars 2008

Merci beaucoup.
Je vois le travail que ça t'a donné.
Je ne sais pas si tu l'as testé mais le fait que l'image "clignote" quand je bouge mon curseur vient du fait que le PC manque de ressource??

Eleasias
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
74
testé, bien sur, je fais pas tout de tête ^^

le Me.Repaint cause le clignottement
tu noteras mon "pas très joli visuellement, mais a voir"

tu peux sans doute faire de fausses lignes, en ajoutant des controles Image pour jouer ce role. Ainsi, tu pourras utiliser le code de ce matin :

Private Sub UserForm_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Line1.Left = X
Line2.Top = Y
End Sub