在客户区中单击时,MDI子窗体不会激活

时间:2010-07-29 04:58:54

标签: vb.net activation mdichild

我的VB.NET应用程序支持几种MDI子窗体。某些类型,但不是其他类型,“麻烦” - 它们导致焦点机制变得奇怪。一旦打开“麻烦”的子表格,除非我点击标题栏或边框,否则任何MDI子表单都将被激活。单击客户端区域不会激活子窗体 - 其标题栏保持灰色,并且它不会接收Activate或GotFocus事件。然而,奇怪的是,点击的表单实际上会获得焦点,因为它的控件接收鼠标和键事件。只有Z顺序和突出显示不会改变。

一旦这个问题发展起来,即使在“麻烦”的形式被关闭之后它仍然存在,并且它影响随后打开的儿童形式。但是,如果所有子表单都已关闭,则问题会清除,并且新的子表单会正常运行 - 直到出现下一个“麻烦”表单。

我不知道为什么有一种儿童形式很麻烦,而另一些则不然。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

我有点迟到了,但我遇到了上述相同的症状。我也有一些形式导致了这个问题而其他形式没有。

我找到了一个解释问题的链接,并将这个概念应用到我的表单中。

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

它基本上与确保在任何导致创建窗体窗口的代码(对CreateWindow()或CreateWindoEX()的API调用之前)设置MdiParent形式有关。无论如何,我发现我的一些窗口在构造函数中有代码导致创建API窗口。一个例子是一个带有WebBrowser控件的表单。我将一个URL传递给构造函数中的表单,然后将其传递给WebBrowser.Navigate方法。在这种情况下,我的MdiChild窗口不会按预期激活。我更改了构造函数,以便保存URL并覆盖表单的CreateHandle方法,以便尽早在WebBrowser中实际设置URL。表格现在按预期激活。

  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);
  }

希望这会有所帮助......