マウスの左ドラッグで線を描く

マウスの左ボタンを押しながら移動すると線を描きます。

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

プログラムの説明

  1. bLine が左ボタンが押されてマウスが移動中のフラグです。
    pos はマウスの現在の座標です。
        BOOL        bLine= FALSE;       // Line を描画中
        POINTS      pos;                // Mouse の現在座標
        
  2. WinMain() はいつもと同じです。
  3. CALLBACK 関数です。
    WM_PAINT: では bLine が TRUE のときに、座標 pos に点を描画します。
        {   case WM_PAINT:
                hdc= BeginPaint(hWnd,&ps);
                if (bLine)
                    SetPixel(hdc,pos.x,pos.y,RGB(0,0,0));
                EndPaint(hWnd,&ps);
                break;
        
  4. 左ボタンが押されると bLine を TRUE に設定してラインの描画を開始します。
            case WM_LBUTTONDOWN:
                bLine= TRUE;
                break;
        
  5. WM_MOUSEMOVE: では bLine が TRUE のとき、座標を pos に設定して WM_PAINT: を呼び出します。
    InvalidateRect() が FALSE になっているので、前回の画面の上からドットが重ね書きされます。
            case WM_MOUSEMOVE:
                if (bLine==FALSE)   break;
                pos= MAKEPOINTS(lParam);
                InvalidateRect(hWnd,NULL,FALSE);
                UpdateWindow(hWnd);
                break;
        
  6. WM_LBUTTONUP: で bLine をリセットします。
            case WM_LBUTTONUP:
                bLine= FALSE;
                break;
        
  7. WM_RBUTTONDOWN: で、ウインドウをクリアします。
    InvalidateRect() が TRUE になっていることに注目して下さい。
            case WM_RBUTTONDOWN:
                InvalidateRect(hWnd,NULL,TRUE);
                UpdateWindow(hWnd);
                break;
        

【NOTE】

今回は POINTS 構造体を使いましたが、良く似たものに POINT 構造体があります。
POINTS      pos1;
POINT       pos2;
LONG 型 か SHORT かの違いで、どちらを使っても大差はありません。
但し、POINT 型では MAKEPOINTS(lParam) は使えません。
typedef struct tagPOINT
{
    LONG  x;
    LONG  y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;

typedef struct tagPOINTS
{ 
    SHORT x; 
    SHORT y; 
} POINTS, *PPOINTS; 

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

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