キーの状態を調べる-2



GetKeyboardState() でキーの状態を調べて表示します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明です。

  1. 新規プロジェクト(BodeState)を作成してソースプログラムの最初の部分を表示して下さい。
    上矢印(↑)と下矢印(↓)の状態を記録する領域を定義します。
        // グローバル変数:
        BOOL    Up,Down;
        
  2. 関数の宣言に続いて次の関数を追加して下さい。
    キーをセンスして上矢印と下矢印の状態を Up と Down に記録する関数です。
    ESC キーが押されるとプログラムを終了します。
    キーの状態が変化すると InvalidateRect() で画面に表示します。
    InvalidateRect() と UpdateWindow() を対で使用することが多いのですが、UpdateWindow() を省略しても 差し支え無いようです。
        void KeyCheck(HWND hwnd)
        {   BYTE    KeyBuffer[256];
            BOOL    state;
    
            // キーボードの状態を読み取る
            GetKeyboardState(KeyBuffer);
            if (KeyBuffer[VK_ESCAPE]&0xf0)              //ESC
            {   PostMessage(hwnd,WM_CLOSE,0,0);         //WM_CLOSE をポスト
                return;
            }
            if (KeyBuffer[VK_UP]&0xf0)      state= TRUE;
            else                            state= FALSE;
            if (Up!=state)
            {    Up= state;
                 InvalidateRect(hwnd,NULL,TRUE);
            }
            if (KeyBuffer[VK_DOWN]&0xf0)    state= TRUE;
            else                            state= FALSE;
            if (Down!=state)
            {    Down= state;
                 InvalidateRect(hwnd,NULL,TRUE);
            }
        }
        
  3. InitInstance() を表示して下さい。
    大きな画面は必要ないので、ウインドウのサイズを小さくします。
        BOOL InitInstance( HINSTANCE hInstance, int nCmdShow )
        {
                :
            hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
                   CW_USEDEFAULT, CW_USEDEFAULT, 200, 150, NULL, NULL, hInstance, NULL);
        
  4. CALLBACK WndProc() を表示して下さい。
    上矢印と下矢印の状態を表示します。
            case WM_PAINT:
                hdc = BeginPaint (hWnd, &ps);
                // TODO: この位置に描画用のコードを追加してください...
                if (Up==TRUE)       TextOut(hdc,50,20,"UP   ON ",8);
                else                TextOut(hdc,50,20,"UP   OFF",8);
                if (Down==TRUE)     TextOut(hdc,50,50,"DOWN ON ",8);
                else                TextOut(hdc,50,50,"DOWN OFF",8);
                EndPaint( hWnd, &ps );
                break;
        
  5. WinMain() を表示して下さい。
    今回のように直接キーをセンスするときは TranslateMessage() は不要です。
    別にコメントにする必要は無いのですが削除しても動くことを確かめて下さい。
        // メイン メッセージ ループ:
        while( GetMessage(&msg, NULL, 0, 0) ) 
        {
            if( !TranslateAccelerator (msg.hwnd, hAccelTable, &msg) ) 
            {
                //TranslateMessage( &msg );
                DispatchMessage( &msg );
            }
            KeyState(msg.hwnd);
        }
        
  6. [デバッグ][デバッグなしで開始]を選択して、ビルドに続いて実行を行います。
    上矢印と下矢印キーを押すと表示状態が変わることを確かめて下さい。

【演習】

BMP 画像を表示して「矢印キー」の操作で上下左右に動かして下さい。
WM_KEYDOWN: でポストされたキーコードを検出する方法は、応答速度やリピート機能などの点でゲームには向きません。
また、画像の移動(再描画)によるチラツキを抑える方法も説明します。

超初心者のプログラム入門(Win32API C++)