複数キーの同時認識


demotwo  2002-12-01 08:27:14  No: 76486

画像を矢印キーによって移動させる際に
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    select case KeyCode
        case vbKeyTop
            '上へ移動させる記述
          ・
          ・
    end select
End Sub
のようなきじゅつだと右矢印キーと上矢印キーを同時に押しても右上に動いてはくれません
・これを右上に移動させるにはどうしたらよいでしょうか?
・また、画像を移動させるときにImageコントロールだとちらついてしまうのですが、
Pictureboxコントロールを使わなければいけないのでしょうか


Say  2002-12-01 13:10:39  No: 76487

複数キーの同時認識にGetKeyboardStateを用いますが、
こんな方法でも可能かと・・・。

Option Explicit
Private Const UPKEY As Long = 1
Private Const DOWNKEY As Long = 2
Private Const RIGHTKEY As Long = 4
Private Const LEFTKEY As Long = 8
Private Const SPEED As Long = 100
Dim lngKeyStatus As Long
Dim lngDispIndex As Long

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    Select Case KeyCode
        Case vbKeyUp
            lngKeyStatus = lngKeyStatus Or UPKEY
        Case vbKeyDown
            lngKeyStatus = lngKeyStatus Or DOWNKEY
        Case vbKeyRight
            lngKeyStatus = lngKeyStatus Or RIGHTKEY
        Case vbKeyLeft
            lngKeyStatus = lngKeyStatus Or LEFTKEY
    End Select
End Sub

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
    Select Case KeyCode
        Case vbKeyUp
            lngKeyStatus = lngKeyStatus And Not UPKEY
        Case vbKeyDown
            lngKeyStatus = lngKeyStatus And Not DOWNKEY
        Case vbKeyRight
            lngKeyStatus = lngKeyStatus And Not RIGHTKEY
        Case vbKeyLeft
            lngKeyStatus = lngKeyStatus And Not LEFTKEY
    End Select
End Sub

Private Sub Form_Load()
    lngDispIndex = 0
    Image1(0).Visible = True
    Image1(1).Visible = False
    Image1(1).Top = Image1(0).Top
    Image1(1).Left = Image1(0).Left
    lngKeyStatus = 0
    Timer1.Interval = 100
    Timer1.Enabled = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Timer1.Enabled = False
End Sub

Private Sub Timer1_Timer()
    Dim lngDispIndexNew
    lngDispIndexNew = (lngDispIndex + 1) And 1
    If (lngKeyStatus And UPKEY) <> 0 Then
        Image1(lngDispIndexNew).Top = Image1(lngDispIndex).Top - SPEED
    End If
    If (lngKeyStatus And DOWNKEY) <> 0 Then
        Image1(lngDispIndexNew).Top = Image1(lngDispIndex).Top + SPEED
    End If
    If (lngKeyStatus And RIGHTKEY) <> 0 Then
        Image1(lngDispIndexNew).Left = Image1(lngDispIndex).Left + SPEED
    End If
    If (lngKeyStatus And LEFTKEY) <> 0 Then
        Image1(lngDispIndexNew).Left = Image1(lngDispIndex).Left - SPEED
    End If
    
    Image1(lngDispIndexNew).Visible = True
    Image1(lngDispIndex).Visible = False
    Image1(lngDispIndex).Top = Image1(lngDispIndexNew).Top
    Image1(lngDispIndex).Left = Image1(lngDispIndexNew).Left
    lngDispIndex = lngDispIndexNew
End Sub

>また、画像を移動させるときにImageコントロールだとちらついてしまうのですが、
2枚交互に表示することである程度は抑えられますが、不完全です。
>Pictureboxコントロールを使わなければいけないのでしょうか
通常はGDIデバイスに対しBitbltを使います。


demotwo  2002-12-01 21:15:42  No: 76488

ありがとうございました
GetKeyState関数を使ったらうまくいきましたが。
GetKeyboardStateだとうまくいかない、というよりは使い方がよくわからない。


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

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






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