IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Coordonnées Pointeur pour DrawImage - Drag and drop [Débutant]


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 17
    Points : 12
    Points
    12
    Par défaut Coordonnées Pointeur pour DrawImage - Drag and drop
    Bonjour, j'ai posté la semaine derniére un probléme pour faire mon application de drag and drop. Bon j'ai pas mal avancée Mais aujourd'hui je suis confrontée a un nouveau probléme.
    Pour dessiner mon image déplacer sur mon autre image (drag and drop)
    j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    Private Sub pictureBox_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs)
     
            Dim picbox As PictureBox = CType(sender, PictureBox)
            Dim g As Graphics
            g = Graphics.FromImage(picbox.Image)
            g.DrawImage(CType(e.Data.GetData(DataFormats.Bitmap), Image), New Rectangle(e.X, e.Y, 100, 100))
            picbox.Invalidate()
     
        End Sub
    Mon probléme ce situe a ce niveau la :
    Code Visual Basic :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    New Rectangle(e.X, e.Y, 100, 100))

    Je veux pouvoir coller mon image déplacer à l'endroit ou se trouve mon curseur de souris... le probléme c'est que ça ne marche pas comme je veux, l'image et bien déplacer mais elle se colle un peu nimporte ou... et pas la ou j'ai mis le curseur ... j'ai lu pas mal de chose sur des forums et fais des tests ... mais je n'arrives toujours pas à mettre mon image déplacée à l'endroit ou le curseur est placé et quand je relache le bouton de la souris...

    Savez vous comment faire pour que mon image soit placer a l'endroit ou mon curseur et placer sur ma deuxiéme picturebox?

    Merci d'avance ...

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    674
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 674
    Points : 1 176
    Points
    1 176
    Par défaut
    Bonsoir,
    DragEventArgs possède deux propriétés X et Y qui donnent les coordonnées d'écran du pointeur de la souris, lors du relèvement du clic sur la PictureBox réceptrice, par son événement DragDrop.
    Mais ce que l'on veut c'est avoir les coordonnées du même point, mais relatives à ladite Picturebox.

    La méthode PointToClient effectue cette transformation du point écran en point client.
    Il suffit alors de dire que ce point transformé est le point correspondant à la location de l'image glissée-déposée.

    A tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
        Private picture As Image
        Private pictureLocation As Point
     
        Private Sub pictureBox_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs)
            Dim picbox As PictureBox = CType(sender, PictureBox)
     
            ' Assignation de l'image à la variable image.
            Me.picture = CType(e.Data.GetData(DataFormats.Bitmap), Image)
            ' Transformation du point de chute, de coordonnées "écran" en coordonnées "client".
            pictureLocation = picbox.PointToClient(New Point(e.X, e.Y))
     
            If (Me.picture IsNot Nothing) And Not (Me.pictureLocation.Equals(Point.Empty)) Then
                Dim g As Graphics
                g = Graphics.FromImage(picbox.Image)
                g.DrawImage(Me.picture, Me.pictureLocation)
            End If
     
            picbox.Invalidate()
     
        End Sub

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Bonjour chrismonoye,

    Encore merci pour ton aide...

    J'ai tester ton code, cela semble fonctionner... mais c'est tout de même pas encore ça.

    Je m'expliques, les codes barres se déplacent bien correctement sur mon image, mais il semble y avoir un probléme d'echelle. Car lorsque je déplace mon code barre sur l'autre image, le code barre se déplace bien mais c'est comme si la zone a travaillé étais réduite a mon coin gauche (en haut). (une rectangle de quelques centimétre) il semblerais que ma zone de travail ne soit pas celle de la taille de mon image de picturebox, mais seulement cette partie de mon image.

    Par exemple je met mon curseur sur le coin gauche-haut de mon image le code barre se colle bien a lendroit précis -> Okay pas de pb

    Mais quand je met mon curseur sur le coin droite-bas de mon image le code barre sa colle sur le coin droite-bas de ma zone a travaillé (le rectangle de quelque centimétre en haut a gauche sur ma picturebox) et pas au coin droite-bas de mon image...

    Je sais pas si je me fais bien comprendre... ...

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Je viens de faire plusieurs tests ... mon probléme se trouve bien par rapport a l'echelle de mon image ...

    En faite mon image sur lequel j'ajoute mes code barre est de 9933px x 7016px ...


    j'ai fais le test avec une image de 1024px x 768px et la je n'ai pas de probléme mes codes barres sont bien placé a l'endroit ou est mon curseur ...

    j'ai donc un probléme de résolution ... vu que mon image et "grande" le déplacement ce fais que sur une zone de mon image et pas mon image entière... c'est comme si il ne prenais pas en charge la vrai taille de mon image ...

    j'ai essayer tant bien que mal de résoudre mon probléme ... mais je n'y parviens pas ...


    si vous avez une idée je suis preneuse...

    Merci d'avance !!!

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    674
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 674
    Points : 1 176
    Points
    1 176
    Par défaut
    Bonsoir,
    ha je comprends mieux.
    Ta PictureBox réceptrice est en SizeMode StretchImage ou en Zoom pour la voir en entier.
    Il faut la remettre en Normal, tout en gardant l'image que tu as dû mettre en mode Design.
    C'est ce qui explique ces déplacements, l'image reçue subit le même traitement.
    Alors au load, applique un redimensionnement manuel de l'image.
    Du genre du code de Pol qui habite là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Me.PictureBox2.AllowDrop = True
            AdaptImage(PictureBox2, PictureBox2.Image, PictureBox2.Size)
            AddHandler PictureBox1.MouseDown, AddressOf pictureBox_MouseDown
            AddHandler PictureBox2.DragDrop, AddressOf pictureBox_DragDrop
            AddHandler PictureBox2.DragEnter, AddressOf pictureBox_DragEnter
     
        End Sub
     
        Private Sub AdaptImage(ByVal pict As PictureBox, ByVal IMG As Image, ByVal new_size As Size)
            Dim imageFinale As System.Drawing.Image = Nothing
            Dim g As System.Drawing.Graphics = Nothing
            imageFinale = New System.Drawing.Bitmap(new_size.Width, new_size.Height)
            g = System.Drawing.Graphics.FromImage(imageFinale)
            Dim destRect As New System.Drawing.Rectangle(0, 0, new_size.Width, new_size.Height)
            Dim srcRect As New System.Drawing.Rectangle(0, 0, IMG.Width, IMG.Height)
            g.DrawImage(IMG, destRect, srcRect, System.Drawing.GraphicsUnit.Pixel)
     
            pict.Image = imageFinale
        End Sub
    Après tu peux encore connaitre des problèmes d'échelle si ton image et les codes barre n'ont pas la même résolution.
    Tu peux le contrôler dans les propriétés des PictureBox en mode Design, en développant Image, la résolution est indiquée.
    Dans ce cas, l'image réceptrice applique une mise à l'échelle à sa propre résolution semble t'il, aux images qu'elle reçoit.
    Un connaisseur dans ce domaine pourra nous en dire plus.
    Dans l'attente, teste cette modification de code qui devrait permettre de conserver les dimensions de l'image importée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            If (Me.picture IsNot Nothing) And Not (Me.pictureLocation.Equals(Point.Empty)) Then
                Dim g As Graphics
                g = Graphics.FromImage(picbox.Image)
                'g.DrawImage(Me.picture, Me.pictureLocation) ', New Rectangle(0, 0, 100, 100))
                g.DrawImage(Me.picture, New Rectangle(pictureLocation.X, pictureLocation.Y, picture.Width, picture.Height))
            End If
    Il te restes à optimiser tout ça, adapter ton PictureBox, pour ne pas avoir une image légèrement déformée, le code donne du StretchImage (le Zoom garde les proportions).

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Bonjour chrismonoye, j'ai tester ton code ... mais ça ne conviens pas ...

    Avec le code j'arrive en effet a déplacer les codes barres nimporte ou sur mon plan... pour ça c'est okay.

    Mais par contre lorsque j'enregistre mon image, la qualité et "déguelasse", car mon plan a pris la dimension de mon picturebox (970; 680)

    Ce que je veux c'est garder la taille réelle de mon plan... (9933; 7016)

    Je ne peux pas réduire ça résolution sinon mon plan deviens ilisible ...

    Il faut impérativement que je travail sur cette dimmension ...

    Merci de ton aide !

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    674
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 674
    Points : 1 176
    Points
    1 176
    Par défaut
    Bonjour,
    dans ce cas, je ne toucherais pas l'image réceptrice.
    Juste un Zoom pour la présentation dans la PictureBox, ce qui n'affecte pas l'image.
    On calcul le rapport d'échelle qu'on appliquera à la position du curseur.
    Pour que cela marche, il faut aussi que la PictureBox soit en rapport, au plan des dimensions à ton image.
    Pour toi : 9933 / 7016 ==>970 / 685.
    On le contrôle dans le Load :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
        Dim scalRat As Double = 1
     
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
     
            'on charge l'image dans PictureBox2 en mode Zoom
            Dim imgPath As String = Application.StartupPath & "\..\..\Resources\IMGP0794.JPG"
            Dim img As Image = Image.FromFile(imgPath)
            PictureBox2.Image = Image.FromFile(imgPath)
            PictureBox2.SizeMode = PictureBoxSizeMode.Zoom
            ' On ajuste la Picturebox aux proportions de l'image
            PictureBox2.Height = CInt(img.Height * PictureBox2.Width / img.Width)
     
            ' On calcule le rapport d'échelle.
            scalRat = RateScale(img, PictureBox2)
     
            Me.PictureBox2.AllowDrop = True
     
            AddHandler PictureBox1.MouseDown, AddressOf pictureBox_MouseDown
            AddHandler PictureBox2.DragDrop, AddressOf pictureBox_DragDrop
            AddHandler PictureBox2.DragEnter, AddressOf pictureBox_DragEnter
     
        End Sub
     
        Private Function RateScale(ByVal img As Image, ByVal pic As PictureBox) As Double
            Dim divideByH, divideByW As Double
     
            divideByW = img.Width / pic.Width
            divideByH = img.Height / pic.Height
     
            Return Math.Min(divideByW, divideByH)
        End Function
    Reste à appliquer le rapport d'échelle sur la position du curseur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
        Private picture As Image
        Private pictureLocation As Point
     
        Private Sub pictureBox_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs)
            Dim picbox As PictureBox = CType(sender, PictureBox)
            tbTest.AppendText(String.Format("Mouse:  X={0} Y={1}", e.X, e.Y))
            ' Assignation de l'image à la variable image.
            Me.picture = CType(e.Data.GetData(DataFormats.Bitmap), Image)
     
            ' Transformation du point de chute, de coordonnées "écran" en coordonnées "client".
            pictureLocation = picbox.PointToClient(New Point(CInt(e.X), CInt(e.Y)))
            ' Application du rapport d'échelle.
            pictureLocation = New Point(CInt(pictureLocation.X * scalRat), CInt(pictureLocation.Y * scalRat))
     
            If (Me.picture IsNot Nothing) And Not (Me.pictureLocation.Equals(Point.Empty)) Then
                Dim g As Graphics
                g = Graphics.FromImage(picbox.Image)
                g.DrawImage(Me.picture, New Rectangle(pictureLocation.X, pictureLocation.Y, picture.Width, picture.Height))
            End If
     
            picbox.Invalidate()
     
        End Sub
    Tes codes barres seront bien sur plus petits en visuel dans l'appli. mais seront normalement à l'échelle dans la sauvegarde de l'image finale.
    Et les dimensions et résolution de ton image conservées.
    Normalement.

  8. #8
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    Je viens de tester le code et c'est bon ! ça marche comme je veux !


    Faut que je fasse encore quelque petit réglages mais je regarderais mieux ça demain !

    Mais merci bien chrismonoyo !

    C'est génial , vraiment merci pour ton aide!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/09/2012, 08h07
  2. Meilleur méthode pour du drag and drop ASP.NET
    Par sspizer dans le forum ASP.NET
    Réponses: 1
    Dernier message: 20/07/2007, 14h10
  3. Coordonnée souris et drag and drop
    Par matrix_ceg dans le forum Windows Forms
    Réponses: 6
    Dernier message: 26/03/2007, 15h38
  4. Drag and drop pour control en VBA
    Par cbleas dans le forum VBA Access
    Réponses: 2
    Dernier message: 10/03/2007, 10h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo