マウスの軌跡を vector に記録する

マウスの左ボタンを押しながら移動すると、軌跡を vector に記録します。

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

プログラムの説明です。

  1. 空の新規プロジェクト(MouseLine)を作成してソースプログラムを格納して下さい。
    ソースプログラムはページの後部に掲載されています。
  2. [プロジェクト][リソースの追加][Menu][新規作成] からメニューを作成して下さい。
    キャプション ID 説明
    メニュー IDR_MENU1 メニューの規定値です
    File(&F) 親メニュー
    終了(&X) IDM_EXIT プログラムを終了します
    記録STL(&S) 親メニュー
    クリア(&C) IDM_DISP 記録をクリアします
    表示(&D) IDM_CLEAR 記録に従って表示します
  3. STL の vector を使うので <vector> を include します。
    using namespace で std で宣言されたネームを規定値として使います。
    STL で定義されている標準的な名前は、std:: の名前空間で宣言されています。
    名前空間の説明は namespace 宣言 を参照して下さい。
    bLine は、ドットの描画と記録された線の描画を切り替えるフラグです。
    bLine==1 のときは pos の座標にドットを描画します。
    bLine==2 のときは vector に記録されている線を描画します。
    pos にはマウスが移動した座標を格納します。
    v が軌跡を記録する vector です。
        #include    <vector>
        #include    "resource.h"
        using       namespace std;
    
        HINSTANCE   g_hInst;
        HWND        g_hWnd;
        int         bLine= 0;           // 1:Dot  2:Line
        POINTS      pos;                // Mouse の現在座標
        vector<POINTS> v;
        
  4. CALLBACK WndProc() 関数です。
    マウスの左ボタンダウンで軌跡の記録を開始します。
            case WM_LBUTTONDOWN:
                bLine= 1;
                break;
        
  5. WM_MOUSEMOVE でマウスの移動を検出して pos に格納します。
    pos の座標を vector に記録します。
    InvalidateRect() と UpdateWindow() で pos のドットを描画します。
            case WM_MOUSEMOVE:
                if (bLine!=1)   break;
                pos= MAKEPOINTS(lParam);
                v.push_back(pos);
                InvalidateRect(hWnd,NULL,FALSE);
                UpdateWindow(hWnd);
                break;
        
  6. マウスの左ボタンアップで軌跡の記録を終了します。
            case WM_LBUTTONUP:
                bLine= 0;
                break;
        
  7. 座標を描画する WM_PAINT です。
    bLine==1 のときは pos の座標にドットを描画します。
    bLine==2 のときは vector に記録されている線を描画します。
            case WM_PAINT:
                hdc= BeginPaint(hWnd,&ps);
                switch(bLine)
                {   case 1:
                        SetPixel(hdc,pos.x,pos.y,RGB(0,0,0));
                        break;
                    case 2:
                        for(n=0; n<v.size(); n++)
                            SetPixel(hdc,v[n].x,v[n].y,RGB(255,0,0));
                        bLine= 0;
                        break;
                }
                EndPaint(hWnd,&ps);
                break;
        
  8. WM_RBUTTONDOWN でウインドウをクリアします。
            case WM_RBUTTONDOWN:
                InvalidateRect(hWnd,NULL,TRUE);
                UpdateWindow(hWnd);
                break;
        
  9. メニューの操作です。
    IDM_CLEAR で vector に記録されている軌跡をクリアします。
                    case IDM_CLEAR:
                        v.clear();
                        InvalidateRect(hWnd,NULL,TRUE);
                        UpdateWindow(hWnd);
                        break;
        
  10. IDM_DISP で vector に記録されている軌跡を描画します。
                    case IDM_DISP:
                        bLine= 2;
                        InvalidateRect(hWnd,NULL,TRUE);
                        UpdateWindow(hWnd);
                        break;
    
        
  11. [デバッグ][デバッグなしで開始]を選択して、ビルドに続いて実行を行います。
    マウスの左ボタンを押しながら移動すると座標が記録されます。
    右ボタンでウインドウをクリアして、vector に記録されている軌跡を描画してみて下さい。

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

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