コマンドボタンのフォーカス移動について (VB6)

解決


yazuya  2005-07-21 17:58:44  No: 123599

コマンドボタンのフォーカス移動について教えてください。

 _____   _____
| Command1 | | Command2 |
 ‾‾‾‾‾   ‾‾‾‾‾
 _____   _____
| Command3 | | Command4 |
 ‾‾‾‾‾   ‾‾‾‾‾

上記のようにコマンドボタンを配置した場合、

タブを押した際のフォーカスの移動は、
Command1 → Command2 → Command3 → Command4 のままで、

Command1にフォーカスがあるとき、キーボードの↓が押されたとき、
Command3にフォーカスを移すことはできますでしょうか

以下のようにした場合、キーを拾いませんでした。

Private Sub command1_KeyDown(KeyCode As Integer, Shift As Integer)
    Select Case KeyCode
        Case vbKeyDown
            Command3.SetFocus
    End Select
End Sub

良い方法があれば、教えてください。
よろしくお願いします。


魔界の仮面弁士  2005-07-21 18:14:01  No: 123600

# 掲示板が半壊してますね。また、容量不足による障害が起きているのかな……。

> 以下のようにした場合、キーを拾いませんでした。
矢印キーは、『「コンテナ内」の次の(前の)ボタンへの移動』と
して扱われます。(タブキーとは異なる動作です)

で、残念なことに、ボタン系コントロールの上では、矢印キーを
検知する事ができません。VBの標準イベントだけでは無理です。

ボタン系のコントロールを使わず、PictureBox等で代用するなどの
回避策を取るか、どうしても処理したいなら、SetWindowsHookEx API などで
キー押下を検知し、制御する事になるでしょう。


名無し  2005-07-21 18:39:58  No: 123601

TabIndexとカーソルキーって連動していなかったのか・・・


名無し  2005-07-21 18:43:30  No: 123602

なんか意味を勘違いしてたようなので、提案を

Command1とCommand3とをコンテナに、Command2とCommand4とをコンテナに
ふたつずつ分けて格納したらどうでしょうか?
TabIndexは1→2→3→4にすればいいですよね?


魔界の仮面弁士  2005-07-21 20:10:26  No: 123603

APIを使って無理矢理に実装してみた場合。

'--- 標準モジュール
Option Explicit

Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Private Const WH_KEYBOARD As Long = 2
Private mlngHook As Long

Public Sub Hook()
    mlngHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, 0&, App.ThreadID)
End Sub
Public Sub Unhook()
    UnhookWindowsHookEx mlngHook
    mlngHook = 0
End Sub

Public Function KeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Static blnReEnter As Boolean
    If wParam <> vbKeyRight And _
       wParam <> vbKeyLeft And _
       wParam <> vbKeyUp And _
       wParam <> vbKeyDown Then
        KeyboardProc = CallNextHookEx(mlngHook, nCode, wParam, lParam)
    ElseIf blnReEnter = False Then
        blnReEnter = True
        KeyboardProc = 1
    Else
        On Error Resume Next
        Form1.ArrowKeyClick wParam
        KeyboardProc = 1
        blnReEnter = False
    End If
End Function

'--- Form1
Option Explicit

Private Sub Form_Load()
    Hook
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Unhook
End Sub

Public Sub ArrowKeyClick(ByVal KeyCode As KeyCodeConstants)
    ' [Command1] ←→ [Command2]
    '  ↑                     ↑
    '  ↓                     ↓
    ' [Command3] ←→ [Command4]
    If KeyCode = vbKeyRight Then
        If ActiveControl Is Command1 Then
            Command2.SetFocus
        ElseIf ActiveControl Is Command3 Then
            Command4.SetFocus
        End If
    ElseIf KeyCode = vbKeyLeft Then
        If ActiveControl Is Command2 Then
            Command1.SetFocus
        ElseIf ActiveControl Is Command4 Then
            Command3.SetFocus
        End If
    ElseIf KeyCode = vbKeyDown Then
        If ActiveControl Is Command1 Then
            Command3.SetFocus
        ElseIf ActiveControl Is Command2 Then
            Command4.SetFocus
        End If
    ElseIf KeyCode = vbKeyUp Then
        If ActiveControl Is Command3 Then
            Command1.SetFocus
        ElseIf ActiveControl Is Command4 Then
            Command2.SetFocus
        End If
    End If
End Sub


yazuya  2005-07-22 23:18:54  No: 123604

魔界の仮面弁士 さん、ありがとうございます。
イメージしていた動きが実現できました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加