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 :

Utiliser Capture pour PictureBox


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 79
    Points : 48
    Points
    48
    Par défaut Utiliser Capture pour PictureBox
    Bonjour à tous !

    Programme en VB.NET Visual Studio Community 2020

    Mon programme (Jeu de Cartes) consiste à déplacer une carte(PictureBox) vers une autre carte(PictureBox)
    En utilisant les fonctions Drag'Drop, pas de problème tout fonctionne bien la carte est bien déplacée vers l'autre
    carte. Mais le déplacement de la carte (via la souris) se fait avec un icône de déplacement et non la carte elle-même.
    Donc pour déplacement réellement la carte de manière visuelle il existe une API qui le fait très bien : ReleaseCapture()
    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
     
        Public Sub Cartes_MouseMove(sender As Object, e As MouseEventArgs)
            Dim Larg = sender.Width : Dim Haut = sender.Height : Dim Ws = Me.ClientSize.Width : Dim Hs = Me.ClientSize.Height
            Dim Largeur = sender.Width : Hauteur = sender.Height : Dim L = sender.Left : Dim T = sender.Top
            Dim lHwnd As IntPtr
            lHwnd = sender.Handle
            If lHwnd = 0 Then Exit Sub
            Me.Cursor = Cursors.Hand
            ReleaseCapture()
            If L < Cadre_Boutons.Left + Cadre_Boutons.Width Then
                sender.Left = Cadre_Boutons.Left + Cadre_Boutons.Width
            ElseIf L > Ws - Largeur Then
                sender.Left = Ws - Larg
            ElseIf T < Cadre_Boutons.Top Then
                sender.Top = Cadre_Boutons.Top
            ElseIf T > Hs - Haut Then
                sender.Top = Hs - Haut
            End If
            SendMessage(lHwnd, &HA1, 2, 0&)
       End Sub
    Avec cette fonction le déplacement de la carte se fait très bien avec la souris.
    Mais comment faire pour tester lorsque la carte déplacée touchera une autre carte
    ce que faisait très bien le drag n' drop(voir ci-après) parce que le Drag And Drop
    fournit une valeur Source et C0ible (DragEnter) ce que ne fait pas Capture().

    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
     
        Public Sub Cartes_MouseMove(sender As Object, e As MouseEventArgs)
            If m_MouseIsDown Then Source.DoDragDrop(Source, DragDropEffects.Move) : m_MouseIsDown = False
        End Sub
     
    Public Sub Cartes_DragEnter(sender As Object, e As DragEventArgs)
            If TypeOf (sender) Is PictureBox Then
                If Test_Tapis(Source, sender) Then          ' Si la Carte va sur le Tapis inclus une Case-vide et sur joueur
                    e.Effect = DragDropEffects.Move
                End If
            Else
                e.Effect = DragDropEffects.None
            End If
        End Sub
     
        Public Sub Cartes_DragDrop(sender As Object, e As DragEventArgs)
            If Mid(sender.name, 5, 1) = "1" Or Mid(sender.name, 5, 1) = "0" Then Exit Sub
            Create_Carte(sender)                                    ' on crée la carte du déplacement sur le Tapis
            If Flag Then
                Flag = False : Change()                             ' on passe la main à l'ordinateur ou au joueur suivant
            End If
        End Sub
    J'espère avoir Clair dans mon problème et que quelqu'un pourra m'apporter la solution
    D'avance Merci !

  2. #2
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    Bonjour

    Citation Envoyé par Paounet Voir le message
    Bonjour à tous !

    Programme en VB.NET Visual Studio Community 2020

    Mon programme (Jeu de Cartes) consiste à déplacer une carte(PictureBox) vers une autre carte(PictureBox)
    En utilisant les fonctions Drag'Drop, pas de problème tout fonctionne bien la carte est bien déplacée vers l'autre
    carte. Mais le déplacement de la carte (via la souris) se fait avec un icône de déplacement et non la carte elle-même.

    .........
    D'avance Merci !
    Bah ,la clé est sous le paillasson, Caramba, à condition de regarder dessous.
    Dans les évents liés Glisser Déplacer dont le méconnu & "secret" GiveFeedback

    code exemple avec un Form avec un Panel ou sont droppées 5 rangées de 5 cartes simulant un jeu de dames .
    code behind.vb
    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
     
    Public Class FormCarte
        Private MyCustomCursor As Cursor
        Private ListCartes As New List(Of PictureBox)
        Private pnlCarte As Panel
        Private sizePanel As Integer
        Private NbRanges As Integer = 5
        Private margeRange As Integer = 50 'suivant X et Y
     
        Private N As Integer = NbRanges - 1
        Private widthCarte As Integer = 50
        Private spacing As Integer = 10
     
        Private Sub FormCarte_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            pnlCarte = New Panel
            sizePanel = NbRanges * (widthCarte + spacing + margeRange)
            pnlCarte.Size = New Size(sizePanel, sizePanel)
            pnlCarte.MaximumSize = New Size(sizePanel, sizePanel)
            pnlCarte.MinimumSize = MaximumSize
            pnlCarte.BackColor = Color.LightGray
            pnlCarte.BorderStyle = BorderStyle.FixedSingle
            Me.Controls.Add(pnlCarte)
            CreateBoard()
        End Sub
        Private Sub CreateBoard()
            Dim X, Y As Integer
     
     
     
            ListCartes.Clear()
            pnlCarte.Controls.Clear()
     
            Dim carte As PictureBox
            For row As Integer = N To 0 Step -1
                For col As Integer = N To 0 Step -1
                    X = margeRange + col * (widthCarte + spacing)
                    Y = margeRange + row * (widthCarte + spacing)
                    carte = New PictureBox()
                    carte.Name = "PIC" + row.ToString() + col.ToString()
                    carte.Size = New Size(widthCarte, widthCarte)
                    Select Case row
                        Case 0, 1
                            carte.Image = GetImage(carte, Color.Blue)
                        Case 2
                            carte.Image = GetImage(carte, Color.PaleGoldenrod)
                        Case 3, 4
                            carte.Image = GetImage(carte, Color.Green)
                    End Select
                    carte.BorderStyle = Windows.Forms.BorderStyle.FixedSingle
                    carte.Location = New Point(X, Y)
     
     
                    carte.AllowDrop = True
                    AddHandler carte.MouseDown, AddressOf carte_MouseDown
                    'secret 
                    AddHandler carte.GiveFeedback, AddressOf carte_GiveFeedBack
                    AddHandler carte.MouseUp, AddressOf carte_MouseUp
     
                    AddHandler carte.DragOver, AddressOf pnl_DragOver
                    AddHandler carte.DragEnter, AddressOf pnl_DragEnter
                    AddHandler carte.DragDrop, AddressOf pnl_DragDrop
     
                    ListCartes.Add(carte)
     
     
     
     
                Next
            Next
     
            pnlCarte.Controls.AddRange(ListCartes.ToArray)
     
        End Sub
        Private Function GetImage(pic As PictureBox, clr As Color) As Bitmap
            Dim bmp As New Bitmap(pic.Width, pic.Height)
            Using grfx As Graphics = Graphics.FromImage(bmp)
                grfx.Clear(clr)
                grfx.DrawString(pic.Name, pic.Font, Brushes.White, 0, 0)
            End Using
            Return bmp
        End Function
        'Private pic As PictureBox
        Private Sub carte_MouseDown(sender As Object, e As MouseEventArgs)
            Dim pic As PictureBox = CType(sender, PictureBox)
            pic.DoDragDrop(pic, DragDropEffects.Move)
        End Sub
        'secret
        Private Sub carte_GiveFeedBack(sender As Object, e As GiveFeedbackEventArgs)
            Dim pic As PictureBox = CType(sender, PictureBox)
            e.UseDefaultCursors = False
            If ((e.Effect Or DragDropEffects.Move) = DragDropEffects.Move) Then
                Dim bmp As Bitmap = New Bitmap(pic.Image, pic.Width, pic.Height)
                MyCustomCursor = New Cursor(bmp.GetHicon())
                Cursor.Current = MyCustomCursor
            Else
                Cursor.Current = Cursors.Default
            End If
        End Sub
     
        Private Sub carte_MouseUp(sender As Object, e As MouseEventArgs)
            Cursor.Current = Cursors.Default
        End Sub
     
        Private Sub pnl_DragOver(sender As System.Object, e As System.Windows.Forms.DragEventArgs)
            If Not (e.Data.GetDataPresent(GetType(PictureBox))) Then
     
                e.Effect = DragDropEffects.None
                Return
            End If
        End Sub
     
        Private Sub pnl_DragEnter(sender As System.Object, e As System.Windows.Forms.DragEventArgs)
            If e.Data.GetDataPresent(GetType(PictureBox)) Then
                e.Effect = DragDropEffects.Move
            End If
        End Sub
     
        Private Sub pnl_DragDrop(sender As System.Object, e As System.Windows.Forms.DragEventArgs)
            Dim picDst As PictureBox = CType(sender, PictureBox)
            If e.Data.GetDataPresent(GetType(PictureBox)) Then
     
                Dim picSrc As PictureBox = CType(e.Data.GetData(GetType(PictureBox)), PictureBox)
     
                ' Perform drag-and-drop, depending upon the effect.
                If (e.Effect = DragDropEffects.Move) Then
     
     
                    '' Insert the item.
                    'Dim pos As New Point(e.X, e.Y)
     
                    'pos = pnlCarte.PointToClient(pos)
                    'picSource.Location = pos
                    SwapCartes(picDst, picSrc)
                    Cursor.Current = Cursors.Default
                End If
            End If
        End Sub
        Private Sub SwapCartes(dst As PictureBox, src As PictureBox)
            Dim tempLoc As Point = src.Location
            src.Location = dst.Location
            dst.Location = tempLoc
     
     
        End Sub
     
     
     
    End Class
    Bon code...

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

Discussions similaires

  1. Utiliser DirectShow pour de la capture vidéo et audio dans VB6
    Par Chekov dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 18/04/2008, 10h17
  2. [USB] [JNI] Utiliser JNI pour accéder aux ports USB
    Par Javatator dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 27/10/2005, 06h40
  3. Utiliser Alien pour convertir un deb en rpm
    Par aA189 dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 10/10/2004, 15h41
  4. Utiliser hylafax pour envoyer des fax
    Par ggnore dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 08/07/2004, 21h57
  5. utiliser "if" pour faire deux actions differente
    Par vampyer972 dans le forum C
    Réponses: 2
    Dernier message: 09/05/2004, 10h12

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