3

タイトルにあるように、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

テキスト ボックスの動作は、同じ問題の症状です。何かがマウスダウン通知を飲み込んでいます。コードスニペットでは説明されていません。フォームは実際に、フォームをアクティブにするマウス クリックを飲み込みますが、これは 1 回限りの動作であり、TopLevel プロパティを False に設定するとオフになります。

あまり残っていません。候補の 1 つは Control.Capture プロパティです。このプロパティは、マウスがどこに移動してもボタンが MouseUp イベントを認識できるように、ボタンの MouseDown イベントでオンにされます。それも1回限りの効果です。MouseDown イベントでフォーカスを設定するコントロールに注意してください。

もう 1 つは、WM_LBUTTONDOWN メッセージを食べているフォーム内のある種の IMessageFilter コードです。

于 2010-05-20T16:37:27.693 に答える