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 07/06/2011, 17h05   #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 spline cardinale continue

Bonjour

J’utilise la classe clGDIplus avec access 2007 et le code suivant pour tracer une spline cardinale
oGdi. DrawCardinal Array(gX(0), gY(0), gX(1), gY(1), gX(2), gY(2), gX(3), gY(3) etc...),0.5
les gX() et gY() sont les coordonnées X et Y de la souris au moment de l’événement mouse_down.
Comment puis-je ajouter un gx et un gy à chaque clic de souris afin de pouvoir tracer une spline cardinale continue en fonction du nombre de fois que je clique sur l’image. Je pense que je dois faire un tableau dynamique et utiliser une boucle, mais je patauge allégrement dans la déclaration des variables et du code etc.

Merci d'avance
thermo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 18h36   #2
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,

en fait pour résumer, si je comprend bien, le problème est l'alimentation d'un tableau dynamique avec les positions des clics de souris à plat (X1,Y1,X2,Y2, X3,Y3,...)

donc voici une utilisation de tableau dynamique :

en en-tête de module du formulaire :
Code :
1
2
3
 
Private MonTableau() as single
Private NbPoints as long
sur clic de la souris
Code :
1
2
3
4
5
 
NbPoints  = NbPoints  + 1
Redim Preserve MonTableau(1 To NbPoints*2)
MonTableau(NbPoints*2-1) = X
MonTableau(NbPoints*2) = Y
j'utilise une variable NbPoints pour me faciliter la tâche
on peut faire sans, mais c'est un peu plus galère

et il suffit de mettre NbPoints = zéro pour repartir sur un nouveau tableau
__________________
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 07/06/2011, 20h52   #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
rebjr

Ok mais dans mon code
oGdi. DrawCardinal etc..., j'en fait quoi du tableau.
Désole, mais c'est moins évident que les bases de données.

Merci de m'accorder tant de temps.
thermo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/06/2011, 21h25   #4
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
Citation:
Envoyé par thermo Voir le message
Ok mais dans mon code
oGdi. DrawCardinal etc..., j'en fait quoi du tableau.
ben tu le passes en premier paramètre, comme si c'était un Array construit à volée
derrière ça devrait comprendre
__________________
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 08/06/2011, 06h43   #5
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
bonjour

J'ai entre le code suivant

Code :
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Image0_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
NbPoints = NbPoints + 1
'ReDim MonTableau(1 To NbPoints)
ReDim MonTableau(1 To 100)
 
MonTableau(NbPoints * 2 - 1) = X
MonTableau(NbPoints * 2) = Y
 
oGdi.DrawCardinal MonTableau, 0.5, , gFileColor, 1 'courbe de bezier 4 points plein noir
oGdi.FastRepaint Me.Image0
 
End Sub
J'obtiens à chaque clic une droite qui part du haut à gauche jusqu'à mon clic.
pour faire une spline, je voudrais que chaque clic s'ajoute dans le tableau pour pouvoir la tracer en continu.
C'est vraiment pas clair pour moi.
thermo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 07h38   #6
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
Citation:
Envoyé par thermo Voir le message
J'obtiens à chaque clic une droite qui part du haut à gauche jusqu'à mon clic.
pour faire une spline, je voudrais que chaque clic s'ajoute dans le tableau pour pouvoir la tracer en continu.
C'est vraiment pas clair pour moi.
si tu mets un Redim (1 to 100), tu dois remplir 1000 points ; sinon ceux qui ne sont pas remplis sont en 0,0
il manquait un *2 dans mon code

il faut bien réfléchir avec de se lancer

qu'est-ce-qui déclenche le début d'une courbe? et sa fin?

si je ne m'abuse, le début de la courbe va être un peu différente à chaque point ajouté
il faudrait peut-être repartir de l'image sans la courbe à chaque fois

imgae sans la courbe qui serait définie au moment du début de la courbe avec un KeepImage, puis rechargée avant dessin de la courbe avec ResetImage

d'où ma question sur les évenements de début et fin de courbe
__________________
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 08/06/2011, 07h52   #7
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
et en plus il manquait un Preserve sur le Redim

Redim en profite pour remettre toutes les valeurs à zéro si on ne met pas le préserve

un exemple :
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
 
Private o As ClGdiPlus
Private MonTableau() As Single
Private NbPoints As Long
 
Private Sub Form_Load()
Set o = New ClGdiPlus
o.CreateBitmapForImage Me.Image0
o.FillColor vbWhite
o.KeepImage
End Sub
 
Private Sub Image0_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbKeyRButton Then
    NbPoints = 0
    o.KeepImage
ElseIf Button = vbKeyLButton Then
    NbPoints = NbPoints + 1
    ReDim Preserve MonTableau(1 To NbPoints * 2)
    MonTableau(NbPoints * 2 - 1) = X
    MonTableau(NbPoints * 2) = Y
    o.RefControl = Me.Image0
    o.DrawPolygon MonTableau
    o.RefControl = Nothing
    o.FastRepaint Me.Image0
End If
End Sub
j'ai mis un DrawPolygon mais tu devrais pouvoir le remplacer par DrawCardinal

le clic droit remet les points à zéro

note le KeepImage au début et à chaque clic droit
et le ResetImage avant de dessiner la courbe

le plus dur c'est d'intégrer tout ça dans une appli qui fait déjà d'autres choses...
__________________
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 08/06/2011, 16h35   #8
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 spline cardinale

bjr thierry

En fait, je voudrais realiser ce que l'on fait avec le bouton courbe de word.
C.a.d. Un mouse_down sur mon image0 donne le point de départ de la spline. Chaque mouse_move dessine la courbe. Chaque nouveau mouse_down sera un point de changement de direction qui permettra de redessiner la courbe après chaque resetImage. Enfin, un double_click arrêtera le tracé.(Le formatage et la flèche en bout, je sais faire). peut être pourait-on attribuer une valeur par défaut égale au dernier mouse_down pour les points non défini(Ceux que tu dis qu'ils prendront la valeur (0.0))?
Enfin voila, si ça t'inspire.
De toute façon encore une fois merci pour tes conseils.
thermo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 17h00   #9
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
ben c'est un peu ce que j'avais commencé à faire, sauf qu'il faut stopper sur double-clic

et tu peux si tu veux ajouter un peu de code sur MouseMove pour qu'on voit la courbe en cours de construction suivre la souris

idée de code :
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
 
Private o As ClGdiPlus
Private MonTableau() As Single
Private NbPoints As Long
 
Private Sub Image0_DblClick(Cancel As Integer)
    NbPoints = 0
    o.RefControl = Me.Image0
    oGdi.DrawCardinal MonTableau, 0.5, , gFileColor, 1 'courbe de bezier 4 points plein noir
    o.RefControl = Nothing
    o.RepaintControlNoFormRepaint Me.Image0
    o.KeepImage
    Cancel = True
End Sub
 
Private Sub Image0_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    NbPoints = NbPoints + 1
    ReDim Preserve MonTableau(1 To NbPoints * 2)
    MonTableau(NbPoints * 2 - 1) = X
    MonTableau(NbPoints * 2) = Y
    o.ResetImage
    o.RefControl = Me.Image0
    oGdi.DrawCardinal MonTableau, 0.5, , gFileColor, 1 'courbe de bezier 4 points plein noir
    o.RefControl = Nothing
    o.FastRepaint Me.Image0
End Sub
 
Private Sub Image0_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If NbPoints > 0 Then
        MonTableau(NbPoints * 2 - 1) = X
        MonTableau(NbPoints * 2) = Y
        o.ResetImage
        o.RefControl = Me.Image0
        oGdi.DrawCardinal MonTableau, 0.5, , gFileColor, 1 'courbe de bezier 4 points plein noir
        o.RefControl = Nothing
        o.FastRepaint Me.Image0
    End If
End Sub
 
Private Sub Form_Load()
Set o = New ClGdiPlus
o.CreateBitmapForImage Me.Image0
o.FillColor vbWhite
o.KeepImage
o.RepaintControlNoFormRepaint Me.Image0
End Sub
__________________
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 08/06/2011, 17h53   #10
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
Rebjr

Ok, ça marche. 1 seul petit problème. Il faut cliquer 2 fois avant de dessiner. Je l'ai résolu en répétant 2 fois le code du mouse_down si nbpoints = 0. c'est du travail de bricoleur, mais ça marche.

A plus
thermo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h40.


 
 
 
 
Partenaires

Hébergement Web