none
Button上のでの左右矢印キーを制御するクラス作成 RRS feed

  • 質問

  • お世話になります。

    VB2008でButtonを継承したカスタムコンポーネントを作成しています。
    フォームに作成したボタンをボタン1、ボタン2、ボタン3の順で横並びに
    貼り付け矢印キーによりボタンの移動を行いたいと思っております
    その際、上下矢印は無効にし、左右矢印のみの移動を考えております。

    結果、実現できたのですが、問題にぶつかってしまいました
    1.ボタン1で左矢印を押した場合ボタン3に移ってしまう。
    2.ボタン3で右矢印を押した場合ボタン1に移ってしまう。
    上記の現象を止めたいと思います。

    ボタンは3個とは限りません、出来ればDLL化し使いまわししたいと思います。

    画面の先頭(タブインデックス0)か画面の最終(最後のタブインデックス)で判定は可能
    なのかとか、いろいろ試したのですがうまく動作しません何か良い方法が
    あれば教えて頂ければと思います、宜しくお願いします。

    Public Class btnStandard
        Protected Overrides Function ProcessDialogKey(ByVal keyData As Keys) As Boolean
            Select Case keyData
                Case Keys.Down
                    'Me.TopLevelControl.SelectNextControl(Me, True, True, True, True)
                    Return True
                Case Keys.Right
                    Me.TopLevelControl.SelectNextControl(Me, True, True, True, True)
                Case Keys.Up
                    'Me.TopLevelControl.SelectNextControl(Me, False, True, True, True)
                    Return True
                Case Keys.Left
                    Me.TopLevelControl.SelectNextControl(Me, False, True, True, True)
                Case Else
                    Return MyBase.ProcessDialogKey(keyData)
            End Select
            Return True
        End Function
    End Class

    2009年9月18日 10:53

回答

  • SelectNextControlの5番目の引数(wrap)をFalseにしちゃいましょう
    • 回答としてマーク ターチ 2009年9月19日 6:27
    2009年9月18日 11:37
  • 外池と申します。ターチさんの新しいボタンのクラスを、仮に、TarchButtonとしましょうか・・・。

    私なら、TarchButton自身に、NeighborRightとNeighborLeftというTarchButton型のメンバーを用意します。で、このメンバーはプロパティーにしておくといいでしょう。

    TarchButtonが

    [button1] [button2] [button3]

    と並ぶのであれば、

    button1.NeighborLeft = Nothing
    button1.NeighborRight = button2

    button2.NeighborLeft = button1
    button2.NeighborRight = button3

    button3.NeighborLeft = button2
    button3.NeighborRight = Nothing

    とプロパティーの値をセットするわけです。

    で、キーが押されるイベントの情報は、現在フォーカスがあるTarchButtonに渡してやって、上述のプロパティーの情報を使って、フォーカスを移してやります。フォーカスを移そうとする側がNothingであれば、何もしないと。

    いかがでしょう?


    (ホームページを再開しました)
    • 回答としてマーク ターチ 2009年9月19日 6:27
    2009年9月18日 11:43

すべての返信

  • SelectNextControlの5番目の引数(wrap)をFalseにしちゃいましょう
    • 回答としてマーク ターチ 2009年9月19日 6:27
    2009年9月18日 11:37
  • 外池と申します。ターチさんの新しいボタンのクラスを、仮に、TarchButtonとしましょうか・・・。

    私なら、TarchButton自身に、NeighborRightとNeighborLeftというTarchButton型のメンバーを用意します。で、このメンバーはプロパティーにしておくといいでしょう。

    TarchButtonが

    [button1] [button2] [button3]

    と並ぶのであれば、

    button1.NeighborLeft = Nothing
    button1.NeighborRight = button2

    button2.NeighborLeft = button1
    button2.NeighborRight = button3

    button3.NeighborLeft = button2
    button3.NeighborRight = Nothing

    とプロパティーの値をセットするわけです。

    で、キーが押されるイベントの情報は、現在フォーカスがあるTarchButtonに渡してやって、上述のプロパティーの情報を使って、フォーカスを移してやります。フォーカスを移そうとする側がNothingであれば、何もしないと。

    いかがでしょう?


    (ホームページを再開しました)
    • 回答としてマーク ターチ 2009年9月19日 6:27
    2009年9月18日 11:43
  • gekka様、外池様、回答ありがとうございます
    どちらの方法を試しても無事解決できました
    またの機会よろしくお願いします。

    2009年9月19日 6:30