1

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

一旦出现此问题,即使在关闭“麻烦”表单后它仍然存在,并且会影响随后打开的子表单。然而,如果所有的子窗体都关闭了,问题就解决了,新的子窗体运行正常——直到出现下一个“麻烦的”窗体。

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

任何建议将不胜感激。

4

1 回答 1

1

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

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

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

它基本上与确保表单 MdiParent 设置在任何导致创建表单窗口的代码(对 CreateWindow() 或 CreateWindoEX() 的 API 调用)之前设置有关。无论如何,我发现我的一些窗口在构造函数中有导致创建 API 窗口的代码。这方面的一个例子是一个带有 WebBrowser 控件的表单。我将一个 URL 传递到 Constructor 的表单中,然后将它传递给 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);
  }

希望这可以帮助...

于 2011-04-13T23:29:23.197 回答