2010-07-29 5 views
1

Mon application VB.NET prend en charge plusieurs types de formulaires enfants MDI. Certains types, mais pas d'autres, sont «gênants»: ils provoquent l'étrangeté du mécanisme de mise au point. Une fois qu'un formulaire enfant 'gênant' a été ouvert, AUCUN des formulaires enfants MDI ne sera activé à moins que je clique sur la barre de titre ou la bordure. Cliquer dans la zone cliente n'active pas le formulaire enfant - sa barre de titre reste grise et ne reçoit pas les événements Activate ou GotFocus. Étrangement, cependant, le formulaire cliqué reçoit effectivement le focus, car ses contrôles reçoivent les événements de la souris et de la clé. Seul l'ordre Z et la surbrillance ne changent pas.Le formulaire enfant MDI ne s'active pas lorsque vous cliquez dans la zone client

Une fois ce problème développé, il persiste même après la fermeture de la forme «gênante», et il affecte les formulaires enfants qui sont ouverts par la suite. Cependant, si TOUS les formulaires enfant sont fermés, le problème disparaît et les nouvelles formes enfants se comportent normalement jusqu'à ce que le prochain formulaire "gênant" apparaisse. Je n'ai aucune idée pourquoi un type de forme enfant est gênante, et d'autres ne le sont pas.

Toutes les suggestions seraient grandement appréciées.

+1

S'il vous plaît poster un code lié à la création des formes et des événements gênants LostFocus/GotFocus. –

Répondre

1

Je suis un peu en retard dans ce processus, mais je faisais l'expérience des mêmes symptômes décrits ci-dessus. J'ai aussi eu quelques formes qui ont causé ce problème et d'autres qui ne l'ont pas fait.

J'ai trouvé un lien expliquant le problème et appliquant le concept à mes formulaires.

http://www.pcreview.co.uk/forums/mdi-child-forms-functionality-does-not-work-correctly-windows-f-t2894221.html

Il a essentiellement à voir avec faire en sorte que les formes MdiParent est défini avant tout code qui provoque la fenêtre du formulaire à créer (l'appel API à CreateWindow() ou CreateWindoEX()). Quoi qu'il en soit, j'ai trouvé que quelques-unes de mes fenêtres avaient du code dans les constructeurs qui provoquait la création de la fenêtre de l'API. Un exemple de ceci était un formulaire avec un contrôle WebBrowser dessus. J'ai passé une URL dans le formulaire sur le constructeur qui l'a passé dans la méthode WebBrowser.Navigate. Dans ce scénario, mes fenêtres MdiChild ne s'active pas comme prévu. J'ai modifié le constructeur de manière à enregistrer l'URL et à remplacer la méthode CreateHandle du formulaire pour définir l'URL dans WebBrowser le plus tôt possible. Les formulaires s'activent maintenant comme prévu.

private string _URL = ""; 

    public frmReportServer(String URL, String Title) : this() { 
    _URL = URL; 
    this.Text = Title; 
    } 

    protected override void CreateHandle() { 
    base.CreateHandle(); 
    if (_URL != "") wbReports.Navigate(URL, false); 
    } 

Hope this helps ...

+0

Scott: Merci beaucoup - vous avez raison. Dans mon cas, il s'agit d'un programme VB-NET converti à partir de VB6 et la conversion a appelé Me.Show dans le constructeur du formulaire. Je l'ai sorti, et tout va bien. – tarik

Questions connexes