Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/04/2011, 11h43   #1
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 41
Points : 12
Points : 12
Par défaut Gdi+ éditeur de dessin

Dans le but de créer un petit éditeur de dessin à inclure dans un projet access, j'incorpore une forme dans une controle image avec le code suivant.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Private sub Image0_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
 
Select Case stDessin		‘Stdessin designe un bouton de commande
Case "12"
 Select Case Button
    Case vbKeyLButton ' bouton gauche
 
      ' Conserve l'image
    oGdi.KeepImage
  ‘Stmaregion correspond au nom de l’image ajoutée, stmonclip est le chemin de l’image
    oGdi.ImageListAdd StMaRegion, StMonClip
    imX = oGdi.CtrlToImgX(X, Me.Image0) 	‘Coordonnée  X de la souris
    imY = oGdi.CtrlToImgY(Y, Me.Image0)
    'Le vbWhite dans la fonction drawimage enlève le contour blanc des images
    oGdi.DrawImage StMaRegion, imX, imY, , , vbWhite, Gdi32SizeModeAutoSize, Gdi32AlignTopLeft, _
    , True, StMaRegion, vbRed
    oGdi.ImageListGetPixel StMaRegion, 1, 1
    ' Supprime l'image de la liste
    oGdi.ImageListDel StMaRegion
 
    ' Affichage de l'image dans le contrôle
    oGdi.RepaintControl Me.Image0, , , True
oGdi.RepaintControlNoFormRepaint Me.Image0
   End Select
 
Case Else
End Select
 
End Sub
Le dessin de l’image s’affiche et si je clique sur la forme, je peux obtenir un message donnant la valeur de la région « stmaregion ».
J’aimerais pouvoir sélectionner cette forme avec un rectangle ou en cliquant dessus afin de pouvoir le déplacer sur sur le contrôle image en suivant le pointeur de la souris.
J’utilise GDI+ sous access 2007 en me servant des excellents tutoriels d’arkham46.developpez.com
thermo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 22h12   #2
Membre éclairé
 
Homme Christophe AUMOITTE
Inscription : octobre 2009
Messages : 254
Détails du profil
Informations personnelles :
Nom : Homme Christophe AUMOITTE
Âge : 43
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : octobre 2009
Messages : 254
Points : 303
Points : 303
Bonjour Thermo,

J'utilise moi même la GDIPlus, mais cela est vraiment compliqué.
Heureusement, les Tutos et bases exemples de Thierry sont supers.
N'hésites pas à le contacter, il est friand d'utilisateur GDIPlus afin d'avoir des idées d'améliorations des projets qu'il présente.

Pour ma part, voilà comment je fais.
J'ai un contrôle image qui reçoit mon image principale.
J'ai un second contrôle qui reçoit une image transparente *.png et sur cette image, je dessine mon symbole.
Pour le déplacement de cette dernière image, je prévois 2 champs pour mémoriser les coordonnées X et Y.

Pour le déplacement, voici le code que j'utilise, à toi de l'adapter à tes besoins.

Cordialement

Christophe

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
Option Explicit
 
Dim DeplacXy, X1, Y1 'Pour gestion du déplacement de la souris
Dim CtrlImg As Object
Dim CtrlOrigine As image
 
Dim DeplacX As Integer
Dim DeplacY As Integer
 
Dim CtrlX As Control
Dim CtrlY As Control
 
Sub SourisDeplacee(nButton As Integer, nX As Single, nY As Single, nCtrlImg As Object, nCtrlOrigine As image, _
            Optional nCtrlX As Control, Optional nCtrlY As Control, Optional TypeImg As Integer = 1)
 
Set CtrlX = nCtrlX
Set CtrlY = nCtrlY
Set CtrlImg = nCtrlImg
Set CtrlOrigine = nCtrlOrigine
 
'TypeImg=1 : code pour mémoriser les coordonnées (ce qui n'est pas le cas pour l'équerre report de point)
 
DeplacX = CtrlImg.Left + nX - X1
DeplacY = CtrlImg.Top + nY - Y1
 
If nButton = 1 Then 'Si clic sur bouton gauche
    If DeplacXy = True Then 'Si déplacement autorisé
 
        'Si l'objet sort du cadre à gauche
        'If DeplacX - CtrlOrigine.Left < CtrlOrigine.Left Then
        If DeplacX < CtrlOrigine.Left Then
            'Position X du contrôle
            CtrlImg.Left = CtrlOrigine.Left
            'On mémorise les coordonnées X dans le champ
            If TypeImg = 1 Then CtrlX = 0
        'Si l'objet sort du cadre à droite
        ElseIf DeplacX > CtrlOrigine.Left + CtrlOrigine.Width - CtrlImg.Width Then
            'Position X du contrôle
            CtrlImg.Left = CtrlOrigine.Left + CtrlOrigine.Width - CtrlImg.Width
            'On mémorise les coordonnées X dans le champ
            If TypeImg = 1 Then CtrlX = CtrlOrigine.Width - CtrlImg.Width
        Else 'Sinon, l'objet est dans le cadre
            CtrlImg.Left = DeplacX 'Position X du contrôle
            'On mémorise les coordonnées X dans le champ
            If TypeImg = 1 Then CtrlX = DeplacX - CtrlOrigine.Left
        End If
 
        'Si l'objet sort du cadre en haut
        'If DeplacY - CtrlOrigine.Top < CtrlOrigine.Top Then
        If DeplacY < CtrlOrigine.Top Then
            'Position Y du contrôle
            CtrlImg.Top = CtrlOrigine.Top
            'On mémorise les coordonnées Y dans le champ
            If TypeImg = 1 Then CtrlY = 0
        'Si l'objet sort du cadre en bas
        ElseIf DeplacY > CtrlOrigine.Top + CtrlOrigine.Height - CtrlImg.Height Then
            'Position Y du contrôle
            CtrlImg.Top = CtrlOrigine.Top + CtrlOrigine.Height - CtrlImg.Height
            'On mémorise les coordonnées Y dans le champ
            If TypeImg = 1 Then CtrlY = CtrlOrigine.Height - CtrlImg.Height
        Else 'Sinon, l'objet est dans le cadre
            CtrlImg.Top = DeplacY 'Position Y du contrôle
            'On mémorise les coordonnées Y dans le champ
            If TypeImg = 1 Then CtrlY = DeplacY - CtrlOrigine.Top
        End If
    End If
End If
 
End Sub
 
Sub SourisRelachee(nButton As Integer, nX As Single, nY As Single, nCtrlImg As Object)
 
Set CtrlImg = nCtrlImg
'Sur souris relachée
CtrlImg.BorderStyle = 0 'On enlève la bordure rouge
DeplacXy = False 'On annule l'autorisation
 
End Sub
 
Sub SourisAppuyee(nButton As Integer, nX As Single, nY As Single, nCtrlImg As Object)
 
Set CtrlImg = nCtrlImg
 
If nButton = 1 Then 'Si clic sur bouton gauche
    CtrlImg.BorderStyle = 1 'On défini de la taille d'un bordure
    CtrlImg.BorderColor = vbRed 'Couleur de la bordure en rouge
    DeplacXy = True 'Déplacement autorisé
    X1 = nX 'On mémorise les coordonnées X et Y
    Y1 = nY
End If
 
End Sub
Pour appeler ces codes :
Cercle est le nom de mon image
Carte_Extrait est le contrôle de mon image principale
X_Cercle et Y_cercle sont les champs qui mémorisent les coordonnées.
Sur souris appuyée :
Code :
Call SourisAppuyee(Button, X, Y, Me.Cercle)
Sur souris déplacée :
Code :
Call SourisDeplacee(Button, X, Y, Me.Cercle, Me.Carte_Extrait, Me.X_Cercle, Me.Y_Cercle)
Sur souris relachée :
Code :
Call SourisRelachee(Button, X, Y, Me.Cercle)
marsouin_89 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2011, 16h29   #3
Candidat au titre de Membre du Club
 
Inscription : février 2007
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 41
Points : 12
Points : 12
Par défaut Gdi+ éditeur de dessin

Merci de m'avoir répondu.
J’ai trouvé une solution à mon problème sans utiliser de table, mais c’est du bricolage.
En fait, je récupère le nom de la région en cliquant sur le dessin à déplacer.
Je récupère les coordonnées de la région.
Je dessine un rectangle de la couleur du fond avec les coordonnées de la région pour cacher le dessin
Je mets en mémoire l’image
Je redessine le dessin à chaque mouse move après avoir restitué l’image en mémoire.
Je doute vraiment que ça se passe comme cela dans msword.
Quelqu’un aurait-il une solution qui tienne la route?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Private Sub Image0_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim lX1 As Long, lY1 As Long, lX2 As Long, lY2 As Long
Select Case stDessin         
Case "13"
        Select Case Button
        Case vbKeyLButton ' bouton gauche
        If oGdi Is Nothing Then Exit Sub
            ' Récupère le nom de la région sur laquelle on a cliqué
            StMaRegion = oGdi.GetRegionXY(X, Y)
    ' Position et coordonnées de la région
    If oGdi.GetRegionRect(StMaRegion, lX1, lY1, lX2, lY2) Then
    imX = lX1
    imY = lY1
    End If
‘Trace un rectangle de la couleur du fond avec les coordonnées de la region
    oGdi.DrawRectangle oGdi.PixelToPointsX(lX1), oGdi.PixelToPointsY(lY1), oGdi.PixelToPointsX(lX2), oGdi.PixelToPointsY(lY2) + 10, RGB(181, 255, 106), RGB(181, 255, 106), 1
    oGdi.KeepImage     'Garde en mémoire l'image d'origine
    'Le vbWhite dans la fonction drawimage enleve le contour blanc des images
    oGdi.DrawImage StMaRegion, imX, imY, , , vbWhite, Gdi32SizeModeAutoSize, Gdi32AlignCenter, _
    , True, StMaRegion, vbRed
    ' Affichage de l'image dans le contrôle
    oGdi.RepaintControl Me.Image0, , , True
        End Select
  End sub
 
Private Sub Image0_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
             Case "12", "13"
     Select Case Button
    Case vbKeyLButton ' bouton gauche
 
       oGdi.ResetImage
 
    imX = oGdi.CtrlToImgX(X, Me.Image0)
    imY = oGdi.CtrlToImgY(Y, Me.Image0)
 
    ‘Redessine l’image avec les coordonnées de la région
    oGdi.DrawImage StMaRegion, imX, imY, , , vbWhite, Gdi32SizeModeAutoSize, Gdi32AlignCenter, _
    , True, StMaRegion, vbRed
 
    oGdi.ImageListGetPixel StMaRegion, 1, 1
 
    ' Conserve l'image
    ' Affichage de l'image dans le contrôle
    oGdi.FastRepaint Me.Image0
 
    End Select
    End sub
thermo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2011, 22h58   #4
Membre éclairé
 
Homme Christophe AUMOITTE
Inscription : octobre 2009
Messages : 254
Détails du profil
Informations personnelles :
Nom : Homme Christophe AUMOITTE
Âge : 43
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : octobre 2009
Messages : 254
Points : 303
Points : 303
Bonsoir Thermo,

Finalement, je ne suis pas sur d'avoir bien compris ce que tu souhaitais faire.
Mais à mon avis regarde le tuto , sur la création d'un jeu, de Thierry et cela devrait répondre à tes attentes.
Sinon, lance un appel à Thierry, je suis sur qu'il se fera un plaisir de te guider.

Cordialement

Christophe
marsouin_89 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 13h09   #5
Responsable Access
 
Avatar de Arkham46
 
Inscription : septembre 2003
Messages : 4 300
Détails du profil
Informations personnelles :
Localisation : France, Loiret (Centre)

Informations forums :
Inscription : septembre 2003
Messages : 4 300
Points : 7 939
Points : 7 939
bjr,

voir dans la base d'exemple, il y a un formulaire de déplacement d'images
__________________
Assistant de création/modification de rubans Office
Utilisez en VBA les librairies graphiques GDI, GDI+ et openGL

Blog Office Mon Site DVP
Arkham46 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2011, 20h02   #6
Membre éclairé
 
Homme Christophe AUMOITTE
Inscription : octobre 2009
Messages : 254
Détails du profil
Informations personnelles :
Nom : Homme Christophe AUMOITTE
Âge : 43
Localisation : France, Bas Rhin (Alsace)

Informations forums :
Inscription : octobre 2009
Messages : 254
Points : 303
Points : 303
Tu vois, j'étais sur que Thierry interviendrait sur ce sujet.
Il a l'oeil

Cordialement

Christophe
marsouin_89 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h26.


 
 
 
 
Partenaires

Hébergement Web