2010-05-20 18 views
2

Comme le titre l'indique, une forme enfant est affichée avec sa propriété TopLevel définie sur False et je ne parviens pas à cliquer sur un contrôle MaskedTextBox contient (afin d'y mettre l'accent). Je peux mettre l'accent en utilisant TAB sur le clavier.Windows Forms: Impossible de cliquer pour mettre au point un MaskedTextBox dans un formulaire Non TopLevel

Le formulaire enfant contient d'autres contrôles TextBox réguliers et ceux-ci je peux cliquer pour se concentrer sans problème, bien qu'ils présentent également un comportement étrange: par exemple si j'ai une valeur dans la zone de texte et j'essaie de faire glisser de la fin de la chaîne au début, rien ne se passe. En fait, je ne peux pas utiliser ma souris pour déplacer le curseur dans le texte de la TextBox (bien que les touches fléchées du clavier fonctionnent).

Je ne m'inquiète pas trop du comportement bizarre de TextBox, mais pourquoi ne puis-je pas activer ma MaskedTextBox en cliquant dessus?

est Ci-dessous le code qui montre la forme:

Dim newReportForm As New Form 
Dim formName As String 
Dim FullTypeName As String 
Dim FormInstanceType As Type 

formName = TreeView1.SelectedNode.Name 

FullTypeName = Application.ProductName & "." & formName 

FormInstanceType = Type.GetType(FullTypeName, True, True) 

newReportForm = CType(Activator.CreateInstance(FormInstanceType), Form) 
Try 
    newReportForm.Top = CType(SplitContainer1.Panel2.Controls(0), Form).Top + 25 
    newReportForm.Left = CType(SplitContainer1.Panel2.Controls(0), Form).Left + 25 
Catch 
End Try 
newReportForm.TopLevel = False 
newReportForm.Parent = SplitContainer1.Panel2 
newReportForm.BringToFront()     
newReportForm.Show() 

Répondre

5

J'ai essayé votre code et j'ai obtenu un bon repro cette fois. Comme je l'ai mentionné dans mon post original, il s'agit en effet d'un problème d'activation de la fenêtre. Vous pouvez le voir dans Spy ++, notez les messages WM_MOUSEACTIVATE.

Cela se produit parce que vous affichez le formulaire avec une barre de légende. Cela convainc le gestionnaire de fenêtres Windows que la fenêtre peut être activée. Cela ne fonctionne pas, ce n'est plus une fenêtre de haut niveau. Visible à partir de la barre de légende, il n'est jamais dessiné avec les couleurs «activées par la fenêtre».

Vous devrez supprimer la barre de légende du formulaire. Ce qui est le mieux fait en ajoutant cette ligne à votre code:

newReportForm.FormBorderStyle = Windows.Forms.FormBorderStyle.None 

qui tournera sous la forme dans un contrôle qui est par ailleurs impossible à distinguer d'un UserControl. Vous pouvez toujours le faire distinctif en utilisant ce code à la place:

newReportForm.ControlBox = False 
    newReportForm.Text = "" 

Soit fix résout le problème de clic de souris.

+0

Vous aviez raison et ces deux suggestions corrigent le problème. Cependant, il affiche le formulaire d'une manière que nous ne voulons pas. Vraiment ce que nous essayons de faire est d'afficher ce formulaire (modelessley) dans un panneau d'un SplitContainer (de sorte que le formulaire ne soit pas déplaçable en dehors de ce panneau splitcontainer). À ce stade, je suis à peu près certain que nous y allons dans le mauvais sens et nous devrons ajuster la manière dont nous montrons le formulaire. Un grand merci pour votre aide. – Overhed

1

Le comportement de la boîte de texte est un symptôme du même problème. Quelque chose avale les notifications de la souris. Il n'est pas expliqué par votre extrait de code. En effet, les formulaires avalent le clic de la souris qui les active, mais il s'agit d'un comportement ponctuel qui est désactivé en définissant sa propriété TopLevel sur False.

Pas grand-chose. Un candidat est la propriété Control.Capture, activée à l'événement MouseDown pour un bouton afin que le bouton puisse voir l'événement MouseUp, quel que soit l'emplacement de la souris. C'est aussi un effet ponctuel. Méfiez-vous des contrôles qui définissent le focus dans un événement MouseDown.

L'autre est un type de code IMessageFilter dans votre formulaire qui mange les messages WM_LBUTTONDOWN.

+0

Merci pour votre avis Hans. Je peux contribuer que j'ai mis TopLevel à True, et le comportement étrange n'est plus présent. Je n'ai pas été en mesure de trouver des cadeaux morts de gestionnaires qui pourraient avaler l'événement, l'utilisation de la propriété Control.Capture, ou tout code IMessageFilter. Malheureusement, je n'ai pas écrit le code pour le formulaire Parent, donc il se peut que je manque quelque chose. Cela aiderait-il si j'avais posté le reste du code pour le formulaire Parent? C'est environ 300 lignes. – Overhed

+0

Douteux. Utilisez Spy ++ pour voir où va ce clic. –

+0

On dirait que le clic est tout le chemin vers le formulaire parent. Je ne suis pas sûr à 100% de ce que je recherche, mais les événements déclenchés en cliquant sur la zone de texte masquée semblent tous correspondre à ceux déclenchés lorsque vous cliquez sur une zone de texte normale (qui obtient le focus correctement). – Overhed

2

Ceci est un bug misérable et il m'a fallu beaucoup de temps pour trouver cette question. Nous faisons exactement la même chose que l'OP, en affichant un formulaire dans un conteneur divisé. Ma solution a été d'ajouter un gestionnaire d'événements à l'événement Click du MaskedTextBox:

private void MaskedTextBoxSetFocus(object sender, EventArgs e) 
    { 
     var mtb = (MaskedTextBox)sender; 
     mtb.Focus(); 
    } 

Cela fonctionne pour la MaskedTextBox mais je suis préoccupé par d'autres comportements étranges à cause de ce bug, donc je tournerai sans doute le style de bordure comme dans le réponse acceptée.

+1

Nous faisons exactement la même chose qu'une solution de contournement. Cependant, comme je suis sûr que vous l'avez remarqué, vous ne pouvez pas sélectionner le caractère sur lequel placer votre curseur lorsque vous vous concentrez. Donc, il ira à la dernière position connue chaque fois que vous cliquez. Agaçant si vous essayez de cliquer sur une partie différente du texte entré. – Overhed