Windows窗体:无法单击以将MaskedTextBox聚焦在非TopLevel窗体中

Ove*_*hed 2 vb.net parent-child maskedtextbox winforms

就像标题所说,我有一个Child表单,其TopLevel属性设置为False,我无法单击它包含的MaskedTextBox控件(为了引起焦点).我可以通过在键盘上使用TAB来关注它.

子窗体包含其他常规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()
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 6

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

发生这种情况是因为您使用标题栏显示表单.这说服Windows窗口管理器可以激活窗口.这实际上不起作用,它不再是顶级窗口.从标题栏可见,它永远不会被"窗口激活"颜色绘制.

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

    newReportForm.FormBorderStyle = Windows.Forms.FormBorderStyle.None
Run Code Online (Sandbox Code Playgroud)

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

    newReportForm.ControlBox = False
    newReportForm.Text = ""
Run Code Online (Sandbox Code Playgroud)

修复解决了鼠标点击问题.