フォーカスが当たらないボタンを作る

今回は、SNLMの中で、スクリーンキーボードを作りたかったので、作ってみようと思ったのですが、通常のボタンだと、残念ながら作れません。

そもそも今回作っているスクリーンキーボードは、focusが当たっているコントロールから取得します。しかし、focusをあたったままにしたいtextboxと、勝手にfocusがあたる通常のbuttonでは、確実に入力時にbuttonにフォーカスが当たっていると認識され、絶対入力することができません。これには、通常のボタンではなく、少しトリックが必要となります。

今回作るのは「カスタムコントロール」というものです。
FRMCも実はこれを採用しています。
まず、プロジェクト→ユーザーコントロールの追加→クラス→作成で、ここからコードを入力します。

Class NFButton
    Inherits Button
    Sub New()
        SetStyle(ControlStyles.Selectable, False)
    End Sub
End Class

これだけです。ここで一旦実行してください。これらの追加をVS本体に適用するためです。

すると、ツールボックスの中に「NFButton」というコントロールが追加されているはずなので、試しに追加してみてください。何の変哲もない「ただのボタン」ですね。まあ、おそらく最初なので「NFButton1」とか、違う名前ぐらいはついていると思います。それでは、このボタンを配置して、Textboxも配置してみましょう。配置が終わったら、試しに実行してみましょう。

押した後は、Textboxにフォーカスを当てたまま、ボタンを押してみてください。
どうですか?フォーカスが移らないはずです。(絶対ではないですが)

これで、「フォーカスが当たらないボタン、NFButton」、無事完成です。
用途としては、Focusが当たってほしくない時、例にすれば最初も言いましたがスクリーンキーボードとかで使えます。ちなみに、上記のコードを改造すれば、Pictureboxでも、Comboboxでも、Checkboxでも可能です。応用できることには間違いなしです。

おわり

※NFButtonという名前はNoFocusを略したNFとButtonでNFButtonという名称になりました。
※こんな面倒なことをしなくてもLabelコントロールでできますが、挙動や仕様が異なるため、Buttonコントロールにこだわる人はこの方法を使います。