2009-11-12 1 views
1

En utilisant le code ci-dessous:Ouvrez un formulaire avec Form.Show: le premier clic de la souris est ignoré. Winforms, .Net

Private Sub ShowDropDown() 
    Using f As New DropDownForm 
     f.Visible = True 
     Do While f.Visible 
      Application.DoEvents() 
      // Call to not take up 100% resources 
     Loop 
    End Using 
End Sub 

Si la méthode ShowDropDown est appelée par autre chose qu'un bouton clic, puis le premier clic de souris dans la DropDownForm est ignorée. Ainsi, s'il a été appelé à la suite d'un clic PictureBox ou d'un clic sur un formulaire, il est ignoré.

je peux résoudre le problème en procédant comme suit:

Private Sub ShowDropDown() 
    Using f As New DropDownForm 
     f.Visible = True 
     Dim capture As IntPtr = GetCapture() 
     If (capture <> IntPtr.Zero) Then 
      SendMessage(New HandleRef(Nothing, capture), &H1F, IntPtr.Zero, IntPtr.Zero) 
      ReleaseCapture() 
     End If 
     Do While f.Visible 
      Application.DoEvents() 
     Loop 
    End Using 
End Sub 

Ce fut une supposition, après avoir regardé la méthode Form.ShowDialog dans le réflecteur.

Ma question est la suivante: y a-t-il un appel géré que je peux faire pour obtenir le même résultat, et que fait un clic sur un bouton pour que les autres ne le fassent pas? ETA: Le problème ne se produit pas si j'ouvre le formulaire à l'aide d'une clé.

+0

Pour votre information - Vous pouvez utiliser Thread.Sleep (0) comme alternative à Application.DoEvents() pour arrêter la CPU 100% ... Application.DoEvents() pourrait vous donner des effets secondaires que vous faites ne veut pas. –

+0

Je ne sais pas ce qui est mieux, mais j'utilise Application.DoEvents(), suivi de MsgWaitForMultipleObjectsEx (0, IntPtr.Zero, 250, & HFF, 4). C'est ainsi que le PropertyGrid le gère. – Jules

Répondre

2

Oui, la capture de souris est votre problème. Vous pouvez le résoudre en définissant explicitement la propriété Control.Capture sur false. Par exemple:

private void pictureBox1_Click(object sender, EventArgs e) { 
     pictureBox1.Capture = false; 
     ShowDropDown(); 
    } 
+0

Merci pour cela, je pensais qu'il y aurait un moyen plus simple. – Jules

Questions connexes