マウスをキャプチャする



マウスをキャプチャして、XとYの移動量を検出して表示します。

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

プログラムの説明です。

  1. 新規プロジェクト(Capture)を作成してソースプログラムの最初の部分を表示して下さい。
    マウスの座標を格納する構造体と編集用の作業領域を定義します。
    pt がマウスがクリックされた基準座標で、xp,yp が現在の座標です。
        // グローバル変数:
        POINT   pt=  { 0,0 };
        int     xp,yp;
        char    work[80];
        
  2. CALLBACK WndProc() を表示して下さい。
    マウスの左クリックを検出する WM_LBUTTONDOWN: を追加します。
    クリックされたときの座標を基準として pt に保存して SetCapture() でキャプチャを開始します。
    キャプチャが開始されるとマウスに関係するメッセージは全てこのウインドウにポストされます。
        switch( message ) 
        {
            case WM_LBUTTONDOWN:
                pt.x= LOWORD(lParam);
                pt.y= HIWORD(lParam);
                SetCapture(hWnd);
                break;
        
  3. マウスの移動を検出する WM_MOUSEMOVE: を追加します。
    移動した座標を xp と yp に格納して、InvalidateRect() と UpdateWindow() を実行します。
            case WM_MOUSEMOVE:
                if ((wParam&MK_LBUTTON)==0)     break;
                xp = LOWORD(lParam);
                yp = HIWORD(lParam);
                InvalidateRect(hWnd,NULL,TRUE);
                UpdateWindow(hWnd);
                break;
        
  4. 左ボタンが離されるとキャプチャを終了します。
            case WM_LBUTTONUP:
                ReleaseCapture();
                return 0L;
        
  5. WM_PAINT: でマウスが移動した量を画面に表示します。
        case WM_PAINT:
            hdc = BeginPaint (hWnd, &ps);
            // TODO: この位置に描画用のコードを追加してください...
            wsprintf(work,"X-DT=%d  Y-DT=%d", xp-pt.x,yp-pt.y);
            TextOut(hdc,50,20,work,strlen(work));
            EndPaint( hWnd, &ps );
            break;
        
  6. [デバッグ][デバッグなしで開始]を選択して、ビルドに続いて実行を行います。
    マウスを左クリックして押したままドラッグすると移動量が表示されることを確認して下さい。
    マウスがウインドウの外に出ても検出されることを確かめて下さい。

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