2017-03-14 3 views
1

Je suis tout nouveau à VB- dans le code suivant, j'ai cette erreur. La clause Handles nécessite une variable WithEvents définie dans le type conteneur ou l'un de ses types de base. (BC30506)MouseDown sur l'erreur Picturebox: clause Handles nécessite un WithEvents

Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown 

Fondamentalement, je suis en train de déplacer un objet zone d'image avec l'événement mousedown selon cet extrait

Private Offset As Size 'used to hold the distance of the mouse`s X and Y position to the picturebox Left and Top postition 

Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown 
    Dim ptc As Point = Me.PointToClient(MousePosition) 'get the mouse position in client coordinates 
    Offset.Width = ptc.X - PictureBox1.Left 'get the width distance of the mouse X position to the picturebox`s Left position 
    Offset.Height = ptc.Y - PictureBox1.Top 'get the height distance of the mouse Y position to the picturebox`s Top position 
End Sub 

Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove 
    If e.Button = MouseButtons.Left Then 'make sure the left mouse button is down first 
     Dim ptc As Point = Me.PointToClient(MousePosition) 'get the mouse position in client coordinates 
     PictureBox1.Left = ptc.X - Offset.Width 'set the Left position of picturebox to the mouse position - the offset width distance 
     PictureBox1.Top = ptc.Y - Offset.Height 'set the Top position of picturebox to the mouse position - the offset height distance 
    End If 
End Sub 

J'ai lu les questions et ne peut pas sembler saisir exactement pourquoi cette le code ne fonctionne pas.

+2

Vous avez créé le PictureBox en code, n'est-ce pas? – Plutonix

Répondre

0

Pour utiliser votre code, vous devez déclarer PictureBox1 que Friend WithEvents comme chaque contrôle créé par le designer:

Friend WithEvents PictureBox1 

Mais vous pouvez utiliser Friend uniquement au niveau du module, interface, ou le niveau d'espace de noms. Par conséquent, le contexte de déclaration d'un élément Friend doit être un fichier source, un espace de noms, une interface, un module, une classe ou une structure; ça ne peut pas être une procédure.

Si vous ne pouvez pas créer vos contrôles à l'exécution avec cette déclaration, vous devez utiliser AddHandler pour associer un événement à un gestionnaire d'événements.

Par exemple:

AddHandler Me.PictureBox1.MouseDown, AddressOf PictureBox1_MouseDown 
AddHandler Me.PictureBox1.MouseMove, AddressOf PictureBox1_MouseMove 

Vous devez également supprimer Handles de déclaration de procédure; i.e. .:

Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 
    'your code here 
End Sub 

CONSEIL: si vous voulez, vous pouvez utiliser un meilleur nom pour votre gestionnaire d'événements au lieu du nom par défaut; i.e .:

AddHandler Me.PictureBox1.MouseMove, AddressOf movePictureBoxOnMouseLeftClick 

Private Sub movePictureBoxOnMouseLeftClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) 
    'your code here 
End Sub 
+0

D'accord, j'ai compris que ça fonctionnait - MAIS je ne comprends pas ce concept du tout. –

+0

ajouté quelques explications et un lien vers msdn. – tezzo