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 :

Creer une ombre "rectangle" sous mon curseur


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    Par défaut Creer une ombre "rectangle" sous mon curseur
    Bonsoir,

    J'ai encore un petit soucis, voila j'ai beaucoup avancé dans mon application de Drag and Drop, Je fais déplacer mon image (code-barres) sur mon autre image (plan) sans probléme.

    Mais j'aimerais pouvoir avoir une ombre, enfaite lorsque je déplace mon code barre j'aimerais avoir sa forme (un rectangle) sous forme d'ombre pour savoir ou il sera positionner avant que je le colle, avec mon drag and drop...

    Pour le moment j'ai réussi a dessiner le rectangle , et il se positionne bien sous mon curseur et suis le déplacement de mon curseur.

    Mais le probléme et que cela dessine des rectangles tout au long de mon déplacement de curseur... et moi ce que je veux c'est seulement l'avoir comme indicateur de position je ne veux pas que celui si ce dessine sur mon plan... je veux que cela simule l'emplacement et la position de mon code barre une fois que celui ci sera collé

    Voila mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Private Sub Picturebox_MouseMove(Byval sender As Object, Byval e As System.windows.Forms.MouseEventArgs)
     
    Dim newpoint As New Point (e.X, e.Y)
    Dim NewGraphics As Graphics = picturebox.CreateGraphics()
    Dim BlackPen As New Pen(Color.Black, 10)
    Dim rect As New Rectangle(newpoint.X, newpoint.Y, 100, 100)
     
    NewGraphics.DrawRectangle(BlackPen, rect)
     
    End Sub

    Voila, donc mon code est sur le "mouvement" de souris

    Je penses que c'est sur cette événement qu'il faut le mettre et pas sur l’événement ... PictureBox_DragDrop....

    Voila... j’espère que j'ai réussi à bien expliquer mon probléme... et que vous pourrez m'aider... Je vous remercie d'avance ...

    Bonne soirée !

  2. #2
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    Après ton DrawGraphic, un petit: MaForm.Refresh(), n'effacerait il pas par hasard les anciens rectangle?

    J'avais fait cela pour un label... ce que j'avais fait c'est créer un clone du label avec de la transparence... et au lieu de le redessiner a chaque fois, je le déplaçais avec la souris.

    Peut être pourrai tu faire de même avec ton contrôle...

  3. #3
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour Audrey43
    Pourquoi absolument MouseMove?
    Comme l'as dait observer mactwist69 il y a Refresh pour tous les controls...

    PicDest.Refresh() combine à PicDest.Update() ont une grande vertu:
    -celle d' effacer et redessiner ton rectangle à sa nouvelle position....

    Au lieu de MouseMove utilise DragOver(car tu es plein milieu d'un DragDrop) qui:
    -te donne la main quand ta souris est au dessus du PicDest.....
    -te founit egalement les coord. du futur point de chute.....
    -alors profite-en pour dessiner le rectangle (size celle du PicSrc) et location comme dans DragDrop....
    -appelle refresh et update pour effacer et redessiner le rect. dans sa nouvelle position...........
    Dans DragDrop apres avoir termine :
    -mets le rectangle à empty et appelle refresh et update pour effacer et redessiner un rect. vide .............neant....(l'etre & le neant de J.Paul Sarte connais-tu?).......

    bref un exemple code qui ressemble à celui de ton post sur dragdrop pour te faciliter le boulot(2 picturebox avec image en resources hein ...

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
     
    Imports System.Drawing.Imaging
    Public Class formDragBox
        Dim bmp As Bitmap
        Private picLocation As Point = Point.Empty
     
        'variables pour gerer le rectangle
        Private dragBox As Rectangle = Rectangle.Empty
        Private rectPen As New Pen(Color.Yellow, 2)
     
        Public Sub New()
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            Me.ResizeRedraw = True
     
     
            '----  PictureBox source
            Me.AllowDrop = True
            Me.PicSrc.Image = My.Resources.Dessin1
            Me.PicSrc.SizeMode = PictureBoxSizeMode.Normal
            Me.PicSrc.AllowDrop = True
     
            '----  PictureBox destination
     
            Me.PicDest.AllowDrop = True
            Me.PicDest.Image = My.Resources.ZebrasThree
            Me.PicDest.SizeMode = PictureBoxSizeMode.Normal
     
        End Sub
     
        Private Sub PictureBoxSrc_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PicSrc.MouseDown
            Me.PicSrc.DoDragDrop(Me.PicSrc.Image, DragDropEffects.Copy)
     
        End Sub
        Private Sub PictureBoxDest_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles PicDest.DragEnter
            If Not (e.Data.GetDataPresent(DataFormats.Bitmap)) Then
                e.Effect = DragDropEffects.None
                Cursor.Current = Cursors.Arrow
            Else
                e.Effect = DragDropEffects.Copy
                Cursor.Current = Cursors.Cross
            End If
        End Sub
     
        Private Sub PictureBoxDest_DragOver(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles PicDest.DragOver
     
            picLocation = CType(sender, PictureBox).PointToClient(New Point(e.X, e.Y))
     
            ' ----- start move controlbox.
            Me.dragBox.Location = picLocation
            Me.dragBox.Width = PicSrc.Width
            Me.dragBox.Height = PicSrc.Height
            '---- vertu de  refresh image: (efface et redessine le rectangle à la bouvelle location)
            Me.PicDest.Refresh()
            Me.PicDest.Update()
        End Sub
     
        Private Sub PictureBoxDest_DragDrop(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles PicDest.DragDrop
            picLocation = CType(sender, PictureBox).PointToClient(New Point(e.X, e.Y))
     
            'met à jour  rectangle  Location.
            Me.dragBox.Location = picLocation
     
            'dragrop
            If Me.PicDest.Image.GetBounds(GraphicsUnit.Display).Contains(picLocation) Then
                bmp = e.Data.GetData(DataFormats.Bitmap)
                'teste -avec- et -sans- cette  ligne comment la taille de bmp est ajustee a celle de l'image festination
                bmp.SetResolution(Me.PicDest.Image.HorizontalResolution, Me.PicDest.Image.VerticalResolution)
     
                If (bmp IsNot Nothing) And _
               Not (Me.picLocation.Equals(Point.Empty)) Then
                    Dim gr As Graphics = Graphics.FromImage(Me.PicDest.Image)
     
                    gr.DrawImage(bmp, Me.picLocation)
                    'restore controlbox  to empty rectangle
                    Me.dragBox = Rectangle.Empty
                    '---- vertu de  refresh image: (efface et redessine cette un rectangle vide: neant)
                    Me.PicDest.Refresh()
                    Me.PicDest.Update()
                End If
     
     
            End If
     
        End Sub
        ' Me.PicDest.Refresh() &  Me.PicDest.Update() appelle cette sub
        Private Sub PicDest_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PicDest.Paint
            e.Graphics.DrawRectangle(Me.rectPen, dragBox)
        End Sub
    End Class
    A propos de resolution il y a une ligne de code pour setter la resolution d'image du PicSrc à celle du PicDest
    teste cette ligne en l'activant et la desactivant et observe l'effet sur la taille de l'image dropppee.................

    Observe egalement que dans l'evenement DragOver au lieu de dessiner :
    -un rectangle
    -tu peux aussi bien dessiner à sa place ton image à dropper en apercu avec DrawImage(bmpsrc,rectdest,rectsrc,GraphicsUnit.Display) dans l'event Paint
    en prenant bien sur rectdset egal => à notre rectangle "dragbox"............
    bon code.........................

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Bonjour,
    tu peux aussi jouer du curseur.
    En appelant l'événement GiveFeedback sur la PictureBox source :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Private Sub PictureBox1_GiveFeedback(ByVal sender As Object, ByVal e As System.Windows.Forms.GiveFeedbackEventArgs) Handles PictureBox1.GiveFeedback
     
            e.UseDefaultCursors = False
            StartCur()
     
        End Sub
    Et remplacer le curseur par défaut par celui ci, par exemple, un rectangle rouge :
    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
        Private Sub StartCur()
     
            Dim bmCur As New Bitmap(100, 100)
            Dim g As Graphics = Graphics.FromImage(bmCur)
            g.FillRectangle(Brushes.Transparent, 0, 0, 100, 100)
            g.DrawRectangle(Pens.Red, 0, 0, 60, 30)
            Dim ptrCur As IntPtr = bmCur.GetHicon
     
            Dim IconInfo As IconInfo = New IconInfo()
            Dim CursorPtr As IntPtr
     
            'This will set the hbmMask and Color fields of the
            'IconInfo structure
            GetIconInfo(ptrCur, IconInfo)
     
            'Now you can set the x and y hotspot
            IconInfo.xHotspot = 0
            IconInfo.yHotspot = 0
            IconInfo.fIcon = False 'True for Icon; False for cursor
     
            'Get a handle for the cursor
            CursorPtr = CreateIconIndirect(IconInfo)
     
            'Now create the cursor from the handle
            Me.Cursor = New Cursor(CursorPtr)
     
     
        End Sub
    En faisant appel aux DLL non managées suivantes :
    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
        Private Structure IconInfo
            Public fIcon As Boolean
            Public xHotspot As Integer
            Public yHotspot As Integer
            Public hbmMask As IntPtr
            Public hbmColor As IntPtr
        End Structure
     
        <System.Runtime.InteropServices.DllImport("user32.dll")> _
        Private Shared Function GetIconInfo(ByVal hIcon As IntPtr, ByRef pIconInfo As IconInfo) As Boolean
        End Function
     
        <System.Runtime.InteropServices.DllImport("user32.dll")> _
        Private Shared Function CreateIconIndirect(ByRef icon As IconInfo) As IntPtr
        End Function
    Enfin rappeler le curseur par défaut, à la fin du Drag and Drop :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Private Sub pictureBox_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs)
     
            ' Corps de la procédure ...
            picbox.Invalidate()
            Me.Cursor = Cursors.Default
        End Sub

Discussions similaires

  1. Insertion d'une vidéo qui s'affiche sous mon image de fond
    Par The_TooNZ dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 21/01/2009, 16h25

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