C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 方向キーによるボタンコントロールの遷移制御について


(過去ログ 46 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■24822 / inTopicNo.1)  方向キーによるボタンコントロールの遷移制御について
  
□投稿者/ トトロ (1回)-(2008/09/10(Wed) 13:17:46)

分類:[.NET 全般] 

初めて利用させて頂きます。
私は今VB.net 2005を使用してメニュー画面を作成している所なのですが
少し気になるところがありましたので、書き込みさせてもらいました。

気になるところとは、方向キーによるボタンコントロールにおける遷移制御(フォーカス制御)についてです。

今の状態・・

 _Menu(Form1)______________________________
|  _______     _______                     |
| |       |   |       |                    |
| |___0___|   |___3___|                    |
|  _______     _______                     |
| |       |   |       |                    |
| |___1___|   |___4___|                    |
|  _______     _______                     |
| |       |   |       |                    |
| |___2___|   |___5___|                    |
|                                          |
|                                          |
|__________________________________________|

*数字が書いてあるところがボタンコントロールです。また数字はTab Indexです。

通常方向キーの「↓」または「→」を押した場合Tab Indexの数+1に、「↑」または「左」を押せばTab Indexの数-1に
フォーカスが移動するかと思います。

前置きが長くなりましたが・・今回私がやりたいのは、

Tab Index0にカーソルが当たっていた場合、「→」を押せば、Tab Index3へ。
Tab Index1にカーソルが当たっていた場合、「→」を押せば、Tab Index4へ。
Tab Index5にカーソルが当たっていた場合、「←」を押せば、Tab Index2へ。

など、自由にカーソルを動かしているように見えるようにしたいのです。

分かりにくいかとも思いますが;何卒宜しくお願いします。

引用返信 編集キー/
■24823 / inTopicNo.2)  Re[1]: 方向キーによるボタンコントロールの遷移制御について
□投稿者/ ひで (1回)-(2008/09/10(Wed) 13:28:52)
No24822 (トトロ さん) に返信
> Tab Index0にカーソルが当たっていた場合、「→」を押せば、Tab Index3へ。
> Tab Index1にカーソルが当たっていた場合、「→」を押せば、Tab Index4へ。
> Tab Index5にカーソルが当たっていた場合、「←」を押せば、Tab Index2へ。
>
> など、自由にカーソルを動かしているように見えるようにしたいのです。

VBは知らないので、考え方だけ。。

if (現在のTab Index値 < 3) {
 移動先Tab Index = 現在のTab Index値+3
}
else {
 移動先Tab Index = 現在のTab Index値-3
}

または

移動先Tab Index = 現在のTab Index値 + 3 * ((現在のTab Index値 < 3) ? -1 : 1);

の後に
フォーカス移動(移動先Tab Index);

では駄目ですか?
引用返信 編集キー/
■24824 / inTopicNo.3)  Re[1]: 方向キーによるボタンコントロールの遷移制御について
□投稿者/ けろ (1回)-(2008/09/10(Wed) 13:56:04)
2008/09/10(Wed) 13:58:13 編集(投稿者)

No24822 (トトロ さん) に返信
> 初めて利用させて頂きます。
> 私は今VB.net 2005を使用してメニュー画面を作成している所なのですが
> 少し気になるところがありましたので、書き込みさせてもらいました。
>
> 気になるところとは、方向キーによるボタンコントロールにおける遷移制御(フォーカス制御)についてです。
>
> 今の状態・・
>
> _Menu(Form1)______________________________
> | _______ _______ |
> | | | | | |
> | |___0___| |___3___| |
> | _______ _______ |
> | | | | | |
> | |___1___| |___4___| |
> | _______ _______ |
> | | | | | |
> | |___2___| |___5___| |
> | |
> | |
> |__________________________________________|
>
> *数字が書いてあるところがボタンコントロールです。また数字はTab Indexです。
>
> 通常方向キーの「↓」または「→」を押した場合Tab Indexの数+1に、「↑」または「左」を押せばTab Indexの数-1に
> フォーカスが移動するかと思います。
>
> 前置きが長くなりましたが・・今回私がやりたいのは、
>
> Tab Index0にカーソルが当たっていた場合、「→」を押せば、Tab Index3へ。
> Tab Index1にカーソルが当たっていた場合、「→」を押せば、Tab Index4へ。
> Tab Index5にカーソルが当たっていた場合、「←」を押せば、Tab Index2へ。
>
> など、自由にカーソルを動かしているように見えるようにしたいのです。
>
> 分かりにくいかとも思いますが;何卒宜しくお願いします。

http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard6.htm

条件分岐を調べてみるといいですね。
引用返信 編集キー/
■24825 / inTopicNo.4)  Re[2]: 方向キーによるボタンコントロールの遷移制御について
□投稿者/ トトロ (3回)-(2008/09/10(Wed) 14:02:39)
No24823 (ひで さん) に返信
> ■No24822 (トトロ さん) に返信
>>Tab Index0にカーソルが当たっていた場合、「→」を押せば、Tab Index3へ。
>>Tab Index1にカーソルが当たっていた場合、「→」を押せば、Tab Index4へ。
>>Tab Index5にカーソルが当たっていた場合、「←」を押せば、Tab Index2へ。
>>
>>など、自由にカーソルを動かしているように見えるようにしたいのです。
> 
> VBは知らないので、考え方だけ。。
> 
> if (現在のTab Index値 < 3) {
>  移動先Tab Index = 現在のTab Index値+3
> }
> else {
>  移動先Tab Index = 現在のTab Index値-3
> }
> 
> または
> 
> 移動先Tab Index = 現在のTab Index値 + 3 * ((現在のTab Index値 < 3) ? -1 : 1); 
> 
> の後に
> フォーカス移動(移動先Tab Index);
> 
> では駄目ですか?


返信有難う御座います。

私も以前記述でなんとかなるかなと思いやってみたのですが…

ボタン1の記述(Tab Index0)
Private Sub Button1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Button1.KeyDown

        Select Case e.KeyCode
            Case Keys.Right
                Button4.Focus()
            Case Keys.Down
                Button2.Focus()
        End Select

End Sub

*Button4(Tab Index3) Button2(Tab Index1)
で、やってみたのですが、うまく動かなかったのです…。
ブレークポイントを設定してやってみた所、処理に入ってすらいなかったのです;

引用返信 編集キー/
■24826 / inTopicNo.5)  Re[3]: 方向キーによるボタンコントロールの遷移制御について
□投稿者/ カドルドエグ (20回)-(2008/09/10(Wed) 15:11:26)
No24825 (トトロ さん) に返信
> ブレークポイントを設定してやってみた所、処理に入ってすらいなかったのです;
KeyDownイベントのヘルプ
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.keydown(VS.80).aspx
にありますが、方向キーやEnterキーなどは「特殊」とみなされ、デフォルトではイベントがハンドルされてるか否かに関わらず自動処理されてしまいます。

それを避けるため(KeyDownイベントを発生させる)には、各コントロールにてIsInputKeyメソッド(http://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.isinputkey(VS.80).aspx)のオーバーライドが必要、とあります。
よって、方向キーで動かすための、この場合ですとボタンクラスを継承した独自コントロールを作成する必要があるかと思います。

引用返信 編集キー/
■24827 / inTopicNo.6)  Re[3]: 方向キーによるボタンコントロールの遷移制御について
□投稿者/ 魔界の仮面弁士 (842回)-(2008/09/10(Wed) 15:17:29)
No24825 (トトロ さん) に返信
> Private Sub Button1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Button1.KeyDown

「KeyDown イベント」ではなく、「PreviewKeyDown イベント」を使ってみるとか。

' 
' ┏━━━━━━━━━━┓┏━━━━━━━━━━┓
' ┃Button1 (TabIndex=0)┃┃Button4 (TabIndex=3)┃
' ┗━━━━━━━━━━┛┗━━━━━━━━━━┛
' ┏━━━━━━━━━━┓┏━━━━━━━━━━┓
' ┃Button2 (TabIndex=1)┃┃Button5 (TabIndex=4)┃
' ┗━━━━━━━━━━┛┗━━━━━━━━━━┛
' ┏━━━━━━━━━━┓┏━━━━━━━━━━┓
' ┃Button3 (TabIndex=2)┃┃Button6 (TabIndex=5)┃
' ┗━━━━━━━━━━┛┗━━━━━━━━━━┛
' 

Public Class Form1

 Private buttonNavi As New Navigators(Of Button)()
 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  buttonNavi.Add(Button1, Nothing, Button4, Button2, Nothing)
  buttonNavi.Add(Button2, Button1, Button5, Button3, Nothing)
  buttonNavi.Add(Button3, Button2, Button6, Nothing, Nothing)
  buttonNavi.Add(Button4, Nothing, Nothing, Button5, Button1)
  buttonNavi.Add(Button5, Button4, Nothing, Button6, Button2)
  buttonNavi.Add(Button6, Button5, Nothing, Nothing, Button3)
 End Sub

 Private Class Navigators(Of T As Control)
  Private list As New List(Of Navigator)()
  Public Sub Add(ByVal target As T, ByVal up As T, ByVal right As T, ByVal down As T, ByVal left As T)
   list.Add(New Navigator(target, up, right, down, left))
  End Sub

  Private Class Navigator
   Private self As T
   Private up, right, down, left As T
   Private Sub PreviewKeyDown(ByVal sender As Object, ByVal e As PreviewKeyDownEventArgs)
    Select Case e.KeyCode
     Case Keys.Up
      up.Focus()
      e.IsInputKey = True
     Case Keys.Right
      right.Focus()
      e.IsInputKey = True
     Case Keys.Down
      down.Focus()
      e.IsInputKey = True
     Case Keys.Left
      left.Focus()
      e.IsInputKey = True
    End Select
   End Sub

   Public Sub New(ByVal target As T, ByVal up As T, ByVal right As T, ByVal down As T, ByVal left As T)
    Me.self = target
#If VBC_VER < 9 Then
    Me.up = IIf(IsNothing(up), target, up)
    Me.right = IIf(IsNothing(right), target, right)
    Me.down = IIf(IsNothing(down), target, down)
    Me.left = IIf(IsNothing(left), target, left)
#Else
    Me.up = If(up, target)
    Me.right = If(right, target)
    Me.down = If(down, target)
    Me.left = If(left, target)
#End If
    AddHandler target.PreviewKeyDown, AddressOf PreviewKeyDown
   End Sub
  End Class
 End Class
End Class

引用返信 編集キー/
■24828 / inTopicNo.7)  Re[4]: 方向キーによるボタンコントロールの遷移制御について
□投稿者/ トトロ (4回)-(2008/09/10(Wed) 16:08:30)
No24827 (魔界の仮面弁士 さん) に返信
> ■No24825 (トトロ さん) に返信
>>Private Sub Button1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Button1.KeyDown
>
> 「KeyDown イベント」ではなく、「PreviewKeyDown イベント」を使ってみるとか。
>

返信有難う御座います。

頂いた記述を組み込んだら
思っていた通りの動作をしてくれるようになりました。

インターネットで自分なりに探しても全く参考になるような物が見つからず…
諦めかけていたところでした。

本当に有難う御座いました;
引用返信 編集キー/
■24829 / inTopicNo.8)  Re[2]: 方向キーによるボタンコントロールの遷移制御について
□投稿者/ トトロ (5回)-(2008/09/10(Wed) 16:08:51)
2008/09/10(Wed) 16:11:05 編集(投稿者)
2008/09/10(Wed) 16:10:53 編集(投稿者)

無事解決することができました。

書き込みくださった皆様、本当に有難う御座いました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -