XL 2013 determiner des min et max positions

patricktoulon

XLDnaute Barbatruc
bonjour à tous
j'utilise des astuce pour créer des controls redimensionnables a la main (souris)
j'ai donc
  • quatre petit carrés(label) que je déplace avec la souris ; carré haut gauche , carré haut droite , carré bas gauche , carré bas droite
  • un carré(label) qui a pour dimention(a chaque mouvement d'un des 4) le rectangle perimetre interieur formé par ces 4 carrés
avec tous un tas de if on empêche
le carré haut gauche de mordre sur le carré haut droite
le carré haut gauche de mordre sur le carré bas gauche
etc..etc...
sachant que le probleme est que les gauche ne doivent pas etre plus a droite que les carré droite
et pareil pour les top
alors oui ça fonctionne mais ça fait un peu to much a mon goût
auriez vous une idée ou methode pour simplifier la chose

demo.gif
 
Solution
Bonjour Patrick,

avec des mots car je dois m'absenter, je vais essayer d'être clair.
L'idée est de ne plus faire de tests, mais d'imposer une taille minimum à ta forme. Par exemple 20.

Déjà je réduis tes carrés à des points hg, hd, bg, bd pour simplifier. Ils ont chacun une position h(orizontal) et v(ertical)
Si tu bouges hd, hd_h2 ne peut être à gauche à hg_h soit : hd_h2= max(hg_h+20, hd_h2)
En vertical hd_v2 ne peut être en dessous de bd_v soit : hd_v2= min(bd_v-20, hd_v2)
Une fois ça fixé, reporter les valeurs sur les points opposés.
Comme tu as bougé hd, bd doit être sur la même verticale, et hg sur la même horizontale
Idem pour chaque point en adaptant.
eric

eriiic

XLDnaute Barbatruc
Bonjour Patrick,

avec des mots car je dois m'absenter, je vais essayer d'être clair.
L'idée est de ne plus faire de tests, mais d'imposer une taille minimum à ta forme. Par exemple 20.

Déjà je réduis tes carrés à des points hg, hd, bg, bd pour simplifier. Ils ont chacun une position h(orizontal) et v(ertical)
Si tu bouges hd, hd_h2 ne peut être à gauche à hg_h soit : hd_h2= max(hg_h+20, hd_h2)
En vertical hd_v2 ne peut être en dessous de bd_v soit : hd_v2= min(bd_v-20, hd_v2)
Une fois ça fixé, reporter les valeurs sur les points opposés.
Comme tu as bougé hd, bd doit être sur la même verticale, et hg sur la même horizontale
Idem pour chaque point en adaptant.
eric
 

patricktoulon

XLDnaute Barbatruc
Bonjour @eriiic
on a eu la meme idée mais je ne savais pas comment faire sans usine de if pour avoir
  1. la contrainte min top et la contrainte max top ( 'l'un allant contre l'autre )
  2. la contrainte min left et la contrainte max left (l'un allant contre l'autre )

sanchant aussi que j'avais deux repères a garder en tete
  1. repère 1 la position de l'image
  2. repère 2 le carré oppose horizontal et le carré opposé vertical
exemple
hg ne doit pas etre plus loin que le hd
et pas plus bas que le bg
et pas plus haut que l'image moins ca taille
et pas plus bas que l'image
avec une contrainte minimum de taille

et j'ai fini par trouver un compromis avec application max ou min
bon ca exige quand même 4 lignes pour chacun des 4 carrés

VB:
Private Sub hg_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
poignée_MouseMove hg, Button, X, Y
End Sub
Private Sub hd_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
poignée_MouseMove hd, Button, X, Y
End Sub
Private Sub bg_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
poignée_MouseMove bg, Button, X, Y
End Sub
Private Sub bd_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
poignée_MouseMove bd, Button, X, Y
End Sub

Private Sub poignée_MouseMove(ByVal ctrl As msforms.Control, ByVal Button As Integer, ByVal X As Long, ByVal Y As Long)
    Static Dx#
    Static Dy#
    Dim MinRect
    MinRect = 10
    With ctrl
        If Button = 1 Then
            MinRect = MinRect * 2

            If Dx = 0 Then Dx = X: Dy = X
            .Move .left + (X - Dx), .top + (Y - Dy)

            Select Case ctrl.Name
            Case "hg":
                'contrainte min top
                hg.top = Application.Max(Image1.top - 10, hg.top): hd.top = hg.top
                'contrainte min left
                hg.left = Application.Max(Image1.left - 10, hg.left): bg.left = hg.left
                'contrainte max left
                hg.left = Application.Min(hg.left, hd.left - MinRect): bg.left = hg.left
                'contrainte max top
                hg.top = Application.Min(bg.top - MinRect, hg.top): hd.top = hg.top
              
                'meme principe   MAIS !!! inversé  pour les coté opposés pour les 4
            Case "hd"
                hd.top = Application.Max(Image1.top - 10, hd.top): hg.top = hd.top
                hd.left = Application.Min(Image1.left + Image1.width, hd.left): bd.left = hd.left
                hd.left = Application.Max(hd.left, hg.left + MinRect): bd.left = hd.left
                hd.top = Application.Min(bd.top - MinRect, hd.top): hg.top = hd.top
          
            Case "bg":
                bg.top = Application.Min(Image1.top + Image1.height, bg.top): bd.top = bg.top
                bg.left = Application.Max(Image1.left - 10, bg.left): hg.left = bg.left
                bg.left = Application.Min(bg.left, bd.left - MinRect): hg.left = bg.left
                bg.top = Application.Max(bg.top, hg.top + MinRect): bd.top = bg.top
          
            Case "bd"
                bd.top = Application.Min(Image1.top + Image1.height, bd.top): bg.top = bd.top
                bd.left = Application.Min(Image1.left + Image1.width, bd.left): hd.left = bd.left
                bd.left = Application.Max(bd.left, bg.left + MinRect): hd.left = bd.left
                bd.top = Application.Max(bd.top, hd.top + MinRect): bg.top = bd.top
          
            End Select


            calque.Move hg.left + 10, hg.top + 10, hd.left - hg.left - 10, bg.top - hg.top - 10
        Else
            Dx = 0: Dy = 0
        End If
    End With
End Sub

demo.gif


et tout cela en gardant la possibilité de bouger le rectangle entre les 4 poignées
demo.gif
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Bonjour @vgendron
et oui mais c'est pas aussi simple sinon tu pense bien ;)
avant de déterminer le RECT puisque c'est comme ça que tu l'envisage (je l'ai envisagé moi aussi)
il faut respecter les contraintes
pour cela il faudrait coomparer
le x de hg au x de bd
le y de hg au y de bd
le x de hg au x de l'image bottom
etc..etc....
bref je gagnerais rien en simplicité
 

Discussions similaires

Statistiques des forums

Discussions
312 207
Messages
2 086 234
Membres
103 162
dernier inscrit
fcfg