Agrandir/Retrecir PictureBox

Résolu
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 - 17 févr. 2013 à 23:13
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 - 28 févr. 2013 à 23:52
Bonsoir,

Je bloque encore sur un probleme concernant une PictureBox. Comment faire pour l'agrandir ou la reduire?
En fait, j'ai un code qui me permet de faire tout ca, sauf qu'il se trouve sur la Form1 principale.

Quand j'essaye de mettre le code dans une Class, ca se complique.
Je peux agrandir/reduire la PictureBox, mais seulement en 3 positions sur 8: a droite (W), en bas a droite (WS) et en bas (S).
Si je veux agrandir/reduire par exemple en haut a gauche (EN), (1) l'evenement Paint suis avec difficultees quand je reduis et (2) le curseur sort rapidement de la zone de controle quand j'agrandis. La zone de controle est un carre de 8x8.

J'utilise la method Invalidate pour forcer l'evenement Paint (j'ai aussi utilise Refresh et Update, mais Invalidate semble le plus approprie).
La Class a un 'Inherits PictureBox' au debut.

Je ne sais meme pas quel morceau de code je pourrais vous montrer pour vous aider a voir ou comprendre le probleme.
Toutes suggestions sont les bienvenues sur cette question un peu vague.

Le pire pour moi, c'est pourquoi je peux le faire marcher sur la Form1 principale et pas dans une Class.
Il y a forcement quelquechose que je ne saisis pas.

A+
JLuc01

19 réponses

cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
24 févr. 2013 à 00:15
Bonsoir,

Pour information, voila un code fonctionnel base sur le "code brut de Banana", mais il y aura encore des petites ameliorations a faire.

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Controls.Add(New clsP With {.BackColor Color.Red, .Top 200, .Left = 200})
    End Sub
End Class


Public Class clsP
    Inherits PictureBox

    Sub New()
        'Me.Image = Image.FromFile("ton_image.jpg")
        Me.Image = My.Resources.Koala
        Me.SizeMode = PictureBoxSizeMode.StretchImage
    End Sub

    Private startMouseX As Integer
    Private startMouseY As Integer

    Private Sub clsP_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        startMouseX = e.X
        startMouseY = e.Y
    End Sub

    Private Sub clsP_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        'Debug.Print(String.Format("x={0} y={1}", e.X, e.Y))
        Form1.Label1.Text = String.Format("x={0} y={1}", e.X, e.Y)
        If e.Button = Windows.Forms.MouseButtons.Left Then
            Dim DeltaX As Integer = e.X - startMouseX
            Dim DeltaY As Integer = e.Y - startMouseY

            If Me.Width < 60 Then  Me.Width = 60
            If Me.Height < 60 Then Me.Height = 60

            ' ================================================================================
            ' POSITION 0
            ' ================================================================================
            If e.X < 10 And e.Y < 10 Then
                Cursor = Cursors.PanNW
                If DeltaX < 0 And DeltaY < 0 Then
                    Me.Left = Me.Left + e.X
                    Me.Width = Me.Width + Math.Abs(e.X)
                    Me.Top = Me.Top + e.Y
                    Me.Height = Me.Height + Math.Abs(e.Y)
                ElseIf DeltaX > 0 And DeltaY > 0 Then
                    Me.Left = Me.Left + e.X
                    Me.Width = Me.Width - Math.Abs(e.X)
                    Me.Top = Me.Top + e.Y
                    Me.Height = Me.Height - Math.Abs(e.Y)
                End If
            End If
            ' ================================================================================
            ' POSITION 1
            ' ================================================================================
            If (e.X > 20 Or e.X < Me.Width - 20) And e.Y < 20 Then
                Cursor = Cursors.PanNorth
                If DeltaY < 0 Then
                    Me.Top = Me.Top - Math.Abs(e.Y)
                    Me.Height = Me.Height + Math.Abs(e.Y)
                ElseIf DeltaY > 0 Then
                    Me.Top = Me.Top + Math.Abs(e.Y)
                    Me.Height = Me.Height - Math.Abs(e.Y)
                End If
            End If
            ' ================================================================================
            ' POSITION 2
            ' ================================================================================
            If e.X > Me.Width - 10 And e.Y < 10 Then
                Cursor = Cursors.PanNE
                If DeltaX > 0 And DeltaY < 0 Then
                    Me.Width = e.X
                    Me.Top = Me.Top + e.Y
                    Me.Height = Me.Height + Math.Abs(e.Y)
                ElseIf DeltaX < 0 And DeltaY > 0 Then
                    Me.Width = e.X
                    Me.Top = Me.Top + e.Y
                    Me.Height = Me.Height - Math.Abs(e.Y)
                End If
            End If
            ' ================================================================================
            ' POSITION 3
            ' ================================================================================
            If e.X > Me.Width - 20 And (e.Y > 20 Or e.Y < Me.Height - 20) Then
                Cursor = Cursors.PanEast
                Me.Width = e.X
            End If
            ' ================================================================================
            ' POSITION 4
            ' ================================================================================
            If e.X > Me.Width - 10 And e.Y > Me.Height - 10 Then
                Cursor = Cursors.PanSE
                Me.Width = e.X
                Me.Height = e.Y
            End If
            ' ================================================================================
            ' POSITION 5
            ' ================================================================================
            If (e.X > 20 Or e.X < Me.Width - 20) And e.Y > Me.Height - 20 Then
                Cursor = Cursors.PanSouth
                Me.Height = e.Y
            End If
            ' ================================================================================
            ' POSITION 6
            ' ================================================================================
            If e.X < 10 And e.Y > Me.Height - 10 Then
                Cursor = Cursors.PanSW
                If DeltaX < 0 And DeltaY > 0 Then
                    Me.Left = Me.Left + e.X
                    Me.Width = Me.Width + Math.Abs(e.X)
                    Me.Height = e.Y
                ElseIf DeltaX > 0 And DeltaY < 0 Then
                    Me.Left = Me.Left + e.X
                    Me.Width = Me.Width - Math.Abs(e.X)
                    Me.Height = e.Y
                End If
            End If
            ' ================================================================================
            ' POSITION 7
            ' ================================================================================
            If e.X < 20 And (e.Y > 20 Or e.Y < Me.Height - 20) Then
                Cursor = Cursors.PanWest
                If DeltaX < 0 Then
                    Me.Left = Me.Left - Math.Abs(e.X)
                    Me.Width = Me.Width + Math.Abs(e.X)
                ElseIf DeltaX > 0 Then
                    Me.Left = Me.Left + Math.Abs(e.X)
                    Me.Width = Me.Width - Math.Abs(e.X)
                End If
            End If
            ' ================================================================================
        End If
        startMouseX = e.X
        startMouseY = e.Y
    End Sub

End Class


A+
JLuc01
3
Utilisateur anonyme
24 févr. 2013 à 19:13
Pour alléger le code, tu peux aussi définir 8 zones de redimensionnement et détecter l'intersection de l'une des zones avec la position de la souris. Ainsi, le curseur se transformera au survol de ces zones avant de cliquer pour le redimensionnement.
J'ai modifié mon exemple et je l'ai commenté.

Option Strict On

'formulaire
Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'ajout de 2 picturebox (images dans les ressources)
        'je passe l'image dans le constructeur de la classe
        Me.Controls.Add(New clsP(My.Resources.Image1) With {.Bounds = New Rectangle(150, 150, 100, 100)})
        Me.Controls.Add(New clsP(My.Resources.Image2) With {.Bounds = New Rectangle(0, 0, 100, 100)})
    End Sub
End Class

'------------------------------------------------------------------
'classe
Public Class clsP
    Inherits PictureBox

    'point utilisé pour le déplacement de l'image
    Dim delta As Point

    Sub New(ByVal pImage As Bitmap)
        Me.Image = CType(pImage, Image)
        Me.SizeMode = PictureBoxSizeMode.StretchImage
    End Sub

    Private Sub clsP_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
        delta = New Point(e.X, e.Y)
    End Sub

    Private Sub clsP_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        Dim rect As Rectangle = Me.Bounds
        Dim nouv_rect As Rectangle

        'calcul des rectangles des 8 zones de redimensionnement
        Dim Zones As List(Of Rectangle) = CalculeZones(rect)
        Cursor = Cursors.Hand

        'pour chaque zone
        For Each z As Rectangle In Zones
            'si il y a intersection avec la position de la souris
            If Rectangle.Intersect(New Rectangle(e.X - 1, e.Y - 1, 1, 2), z) <> Rectangle.Empty Then
                'selon l'index du rectangle 
                Select Case Zones.IndexOf(z)
                    Case 0
                        Cursor = Cursors.PanNW
                        'on calcule les coordonnées du nouveau rectangle 
                        nouv_rect = New Rectangle(rect.X + e.X, rect.Y + e.Y, rect.Width - e.X, rect.Height - e.Y)
                    Case 1
                        Cursor = Cursors.PanNorth
                        nouv_rect = New Rectangle(rect.X, rect.Y + e.Y, rect.Width, rect.Height - e.Y)
                    Case 2
                        Cursor = Cursors.PanNE
                        nouv_rect = New Rectangle(rect.X, rect.Y + e.Y, rect.Width - (rect.Width - e.X), rect.Height - e.Y)
                    Case 3
                        Cursor = Cursors.PanEast
                        nouv_rect = New Rectangle(rect.X, rect.Y, rect.Width - (rect.Width - e.X), rect.Height)
                    Case 4
                        Cursor = Cursors.PanSE
                        nouv_rect = New Rectangle(rect.X, rect.Y, e.X, e.Y)
                    Case 5
                        Cursor = Cursors.PanSouth
                        nouv_rect = New Rectangle(rect.X, rect.Y, rect.Width, e.Y)
                    Case 6
                        Cursor = Cursors.PanSW
                        nouv_rect = New Rectangle(rect.X + e.X, rect.Y, rect.Width - e.X, rect.Height - (rect.Height - e.Y))
                    Case 7
                        Cursor = Cursors.PanWest
                        nouv_rect = New Rectangle(rect.X + e.X, rect.Y, rect.Width - e.X, rect.Height)
                End Select
            End If
        Next
        If e.Button = Windows.Forms.MouseButtons.Left Then
            'si le curseur est en forme de main on peut déplacer sans redimensionner
            If Cursor = Cursors.Hand Then
                Me.Bounds = New Rectangle(rect.X + e.X - delta.X, rect.Y + e.Y - delta.Y, rect.Width, rect.Height)
            Else
                'sinon on applique les nouvelles bornes du picturebox 
                Me.Bounds = nouv_rect
            End If
        End If
    End Sub

    'fonction de calcul des zones de redimensionnement 
    Private Function CalculeZones(ByVal rect As Rectangle) As List(Of Rectangle)
        Dim largeur_recoupe As Integer = Convert.ToInt32(rect.Width / 2)
        Dim hauteur_recoupe As Integer = Convert.ToInt32(rect.Height / 2)
        Dim largeur_recoupe_div As Integer = Convert.ToInt32(largeur_recoupe / 2)
        Dim hauteur_recoupe_div As Integer = Convert.ToInt32(hauteur_recoupe / 2)

        Dim rects As New List(Of Rectangle)

        rects.Add(New Rectangle(-largeur_recoupe_div, -hauteur_recoupe_div, largeur_recoupe, hauteur_recoupe))
        rects.Add(New Rectangle(largeur_recoupe - largeur_recoupe_div, -hauteur_recoupe_div, largeur_recoupe, hauteur_recoupe))
        rects.Add(New Rectangle(rect.Width - largeur_recoupe_div, -hauteur_recoupe_div, largeur_recoupe, hauteur_recoupe))
        rects.Add(New Rectangle(rect.Width - largeur_recoupe_div, hauteur_recoupe - hauteur_recoupe_div, largeur_recoupe, hauteur_recoupe))
        rects.Add(New Rectangle(rect.Width - largeur_recoupe_div, rect.Height - hauteur_recoupe_div, largeur_recoupe, hauteur_recoupe))
        rects.Add(New Rectangle(largeur_recoupe - largeur_recoupe_div, rect.Height - hauteur_recoupe_div, largeur_recoupe, hauteur_recoupe))
        rects.Add(New Rectangle(-largeur_recoupe_div, rect.Height - hauteur_recoupe_div, largeur_recoupe, hauteur_recoupe))
        rects.Add(New Rectangle(-largeur_recoupe_div, hauteur_recoupe - hauteur_recoupe_div, largeur_recoupe, hauteur_recoupe))

        Return rects
    End Function
End Class
3
Utilisateur anonyme
28 févr. 2013 à 23:10
Une erreur s'est glissée dans le code ci-dessus. En effet, il faut 'déborder' autour de la zone pour que le 'move' soit pris en compte.
Ca m'apprendra à ne pas tester avant d'envoyer

De plus, tu constateras rapidement que si le mouvement de déplacement est trop rapide et que 'distance' est trop petit, le pointeur de la souris décroche de la zone. Il faut donc agrandir 'distance' en fonction de la taille de l'image (hauteur ou largeur). Il faudra donc changer le paramètre 10 sur cette ligne dynamiquement :
Dim Zones As List(Of Rectangle) = CalculeZones(rect, 10)

Ce n'est pas trop compliqué mais je n'ai plus la patience de te faire un exemple ce soir.

Mais voici la fonction corrigée :
   Private Function CalculeZones(ByVal rect As Rectangle, ByVal distance As Integer) As List(Of Rectangle)
        Dim largeur_recoupe As Integer = Convert.ToInt32(rect.Width / 2)
        Dim hauteur_recoupe As Integer = Convert.ToInt32(rect.Height / 2)
        Dim div As Integer = Convert.ToInt32(distance / 2)
        Dim rects As New List(Of Rectangle)
        rects.Add(New Rectangle(-div, -div, distance, distance))
        rects.Add(New Rectangle(largeur_recoupe - div, -div, distance, distance))
        rects.Add(New Rectangle(rect.Width - div, -div, distance, distance))
        rects.Add(New Rectangle(rect.Width - div, hauteur_recoupe - div, distance, distance))
        rects.Add(New Rectangle(rect.Width - div, rect.Height - div, distance, distance))
        rects.Add(New Rectangle(largeur_recoupe - div, rect.Height - div, distance, distance))
        rects.Add(New Rectangle(-div, rect.Height - div, distance, distance))
        rects.Add(New Rectangle(-div, hauteur_recoupe - div, distance, distance))
        Return rects
    End Function
3
Bonjour JLuc01.

J'ai bien du mal à comprendre ce que vous voulez. Je vous demande en conséquence, pour débuter, de donner le code de votre formulaire, tout au moins la partie de ce code qui traite des variations de cotes. Pensez à utiliser la coloration syntaxique.


Cordialement.


Étant illettré, je signe d'une croix : ×
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
18 févr. 2013 à 13:27
Salut

Pas trop compris aussi

Tu veux que ton picturebox ou plutot la class
qui herite du picturebox se comporte comme
en mode design (IDE)
qu'on peut étirer seulement 3 positions parmis les huit

1-----2-----3
|           |
|           |
8           4 
|           | 
|           |
7----6------5


seulement les positions 4 5 6 ?
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
18 févr. 2013 à 23:01
Bonsoir,

C'est ce que je craignais. Question probablement mal posee ou probleme trop difficile a expliquer...
Quelques lignes d'ecriture ne valent certainement pas un face a face, mais merci de vous interesser a mon cas.

Bref, je joins ci-dessous la partie du code contenu dans le MouseMove (traitant les variations de cotes), desole mais c'est un peu long. Mais, je ne suis pas sur que cela aidera. Enfin, j'espere me tromper.
Pour information, je fais bouger les quatres positions (notees 0 a 7 au lieu de 1 a 8 comme suggere par le dessin de Shaw) quand j'utilise ce code dans la Class Form1, mais cela ne marche plus quand j'essaye de le passer dans une Class 'exterieure' ('ne marche plus' signifie que les cotes 0,1,2,6,7 ne repondent pas bien).

Comme je l'ai dit auparavant (desole d'insister):
Le pire pour moi, c'est pourquoi je peux le faire marcher sur la Form1 principale et pas dans une Class.
 Il y a forcement quelquechose que je ne saisis pas.


Private CurrMouse As Point
Private Sub Me_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        ' MouseButton.Left must be CLICKED when moving the Picture
        If e.Button = MouseButtons.Left Then
            'Dim CurrMouse As New Point(e.X, e.Y)
            CurrMouse = New Point(e.X, e.Y)
            CurrMouse.X = Math.Max(0, Math.Min(CurrMouse.X, Me.Width))
            CurrMouse.Y = Math.Max(0, Math.Min(CurrMouse.Y, Me.Height))
            CurrMouse = PointToScreen(CurrMouse)
            ' Current Picture Position in the container Client (Form)
            Dim pt As New Point
            pt.X = Me.Left
            pt.Y = Me.Top
            If cdtAllowMoving Then
                pt = e.Location
                pt.X = (pt.X + Me.Left) - CurrMousePict.X
                pt.Y = (pt.Y + Me.Top) - CurrMousePict.Y
                Me.Location = pt
            ElseIf cdtAllowResizing Then
                Dim DeltaX As Integer = CurrMouse.X - MousePos.X
                Dim DeltaY As Integer = CurrMouse.Y - MousePos.Y
                If ActiveAdornment <> -1 Then
                    If Math.Abs(DeltaX) > 2 Or Math.Abs(DeltaY) > 2 Then
                        Const minSize As Integer = 24
                        Select Case ActiveAdornment
                            Case 0
                                ' Rectangle TOP-LEFT
                                ' ================================================================================
                                ' X
                                Me.Width = Me.Width - DeltaX
                                If Me.Width > minSize Then
                                    pt.X = Me.Left + DeltaX
                                Else
                                    Me.Width = minSize
                                End If
                                ' Y
                                Me.Height = Me.Height - DeltaY
                                If Me.Height > minSize Then
                                    pt.Y = Me.Top + DeltaY
                                Else
                                    Me.Height = minSize
                                End If
                            Case 1
                                ' Rectangle TOP
                                ' ================================================================================
                                ' Y
                                Me.Height = Me.Height - DeltaY
                                If Me.Height > minSize Then
                                    pt.Y = Me.Top + DeltaY
                                Else
                                    Me.Height = minSize
                                End If
                            Case 2
                                ' Rectangle TOP-RIGHT
                                ' ================================================================================
                                ' X
                                Me.Width = Me.Width + DeltaX
                                Me.Width = Math.Max(minSize, Me.Width)
                                ' Y
                                Me.Height = Me.Height - DeltaY
                                If Me.Height > minSize Then
                                    pt.Y = Me.Top + DeltaY
                                Else
                                    Me.Height = minSize
                                End If
                            Case 3
                                ' Rectangle RIGHT
                                ' ================================================================================
                                ' X
                                Me.Width = Me.Width + DeltaX
                                Me.Width = Math.Max(minSize, Me.Width)
                            Case 4
                                ' Rectangle BOTTOM-RIGHT
                                ' ================================================================================
                                ' X
                                Me.Width = Me.Width + DeltaX
                                Me.Width = Math.Max(minSize, Me.Width)
                                ' Y
                                Me.Height = Me.Height + DeltaY
                                Me.Height = Math.Max(minSize, Me.Height)
                            Case 5
                                ' Rectangle BOTTOM
                                ' ================================================================================
                                ' Y
                                Me.Height = Me.Height + DeltaY
                                Me.Height = Math.Max(minSize, Me.Height)
                            Case 6
                                ' Rectangle BOTTOM-LEFT
                                ' ================================================================================
                                ' X
                                Me.Width = Me.Width - DeltaX
                                If Me.Width > minSize Then
                                    pt.X = Me.Left + DeltaX
                                Else
                                    Me.Width = minSize
                                    pt.Y = Me.Top
                                End If
                                ' Y
                                Me.Height = Me.Height + DeltaY
                                Me.Height = Math.Max(minSize, Me.Height)
                            Case 7
                                ' Rectangle LEFT
                                ' ================================================================================
                                ' X
                                Me.Width = Me.Width - DeltaX
                                If Me.Width > minSize Then
                                    pt.X = Me.Left + DeltaX
                                Else
                                    Me.Width = minSize
                                    pt.Y = Me.Top
                                End If
                        End Select
                        ' New Position of the dynamic PictureBox after Resizing
                        Me.Location = pt
                        ' Mouse Position after Resizing
                        MousePos = New Point(e.X, e.Y)
                        MousePos.X = Math.Max(0, Math.Min(MousePos.X, Me.Width))
                        MousePos.Y = Math.Max(0, Math.Min(MousePos.Y, Me.Height))
                        MousePos = PointToScreen(MousePos)
                        ' Update of Rectangles used for Resizing (Adornments)
                        CalcAdornments()
                        ' To force Paint event
                        Invalidate()
                    End If
                End If
            End If
        Else
            ' MouseButton.Left NOT CLICKED
            ' Mouse over Adornments (Rectangles used for Resizing)
             ActiveAdornment = -1
            ' Set the Cursor for the Adorments used
            Dim tmprect As RectangleF
            Dim i As Integer = 0
            For Each tmprect In Adornments
                If tmprect.Contains(e.X, e.Y) Then
                    MouseInPict = True
                    ActiveAdornment = i
                    SetAdornmentCursor()
                    Invalidate()
                    Return
                End If
                i = i + 1
            Next
            ' Mouse somewhere else
            Cursor = Cursors.Default
            Invalidate()
        End If
    End Sub


A+
JLuc01
0
Utilisateur anonyme
19 févr. 2013 à 00:09
Bonjour,

Je te propose de tester le code suivant dans un projet vierge et d'observer les valeurs e.X et e.Y dans la fenêtre exécution lorsqu'on déplace la souris.
Ici, je n'ai traité que ce que tu appelles ton coin 0.
On constate que x et y prennent des valeurs négatives pour ce coin là...

Option Strict On
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Controls.Add(New clsP With {.BackColor Color.Red, .Top 50, .Left = 50})
    End Sub

    Public Class clsP
        Inherits PictureBox

        Private Sub clsP_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
            Debug.Print(String.Format("x={0} y={1}", e.X, e.Y))
        End Sub

        Private Sub clsP_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
            If e.X < 0 And e.Y < 0 Then
                Me.Left += e.X
                Me.Width += Math.Abs(e.X)
                Me.Top += e.Y
                Me.Height += Math.Abs(e.Y)

            End If
        End Sub
    End Class
End Class
0
Utilisateur anonyme
19 févr. 2013 à 00:13
J'ai oublié de préciser qu'il faut presser et maintenir le bouton gauche de la souris.
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
19 févr. 2013 à 23:18
Bonsoir Banana,

Le point de reference (0,0) se trouve en haut a gauche du PictureBox.
Donc, on a des valeurs negatives quand on va a gauche ou en haut a l'exterieur de la PictureBox. Et alors?
Je ne vois pas ou vous voulez en venir.

La seule chose que je vois, c'est que le code que j'utilise est peut-etre trop complique pour ce que je veux faire, quoique si j'utilise des carres comme zone de controle lorsque j'agrandis ou retrecis, cela parait approprie. Ou bien , je commence a tout melange.

En fait, peut-etre que le bout de code propose sera un nouveau point de depart.
Merci tout de meme.

A+
JLuc01
0
Utilisateur anonyme
19 févr. 2013 à 23:18
Je devais être un peu fatigué hier soir, voici le code fonctionnel :
Option Strict On
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Controls.Add(New clsP With {.BackColor Color.Red, .Top 50, .Left = 50})
    End Sub

    Public Class clsP
        Inherits PictureBox

        Private Sub clsP_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
            Debug.Print(String.Format("x={0} y={1}", e.X, e.Y))
            If e.X < 0 And e.Y < 0 Then
                Me.Left += e.X
                Me.Width += Math.Abs(e.X)
                Me.Top += e.Y
                Me.Height += Math.Abs(e.Y)
            End If
        End Sub
    End Class
End Class
0
Utilisateur anonyme
19 févr. 2013 à 23:24
Ce que je veux te montrer c'est que tu peux facilement agrandir ton coin supérieur gauche en déplaçant ta souris le tout en plaçant le code à l'intérieur de ta classe (aucun code sur le formulaire principal). Ce n'est pas ce que tu voulais ?
0
Utilisateur anonyme
19 févr. 2013 à 23:27
J'aurais peut-être du le présenter comme ceci, ça revient au même mais c'est plus parlant :
Option Strict On
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Controls.Add(New clsP With {.BackColor Color.Red, .Top 50, .Left = 50})
    End Sub
End Class


Public Class clsP
    Inherits PictureBox

    Private Sub clsP_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        Debug.Print(String.Format("x={0} y={1}", e.X, e.Y))
        If e.X < 0 And e.Y < 0 Then
            Me.Left += e.X
            Me.Width += Math.Abs(e.X)
            Me.Top += e.Y
            Me.Height += Math.Abs(e.Y)
        End If
    End Sub
End Class
0
Utilisateur anonyme
20 févr. 2013 à 00:04
Par bonté, je t'ai fait tous les angles (voir numéros) .A améliorer bien entendu car là c'est du brut :

0  1  2 
7     3
6  5  4


Option Strict On
Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Controls.Add(New clsP With {.BackColor Color.Red, .Top 50, .Left = 50})
    End Sub
End Class


Public Class clsP
    Inherits PictureBox

    Sub New()
        Me.Image = Image.FromFile("ton_image.jpg")
        Me.SizeMode = PictureBoxSizeMode.Zoom
    End Sub

    Private Sub clsP_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
        Debug.Print(String.Format("x={0} y={1}", e.X, e.Y))
        If e.Button = Windows.Forms.MouseButtons.Left Then
            '0
            If e.X < 0 And e.Y < 0 Then
                Cursor = Cursors.PanNW
                Me.Left += e.X
                Me.Width += Math.Abs(e.X)
                Me.Top += e.Y
                Me.Height += Math.Abs(e.Y)
                '7
            ElseIf e.X < 0 And e.Y > 10 And e.Y < Me.Height - 20 Then
                Cursor = Cursors.PanWest
                Me.Left -= Math.Abs(e.X)
                Me.Width += Math.Abs(e.X)
                '6
            ElseIf e.X < 0 And e.Y > 20 Then
                Cursor = Cursors.PanSW
                Me.Left += e.X
                Me.Width += Math.Abs(e.X)
                Me.Height += Math.Abs(e.Y) - Me.Height
                '3
            ElseIf e.X > Me.Width Then
                Cursor = Cursors.PanEast
                Me.Width += e.X - Me.Width
                '2
            ElseIf e.X > (Me.Width - 20) And e.Y < 0 Then
                Cursor = Cursors.PanNE
                Me.Width += e.X - Me.Width
                Me.Top -= Math.Abs(e.Y)
                Me.Height += Math.Abs(e.Y)
                '4
            ElseIf e.X > Me.Width - 20 And e.Y > Me.Height - 20 Then
                Cursor = Cursors.PanSE
                Me.Width += e.X - Me.Width
                Me.Height += Math.Abs(e.Y) - Me.Height
            ElseIf e.X > 20 And e.Y > Me.Height - 20 Then
                '5
                Cursor = Cursors.PanSouth
                Me.Height += Math.Abs(e.Y) - Me.Height
                '1
            ElseIf e.X > 20 And e.X < Me.Width - 20 And e.Y < 0 Then
                Cursor = Cursors.PanNorth
                Me.Top -= Math.Abs(e.Y)
                Me.Height += Math.Abs(e.Y)

            End If
        End If
    End Sub
End Class
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
21 févr. 2013 à 00:43
Bonsoir,

Tout d'abord, merci de votre aide. Je crois que je dois chercher/trouver mes erreurs dans mon code original pour arriver quelquepart.

Toutefois, j'essaye de comprendre l'exemple que vous m'avez presente, mais je coince sur les positions 0 et 7. Je n'ai pas regarde encore les positions 1, 2 et 6, mais par contre tout va bien avec les positions 3, 4 et 5.

Voila ce que j'ai modifie/rearrange pour l'instant:
                ' Position 0 ??
            If e.X < 20 And e.Y < 20 Then
                Cursor = Cursors.PanNW
                Me.Left = Me.Left + e.X
                Me.Width = Me.Width + Math.Abs(e.X)
                Me.Top = Me.Top + e.Y
                Me.Height = Me.Height + Math.Abs(e.Y)
                '1
            ElseIf e.X > 20 And e.X < Me.Width - 20 And e.Y < 0 Then
                Cursor = Cursors.PanNorth
                Me.Top -= Math.Abs(e.Y)
                Me.Height += Math.Abs(e.Y)
                '2
            ElseIf e.X > (Me.Width - 20) And e.Y < 0 Then
                Cursor = Cursors.PanNE
                Me.Width += e.X - Me.Width
                Me.Top -= Math.Abs(e.Y)
                Me.Height += Math.Abs(e.Y)
                ' Position 3
            ElseIf e.X > Me.Width - 20 And e.Y > 20 And e.Y < Me.Height - 20 Then
                Cursor = Cursors.PanEast
                Me.Width = e.X
                ' Position 4
            ElseIf e.X > Me.Width - 20 And e.Y > Me.Height - 20 Then
                Cursor = Cursors.PanSE
                Me.Width = e.X
                Me.Height = e.Y
                ' Position 5
            ElseIf e.X > 20 And e.X < Me.Width - 20 And e.Y > Me.Height - 20 Then
                Cursor = Cursors.PanSouth
                Me.Height = e.Y
                '6
            ElseIf e.X < 0 And e.Y > 20 Then
                Cursor = Cursors.PanSW
                Me.Left += e.X
                Me.Width += Math.Abs(e.X)
                Me.Height += Math.Abs(e.Y) - Me.Height
                ' Position 7 ??
            ElseIf e.X < 20 And e.Y > 20 And e.Y < Me.Height - 20 Then
                Cursor = Cursors.PanWest
                Me.Left = Me.Left - Math.Abs(e.X)
                Me.Width = Me.Width + Math.Abs(e.X)
            End If

En fait, pour la position 0, quand j'agrandis, ca marche, mais quand je veux retrecir (aller vers le bas a droite), cela s'agrandit et surtout le coin en bas a droite bouge. Il y a certainement quelquechose de plus subtile a faire, mais je ne vois pas.
Sorry to be so thick!, comme disent les anglais.

A+
JLuc01
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
26 févr. 2013 à 00:20
Bonsoir Banana,

Tres interessant. Et une facon de faire inedite pour moi.
Je me demande si je ne vais pas laisser mon code de cote qui commencait a marcher, mais n'est pas aussi fluide que celui-ci dans ces mouvements.
Peut-etre un nouveau point de depart. Mais, avant tout, je dois decortiquer ce code pour le comprendre parfaitement, surtout si je veux le modifier a ma facon. Mais, la base est certainement la.

En tout cas, depuis que je cherche a bouger et agrandir/retrecir une PictureBox, j'ai decouvert plein de facon de le faire plus ou moins bien, mais souvent avec de nouvelles idees.

A+
JLuc01
0
Utilisateur anonyme
26 févr. 2013 à 00:38
Il faut maintenant jouer sur la fonction CalculeZones pour ne permettre le redimensionnement que sur des zones restreintes (une dizaine de pixel au carré). Et sur les 8 zones. Ceci pour éviter un dimensionnement brutal lors d'un clic éloigné du bord de l'image.
Tu devrais y arriver en utilisant des pourcentages (largeur et hauteur) par exemple. Dans mon exemple, les zones sont contigües.
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
27 févr. 2013 à 23:35
Bon, j'ai essaye le code ci-dessous pour la fonction. Mais, il y a un probleme. Comme je m'endors devant mon ecran, je vais aller me coucher.
Si toutefois, vous passez par-la, un petit conseil pour m'aider a continuer ou bien me souligner mon erreur serait le bienvenu.
Sinon, demain, j'aurais peut-etre les idees un peu plus claires.

Private Function CalculZone(ByVal rect As Rectangle) As List(Of Rectangle)
        '
        Dim rects As New List(Of Rectangle)
        '
        rects.Add(New Rectangle(0, 0, CInt(rect.Width * 0.1), CInt(rect.Height * 0.1)))
        rects.Add(New Rectangle(CInt(rect.Width * 0.3), 0, CInt(rect.Width * 0.4), CInt(rect.Height * 0.1)))
        rects.Add(New Rectangle(CInt(rect.Width * 0.9), 0, CInt(rect.Width * 0.1), CInt(rect.Height * 0.1)))
        rects.Add(New Rectangle(CInt(rect.Width * 0.9), CInt(rect.Height * 0.3), CInt(rect.Width * 0.1), CInt(rect.Height * 0.4)))
        rects.Add(New Rectangle(CInt(rect.Width * 0.9), CInt(rect.Height * 0.9), CInt(rect.Width * 0.1), CInt(rect.Height * 0.1)))
        rects.Add(New Rectangle(CInt(rect.Width * 0.3), CInt(rect.Height * 0.9), CInt(rect.Width * 0.4), CInt(rect.Height * 0.1)))
        rects.Add(New Rectangle(0, CInt(rect.Height * 0.9), CInt(rect.Width * 0.1), CInt(rect.Height * 0.1)))
        rects.Add(New Rectangle(0, CInt(rect.Height * 0.3), CInt(rect.Width * 0.1), CInt(rect.Height * 0.4)))
        '
        Return rects
    End Function


Rectification:
rects.Add(New Rectangle(-10, -10, CInt(rect.Width * 0.1), CInt(rect.Height * 0.1)))

En mettant un point de coordonnee a lexterieur de la PictureBox (comme dans le code original), cela a l'air d'aider... donc a voir. Bizarre qu'on ne peut pas demarrer aux coordonnees (0,0).

Ceci etant dit, bonne nuit.

A+
JLuc01
0
Utilisateur anonyme
28 févr. 2013 à 22:50
En ajoutant un paramètre 'distance' à la fonction, tu peux écrire ceci :
    'fonction de calcul des zones de redimensionnement 
    Private Function CalculeZones(ByVal rect As Rectangle, ByVal distance As Integer) As List(Of Rectangle)
        Dim largeur_recoupe As Integer = Convert.ToInt32(rect.Width / 2)
        Dim hauteur_recoupe As Integer = Convert.ToInt32(rect.Height / 2)
        Dim div As Integer = Convert.ToInt32(distance / 2)
        Dim rects As New List(Of Rectangle)
        rects.Add(New Rectangle(0, 0, distance, distance))
        rects.Add(New Rectangle(largeur_recoupe - div, 0, distance, distance))
        rects.Add(New Rectangle(rect.Width - distance, 0, distance, distance))
        rects.Add(New Rectangle(rect.Width - distance, hauteur_recoupe - div, distance, distance))
        rects.Add(New Rectangle(rect.Width - distance, rect.Height - distance, distance, distance))
        rects.Add(New Rectangle(largeur_recoupe - div, rect.Height - distance, distance, distance))
        rects.Add(New Rectangle(0, rect.Height - distance, distance, distance))
        rects.Add(New Rectangle(0, hauteur_recoupe - div, distance, distance))
        Return rects
    End Function


Tu pourras alors, changer cette distance à volonté dans le code au besoin par rapport à la taille de l'image par exemple sur cette ligne (ici j'ai mis 5 et ça me semble acceptable) :
Dim Zones As List(Of Rectangle) = CalculeZones(rect, 5)
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
28 févr. 2013 à 23:52
Genial! Merci pour les precisions.

A+
JLuc01
0
Rejoignez-nous