我的VB.NET应用程序支持几种MDI子窗体。某些类型,但不是其他类型,“麻烦” - 它们导致焦点机制变得奇怪。一旦打开“麻烦”的子表格,除非我点击标题栏或边框,否则任何MDI子表单都将被激活。单击客户端区域不会激活子窗体 - 其标题栏保持灰色,并且它不会接收Activate或GotFocus事件。然而,奇怪的是,点击的表单实际上会获得焦点,因为它的控件接收鼠标和键事件。只有Z顺序和突出显示不会改变。
一旦这个问题发展起来,即使在“麻烦”的形式被关闭之后它仍然存在,并且它影响随后打开的儿童形式。但是,如果所有子表单都已关闭,则问题会清除,并且新的子表单会正常运行 - 直到出现下一个“麻烦”表单。
我不知道为什么有一种儿童形式很麻烦,而另一些则不然。
任何建议都将不胜感激。
答案 0 :(得分:1)
我有点迟到了,但我遇到了上述相同的症状。我也有一些形式导致了这个问题而其他形式没有。
我找到了一个解释问题的链接,并将这个概念应用到我的表单中。
它基本上与确保在任何导致创建窗体窗口的代码(对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);
}
希望这会有所帮助......