API DllImport("user32.dll") et Handle

cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 - 4 janv. 2013 à 18:28
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 - 5 janv. 2013 à 16:24
Bonjour a tous (et bonne annee),

Pourquoi je n'arrive pas a faire marcher la Sub 'DPictureMouseClick' avec le code ci-dessous?
NOTE: Code facile a tester => mettre un bouton Button1 sur la Form1, et c'est pret.

Imports System.Runtime.InteropServices

Public Class Form1

    Private lastMouseLocation As New Point

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim pctDPicture As New PictureBox
        pctDPicture.SizeMode = PictureBoxSizeMode.StretchImage
        pctDPicture.BackColor = Color.Black
        pctDPicture.Size = New Size(150, 100)
        pctDPicture.Location = New Point(20, 20)
        AddHandler pctDPicture.MouseMove, AddressOf DPictureMouseMove
        AddHandler pctDPicture.MouseDown, AddressOf DPictureMouseDown
        AddHandler pctDPicture.MouseClick, AddressOf DPictureMouseClick
        Me.Controls.Add(pctDPicture)
        pctDPicture.BringToFront()
    End Sub

    ' ====================================================================================================
    ' ... with the help of API user32.dll ...
    ' See the link http://www.vbforums.com/showthread.php?t=568015
    ' ====================================================================================================

    <DllImport("user32.dll")> _
    Public Shared Function ReleaseCapture() As Boolean
    End Function

    <DllImport("user32.dll")> _
    Public Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    End Function

    Private Const WM_NCLBUTTONDOWN As Integer = &HA1
    Private Const HTCAPTION As Integer = 2
    Private Const HTLEFT As Integer = 10
    Private Const HTRIGHT As Integer = 11
    Private Const HTTOP As Integer = 12
    Private Const HTTOPLEFT As Integer = 13
    Private Const HTTOPRIGHT As Integer = 14
    Private Const HTBOTTOM As Integer = 15
    Private Const HTBOTTOMLEFT As Integer = 16
    Private Const HTBOTTOMRIGHT As Integer = 17

    Private Sub MoveControl(ByVal hWnd As IntPtr)
        ReleaseCapture()
        SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0)
    End Sub

    ' Width of the 'resizable border' (or the area where you can resize)
    Private Const BorderWidth As Integer = 8

    Private Sub DPictureMouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        ' Movement of a dynamic PictureBox on SpliContainer1.Panel2
        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
            DirectCast(sender, PictureBox).Location = pt
            DirectCast(sender, PictureBox).BringToFront()
        End If
    End Sub

    Private Sub DPictureMouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        ' Handle management (See 'Resizing Picture' REGION for variables and methods)
        If e.Button = Windows.Forms.MouseButtons.Left Then
            MoveControl(DirectCast(sender, PictureBox).Handle)
        End If
        ' Last Mouse location
        lastMouseLocation = e.Location
    End Sub

    'Private Sub DPictureMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    Private Sub DPictureMouseClick(ByVal sender As Object, ByVal e As System.EventArgs)
        Beep()
        ' Selection of a PictureBox by clicking on it
        DirectCast(sender, PictureBox).BorderStyle = BorderStyle.Fixed3D
        DirectCast(sender, PictureBox).BringToFront()
    End Sub

End Class


Si je met en commentaire les lignes suivantes, ca marche:
        AddHandler pctDPicture.MouseMove, AddressOf DPictureMouseMove
        AddHandler pctDPicture.MouseDown, AddressOf DPictureMouseDown


En fait, je me demande si ce n'est pas lie a l'API et particulierement la fonction MoveControl via le Handle.
Mais, je ne vois pas comment resoudre le probleme.

BIEN SUR, il y a moyen de faire autrement sans passer par l'API, mais j'ai besoin de l'API pour la partie ResizeControl (voir le lien dans le code pour plus de details).
En fait, je presente ici un code simplifie pour mieux comprendre le probleme. Il suffit de le tester.

Merci,
A+
JLuc01
A voir également:

7 réponses

Utilisateur anonyme
4 janv. 2013 à 19:41
Bonsoir,
Intéresse toi à l'article msdn sur l'ordre des événements.
Et ce n'est pas aussi simple que ça en a l'air.
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
4 janv. 2013 à 21:02
Bonsoir,

Je ne suis pas sur de comprendre l'interet de cet article dans mon cas.

Car, si j'utilise le code simplifie suivant (sans API), ca marche:
Mais, malheureusement, j'ai besoin de cet API pour autre chose.

Imports System.Runtime.InteropServices

Public Class Form1

    Private lastMouseLocation As New Point

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim pctDPicture As New PictureBox
        pctDPicture.SizeMode = PictureBoxSizeMode.StretchImage
        pctDPicture.BackColor = Color.Black
        pctDPicture.Size = New Size(150, 100)
        pctDPicture.Location = New Point(20, 20)
        AddHandler pctDPicture.MouseMove, AddressOf DPictureMouseMove
        AddHandler pctDPicture.MouseDown, AddressOf DPictureMouseDown
        AddHandler pctDPicture.MouseClick, AddressOf DPictureMouseClick
        Me.Controls.Add(pctDPicture)
        pctDPicture.BringToFront()
    End Sub

    Private Sub DPictureMouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        ' Movement of a dynamic PictureBox
        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
            DirectCast(sender, PictureBox).Location = pt
            DirectCast(sender, PictureBox).BringToFront()
        End If
    End Sub

    Private Sub DPictureMouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        ' Last Mouse location
        lastMouseLocation = e.Location
    End Sub

    'Private Sub DPictureMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
    Private Sub DPictureMouseClick(ByVal sender As Object, ByVal e As System.EventArgs)
        Beep()
        ' Selection of a PictureBox by clicking on it
        DirectCast(sender, PictureBox).BorderStyle = BorderStyle.Fixed3D
        DirectCast(sender, PictureBox).BringToFront()
    End Sub

End Class


De mon point de vue (amateur en VBnet), le probleme vient du fait que j'utilise ces 2 lignes dans la fonction MoveControl:
ReleaseCapture()
SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0)


J'ai l'impression que 'le Handle n'ai pas libere', si toutefois cette phrase signifie quelquechose...

A+
JLuc01
0
Utilisateur anonyme
4 janv. 2013 à 21:59
J'ai du mal à comprendre ce que tu souhaites faire au final.
Si c'est pour redimensionner un picturebox, tu peux simplement faire comme ceci :
Public Class Form1
    Dim WithEvents pctBox As New PictureBox With {.BackColor Color.Red, .Parent Me, .Bounds = New Rectangle(10, 10, 200, 30)}

    Private Sub pctBox_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pctBox.MouseClick
        Dim rect As Rectangle = pctBox.Bounds
        pctBox.Bounds = Rectangle.Inflate(rect, 3, 3)
        pctBox.Location = New Point(rect.Left, rect.Top)
    End Sub
End Class
0
Utilisateur anonyme
4 janv. 2013 à 22:06
Pour agrandir et déplacer :
Public Class Form1
    Dim WithEvents pctBox As New PictureBox With {.BackColor Color.Red, .Parent Me, .Bounds = New Rectangle(10, 10, 200, 30)}
    Dim pt As Point

    Private Sub pctBox_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pctBox.MouseDown
        If e.Button = Windows.Forms.MouseButtons.Right Then
            'agrandir
            Dim rect As Rectangle = pctBox.Bounds
            pctBox.Bounds = Rectangle.Inflate(rect, 3, 3)
            pctBox.Location = New Point(rect.Left, rect.Top)
        ElseIf Windows.Forms.MouseButtons.Left Then
            'déplacement
            pt = e.Location
        End If
    End Sub


    Private Sub pctBox_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pctBox.MouseMove
        If e.Button = Windows.Forms.MouseButtons.Left Then
            'déplacement
            pctBox.Location = Point.Subtract(Cursor.Position, _
                                                 New Size(Me.Left + pt.X, _
                                                 Me.Top + pt.Y + SystemInformation.CaptionHeight))
        End If
    End Sub
End Class
0

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

Posez votre question
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
5 janv. 2013 à 12:29
Re-bonjour,

Et merci pour ce bout de code. Ca marche.
Je devrais pouvoir l'adapter a ce que je veux faire, et en plus en m'eloignant de l'API.
Cependant, cette reponse est plus adaptee a mon message precedent dans le forum, intitule 'PictureBox.Resize'.

MAIS ICI, la question originale etait: pourquoi le "AddHandler pctDPicture.MouseClick, AddressOf DPictureMouseClick" ne marche pas dans mon code du debut? Pour le tester, un simple Copy/Paste et on remarque que la function "DPictureMouseClick" ne marche pas: pas de 'Beep' et pas de changement de 'Border.Style'.

Merci,
A+
JLuc01
0
Utilisateur anonyme
5 janv. 2013 à 15:51
Je t'ai répondu avec le lien ci-dessus. (qui en contient d'autres mais que tu n'as visiblement pas suivi)
Bonne chance.
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
5 janv. 2013 à 16:24
Salut,

Desole, j'ai regarde ce lien, mais probablement pas suffisament.
Je vais le lire plus attentivement pour essayer de comprendre ce probleme, car si tu insiste sur ce point, c'est que la reponse est la.

Pour la methode Rectangle.Inflate(..., je commence a mieux comprendre, meme si j'ai quelques soucis que j'espere contourner bientot.
Par exemple reduire le cote X de l'image sans faire bouger le reste.

Merci encore.

A+
JLuc01
0
Rejoignez-nous