Coordonnées Pointeur pour DrawImage - Drag and drop

Naudrey43 Messages postés 17 Date d'inscription lundi 6 décembre 2010 Statut Membre Dernière intervention 29 février 2012 - 27 févr. 2012 à 16:09
Naudrey43 Messages postés 17 Date d'inscription lundi 6 décembre 2010 Statut Membre Dernière intervention 29 février 2012 - 29 févr. 2012 à 21:02
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 :

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 :
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 ...
A voir également:

24 réponses

cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
27 févr. 2012 à 20:59
Salut

Bonjour, j'ai posté la semaine derniére


il faut se rappeler en plus tu ne réponds pas
au réponse qu'on te donne

Mon probléme ce situe a ce niveau la :

New Rectangle(e.X, e.Y, 100, 100))


comme ci qu'on pouvait comprendre

les coodonnées du curseur quand tu drag et drop
c'est le x et y relatif à ton picturebox
et non le x y de ta form
0
Naudrey43 Messages postés 17 Date d'inscription lundi 6 décembre 2010 Statut Membre Dernière intervention 29 février 2012
28 févr. 2012 à 08:58
Re bonjour ShayW,

comment fais tu pour utiliser (dans new rectangle) les coordonées du curseur x et y relatif a ta form ?
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
28 févr. 2012 à 12:04
Si ton application consiste à joindre 2 images
si je comprends tu a l'image du produit
et l'image du barcode
les deux ont la meme largeur et un est placé en dessous de l'autre
pourquoi as tu besoin de glisser l'image
et ne pas te servir directement du
code JoinImage
en plus comme tu veux faire glisser l'image
et la superposer ou tu cliques tu ne vas pas
obtenir une image droite
et si tu dois faire l'opération pour 100 images
le mieux serait dans une loop
d'appeller JoinImage qui va falloir un peu
modifier
As tu une liste d'images de produit et une
liste d'images barcode correspondantes ?
0
Naudrey43 Messages postés 17 Date d'inscription lundi 6 décembre 2010 Statut Membre Dernière intervention 29 février 2012
28 févr. 2012 à 12:12
Mon application consiste bien a placer une image (mon code barre) sur une autre (un plan).
Mais mes images n'ont pas du tout la méme taille, mon code barre fait 67px x 67 px et un plan fait 3311px x 2339px.
J'arrives a déplacer mes codes barres sur le plan, mais il ne se colle pas a l'endroit ou et positionner mon curseur lorsque je relache le bouton de la souris...

il se colle un peu n'importe ou...

ce que je voudrais c'est qu'ils se collent a l'endroit exacte de mon curseur de souris lorsque je relache le bouton ...

Je sais pas si j'arrives bien a exprimer mon probléme...
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
28 févr. 2012 à 16:15
je t'ai proposé sans drag et drop
joindre directement le but final c'est bien
d'avoir 2 images je t'envoie un exemple
un peu plut tard avec 2 images de meme dimensions
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
28 févr. 2012 à 17:33
expliques encore ben oui
tu veux placer plusieurs code bar dans la meme
image comme el schéma ci dessous

______________________________
| |
| |
| |
| |
| °°°° °°°°° °°°°° |
_______________________________

combien de code bar dans le plan y a t'il ?
veux tu les placer l'un à la suite de l'autre
en bas du plan ?
0
Naudrey43 Messages postés 17 Date d'inscription lundi 6 décembre 2010 Statut Membre Dernière intervention 29 février 2012
28 févr. 2012 à 18:47
Je veux placer plusieurs codes-barres sur mon plan ... environ une 10éne cela dépends du plan...
et il ne se place pas a la suite les uns des autres ...
c'est selon le plan... un peu n'importe ou sur le plan ... sa change d'un plan a l'autre...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 févr. 2012 à 18:55
Bonjour,

Il s'agit de codes-barre.
Ils sont en principe une police de caractères (particulière, certes, mais une police).

Ne serait-il pas beaucoup plus simple, dans ce cas, d'imprimer sur la picturebox au mouse_down droit (par exemple) sur la picturebox, plutôt que ces glisser-déposer ?
Ma remarque est peu-être idiote, mais ...
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Naudrey43 Messages postés 17 Date d'inscription lundi 6 décembre 2010 Statut Membre Dernière intervention 29 février 2012
28 févr. 2012 à 18:58
Mes codes barre sont sous forme d'images ... ce sont des codes-barre de type datamatrix 2D...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 févr. 2012 à 19:00
On pourrait même, selon ce principe : copier le texte clair correspondant à ce code barre et l'imprimer en police code-barre sur la picturebox, à l'endroit du mouse_down/bouton droit.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Naudrey43 Messages postés 17 Date d'inscription lundi 6 décembre 2010 Statut Membre Dernière intervention 29 février 2012
28 févr. 2012 à 19:06
Il existe une police qui fais des codes-barre type datamatrix ?

Menfin même si c'étais le cas ... je penses pas que ça règle mon probléme... mon probléme et pas de déplacer mon code barre sur mon plan, j'y arrives parfaitement... mon probléme c'est qu'il ne se place pas a l'endroit ou est positionner le curseur lors du clique... il se met dans le coin supérieur gauche de ma picturebox... mais il est parfaitement déplacer... c'est juste les coordonnées du curseur de la souris qui me pose probléme...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 févr. 2012 à 07:33
Je pense tout simplement qu'il assez risqué de travailler ce cette manière, sauf à :
- soit avoir les deux images en grandeur réelle (m'étonnerait un peu) sur ton Form
- soit les avoir toutes deux avec le même coefficient d'étirement proportionnel, puis faire des calculs de proportions tout le long.
Voilà !

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 févr. 2012 à 07:41
puis faire des calculs de proportions tout le long. positions relatives tout le long


Si tu y tiens, il serait alors plus simple (mais je n'aime pas non plus) de cliquer droit sur un point de ta picturebox, de relever la position relative de ton curseur, puis de travailler non pas sur la représentation de la picturebox étirée, mais sur la stdPicture lui correspondant, puis de rafraichir à partir du résultat.
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 févr. 2012 à 07:51
Quant à
Il existe une police qui fais des codes-barre type datamatrix ?


Bien évidemment non, mais c'est la première fois que tu mentionnes qu'il s'agit de ce type de code-barre.
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Naudrey43 Messages postés 17 Date d'inscription lundi 6 décembre 2010 Statut Membre Dernière intervention 29 février 2012
29 févr. 2012 à 08:27
Bonjour ucfoutu !

En ce qui concerne la police pour des codes-barres type datamatrix... J'avais fais des recherches... bon j'avais rien trouvé de concluant... mais bon j'aurais pu passer a coté de quelque chose...

Aprés, j'essaie de concerver les images en taille réelle dans mon form ... je suis sur une piste afin de réglé mon probléme ... je vous tiens au courant...
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 févr. 2012 à 08:34
Aprés, j'essaie de concerver les images en taille réelle dans mon form .

Par quel coup de baguette magique, si trop grandes ?
J'espère que tu ne vas pas n'en afficher qu'une partie (celle où déposer l'autre image), car alors tu vas avoir les mêmes problèmes de calculs auquels j'ai fait allusion, mais également des problèmes de "correction" par ajout des dimensions de la partie cachée.
Je crois vraiment que, si tu tiens à une telle méthode, il est plus sage de travailler sur la totalité de l'image (en étirement proportionnel) pour relever les coordonnées relatives de l'insertion et de travailler en mémoire sur l'image réelle (stdPicture). Tu peux (mais alors plus lourd) également travailler sur une picturebox invisible utilisée comme tu utiliserais une stdPicture (mêmes méthodes de calculs relatifs).

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
29 févr. 2012 à 11:23
Salut

l'application permet
clique sur "plan image"
1 d'ajouter une image de font l'image de ton
plan
clique sur "les barcodes"
choisi la bar code
pour déplacer la barcode sur le plan
je n'utilise pas le drag and drop
avec la souris bouton gauche appuyé et on traine
et on relache où on veut
bien sur déplacer de nouveau
pour effacer un barcode
clique avec le bouton droit de la souris
clique sur save image
sauvegarde l'image

sur ta form
Tu places un control panel tu le nommes
panelframe
un control openfiledialog
un control savefiledialog
C'est tout


Imports System
Imports System.Drawing
Imports System.Drawing.Imaging

Public Class Form1
#Region "declaration"
    Private WithEvents mytoolstripbar As New ToolStrip
    Private WithEvents planimage As New ToolStripButton
    Private WithEvents barimage As New ToolStripButton
    Private WithEvents saveimage As New ToolStripButton
    Private WithEvents Eraseall As New ToolStripButton
    Private xp, yp As Integer
    Private flagplan As Boolean
    Private counter As Integer

    Private Structure barcodeimage
        Public imagebarcode As Bitmap
        Public idimage As Integer
    End Structure
    Private Structure barcodedata
        Public locationbarcode As Point
        Public barcodeid As Integer
    End Structure
    Private listbarcodeimage As New List(Of barcodeimage)
    Private lastmouselocation As New Point
    Private listlocationbarcode As New List(Of barcodedata)
#End Region
#Region "design"
    Private Sub DesignToolstripBar()
        mytoolstripbar.BackColor = Color.Cornsilk
        Me.Controls.Add(mytoolstripbar)
        With planimage
            .Font = New Font("arial", 12, FontStyle.Bold)
            .BackColor = Color.PowderBlue
            .Text = "Plan image"
            .ToolTipText = "loading plan image"
        End With
        mytoolstripbar.Items.Add(planimage)
        mytoolstripbar.Items.Add(New ToolStripSeparator)
        With barimage
            .Font = New Font("arial", 12, FontStyle.Bold)
            .BackColor = Color.PowderBlue
            .Text = "Les barcodes"
            .ToolTipText = "loading barcode image"
            .Enabled = False
        End With
        mytoolstripbar.Items.Add(barimage)
        mytoolstripbar.Items.Add(New ToolStripSeparator)
        With saveimage
            .Font = New Font("arial", 12, FontStyle.Bold)
            .BackColor = Color.PowderBlue
            .Text = "Save image"
            .ToolTipText = "save image"
            .Enabled = False
        End With
        mytoolstripbar.Items.Add(saveimage)
        mytoolstripbar.Items.Add(New ToolStripSeparator)
        With Eraseall
            .Font = New Font("arial", 12, FontStyle.Bold)
            .BackColor = Color.PowderBlue
            .Text = "Nouveau"
            .ToolTipText = "Nouveau"
            .Enabled = False
        End With
        mytoolstripbar.Items.Add(Eraseall)
    End Sub
#End Region
#Region "events"
    Private Sub OpenFileDialog1_FileOk(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
        Dim thebarcodedata As New barcodedata
        If flagplan Then
            Panelframe.Visible = True
            Panelframe.BackgroundImage = Image.FromFile(OpenFileDialog1.FileName)
            Panelframe.Width = Panelframe.BackgroundImage.Width
            Panelframe.Height = Panelframe.BackgroundImage.Height
            Panelframe.Location = New Point(0, mytoolstripbar.Bottom + 2)
            Panelframe.BackgroundImageLayout = ImageLayout.None
            Exit Sub
        End If
        Dim mypic As New PictureBox
        Dim thebarcodeimage As New barcodeimage
        With mypic
            .BackgroundImage = Image.FromFile(OpenFileDialog1.FileName)
            .Location = New Point(xp, yp)
            .BorderStyle = BorderStyle.Fixed3D
            .Width = .BackgroundImage.Width
            .Height = .BackgroundImage.Height
            .Tag = counter
            .BringToFront()
            AddHandler mypic.MouseMove, AddressOf mypicmousemove
            AddHandler mypic.MouseDown, AddressOf mypicMouseDown
            AddHandler mypic.MouseUp, AddressOf mypicMouseup
        End With
        thebarcodeimage.idimage = counter
        thebarcodeimage.imagebarcode = DirectCast(mypic.BackgroundImage, Bitmap)
        thebarcodedata.barcodeid = counter
        thebarcodedata.locationbarcode = mypic.Location
        listbarcodeimage.Add(thebarcodeimage)
        listlocationbarcode.Add(thebarcodedata)
        counter += 1
        Panelframe.Controls.Add(mypic)
    End Sub

    


    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        xp = 1
        yp = 1
        counter = 0
        DesignToolstripBar()
       
        

    End Sub

    Private Sub mypicmousemove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Dim pt As New Point
        pt = e.Location
        If e.Button = Windows.Forms.MouseButtons.Left Then

            pt.X = (pt.X + DirectCast(sender, PictureBox).Left) - lastmouselocation.X
            pt.Y = (pt.Y + DirectCast(sender, PictureBox).Top) - lastmouselocation.Y
            If pt.X < 0 Then

                pt.X = 0
            End If
            If pt.Y < 0 Then
                pt.Y = 0
            End If
            If pt.X > Me.Width - DirectCast(sender, PictureBox).Width Then
                pt.X = Me.Width - DirectCast(sender, PictureBox).Width
            End If
            If pt.Y > Me.Height - DirectCast(sender, PictureBox).Height Then
                pt.Y = Me.Height - DirectCast(sender, PictureBox).Height
            End If
            DirectCast(sender, PictureBox).Location = pt
            DirectCast(sender, PictureBox).BringToFront()
        End If
    End Sub
    Private Sub mypicMouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        lastmouselocation = e.Location
    End Sub
    Private Sub mypicMouseup(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Dim relativepoint As New Point
        Dim thebarcodedata As New barcodedata
        Dim idbarcode, iter, iterimage As Integer
        relativepoint.X = DirectCast(sender, PictureBox).Left
        relativepoint.Y = DirectCast(sender, PictureBox).Top
        For iterimage = 0 To listbarcodeimage.Count - 1
            If DirectCast(sender, PictureBox).Tag.ToString = listbarcodeimage(iterimage).idimage.ToString Then
                idbarcode = listbarcodeimage(iterimage).idimage
                If e.Button = Windows.Forms.MouseButtons.Left Then
                    For iter = 0 To listlocationbarcode.Count - 1
                        If listlocationbarcode(iter).barcodeid = idbarcode Then
                            thebarcodedata.barcodeid = idbarcode
                            thebarcodedata.locationbarcode = relativepoint
                            listlocationbarcode.Remove(listlocationbarcode(iter))
                            listlocationbarcode.Insert(iter, thebarcodedata)
                            Exit Sub
                        End If
                    Next
                Else
                    listbarcodeimage.RemoveAt(iterimage)
                    For iter = 0 To listlocationbarcode.Count - 1
                        If listlocationbarcode(iter).barcodeid = idbarcode Then
                            listlocationbarcode.RemoveAt(iter)
                            Panelframe.Controls.Remove(DirectCast(sender, PictureBox))
                            Exit Sub
                        End If
                    Next
                End If
            End If


        Next
    End Sub
    

    Private Sub planimage_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles planimage.MouseDown
        flagplan = True
        OpenFileDialog1.ShowDialog()
        barimage.Enabled = True
        Eraseall.Enabled = True
        DirectCast(sender, ToolStripButton).Enabled = False
    End Sub
    Private Sub barimage_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles barimage.MouseDown
        flagplan = False
        OpenFileDialog1.ShowDialog()
        saveimage.Enabled = True
        Eraseall.Enabled = True
    End Sub
    Private Sub saveimage_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles saveimage.MouseDown
        SaveFileDialog1.ShowDialog()
        
    End Sub
    Private Sub SaveFileDialog1_FileOk(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles SaveFileDialog1.FileOk
        JoinImage()
        MessageBox.Show("New image was created")
    End Sub
    Private Sub Eraseall_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Eraseall.MouseDown
        listbarcodeimage.Clear()
        listlocationbarcode.Clear()
        Panelframe.Controls.Clear()
        Panelframe.Visible = False
        barimage.Enabled = False
        planimage.Enabled = True
        saveimage.Enabled = False
    End Sub
#End Region
    

    Private Sub JoinImage()
        Try
            Dim imageplan As Bitmap = DirectCast(Panelframe.BackgroundImage, Bitmap)
            Dim size1, size2, sizefinal As New Size
            size1 = imageplan.Size
            '   size2 = imageplan2.Size
            sizefinal.Height = size1.Height
            sizefinal.Width = size1.Width
            Dim imgFinal As New Bitmap(sizefinal.Width, sizefinal.Height)
            Dim gfx As Graphics = Graphics.FromImage(imgFinal)
            gfx.Clear(Color.White)
            gfx.DrawImage(imageplan, 0, 0, New Rectangle(0, 0, size1.Width, size1.Height), GraphicsUnit.Pixel)
            '  gfx.DrawImage(imageplan2, New Point(20, size1.Height \ 2))
            For iter = 0 To listbarcodeimage.Count - 1
                gfx.DrawImage(listbarcodeimage(iter).imagebarcode, New Point(listlocationbarcode(iter).locationbarcode.X, listlocationbarcode(iter).locationbarcode.Y))
            Next
            imgFinal.Save(SaveFileDialog1.FileName, ImageFormat.Jpeg)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub


    Public Sub New()

        ' This call is required by the Windows Form Designer.
        InitializeComponent()
        Panelframe.Visible = False
        ' Add any initialization after the InitializeComponent() call.

    End Sub

   
End Class
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
29 févr. 2012 à 11:31
Bonjour, ShayW,
Je ne peux tester ton travail (n'étant pas sous VB6), mais son analyse/lecture me donne à penser qu'il est beau.

Je crains toutefois que les "tenants" ne soient pas aussi clairs et qu'ils soient tels qu'il va falloir faire plein d'autres choses. Lis les derniers messages : tu vas comprendre mon inquiétude.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
29 févr. 2012 à 11:44
Bonjour Ucfoutu

laisse à attendre la réponse de Naudrey43
ça va etre

ou
0
Naudrey43 Messages postés 17 Date d'inscription lundi 6 décembre 2010 Statut Membre Dernière intervention 29 février 2012
29 févr. 2012 à 11:56
Bonjour shayW, je suis pas chez moi la tout de suite donc je sais pas si je vais pouvoir tester le code que tu ma envoyé, mais je le ferais au plus tard ce soir chez moi et je te dirais ça !!

un grand merci en tout cas !
0
Rejoignez-nous