3

就像标题说的那样,我显示了一个 Child 表单,它的 TopLevel 属性设置为 False,我无法单击它包含的 MaskedTextBox 控件(以便将焦点集中在它上面)。不过,我可以通过在键盘上使用 TAB 来集中注意力。

子窗体包含其他常规的 TextBox 控件,我可以毫无问题地单击这些控件来聚焦,尽管它们也表现出一些奇怪的行为:例如,如果我在 Textbox 中有一个值并且我尝试从末尾拖动单击字符串开始,没有任何反应。事实上,我根本无法使用鼠标在 TextBox 的文本中移动光标(尽管它们可以使用键盘箭头键)。

我不太担心奇怪的 TextBox 行为,但为什么我不能通过单击来激活我的 MaskedTextBox?

下面是显示表单的代码:

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()
4

3 回答 3

6

我试过你的代码,这次得到了很好的重现。正如我在原帖中提到的,这确实是一个窗口激活问题。您可以在 Spy++ 中看到这一点,注意 WM_MOUSEACTIVATE 消息。

发生这种情况是因为您显示带有标题栏的表单。这使 Windows 窗口管理器相信该窗口可以被激活。这实际上不起作用,它不再是顶级窗口。从标题栏中可见,它永远不会用“窗口激活”颜色绘制。

您必须从表单中删除标题栏。最好将此行添加到您的代码中:

    newReportForm.FormBorderStyle = Windows.Forms.FormBorderStyle.None

这会将表单转换为与 UserControl 无法区分的控件。您仍然可以使用以下代码使其与众不同:

    newReportForm.ControlBox = False
    newReportForm.Text = ""

任一修复都可以解决鼠标单击问题。

于 2010-06-19T14:11:28.710 回答
3

这是一个悲惨的错误,我花了很长时间才找到这个问题。我们正在做与 OP 完全相同的事情,在拆分容器中显示一个 Form。我的解决方法是在 MaskedTextBox 的 Click 事件中添加一个事件处理程序:

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

这适用于 MaskedTextBox,但我担心由于这个错误导致的其他奇怪行为,所以我可能会按照接受的答案设置边框样式。

于 2010-06-23T18:30:12.097 回答
1

文本框行为是同一问题的症状。某些东西正在吞噬鼠标按下通知。您的代码段没有解释它。表单确实会吞下激活它们的鼠标单击,但这是一次性行为,通过将其 TopLevel 属性设置为 False 将其关闭。

剩下的不多了。一个候选者是 Control.Capture 属性,该属性在按钮的 MouseDown 事件中打开,以便无论鼠标移动到哪里,按钮都可以看到 MouseUp 事件。这也是一次性的效果。注意在 MouseDown 事件中设置焦点的控件。

另一种是表单中的某种 IMessageFilter 代码,它正在吃 WM_LBUTTONDOWN 消息。

于 2010-05-20T16:37:27.693 回答