다음을 통해 공유


마우스로 그리기

사용자가 WM_MOUSEMOVE 메시지를 처리하는 동안 창 프로시저를 그리도록 하여 마우스로 선을 그릴 수 있습니다. 시스템은 사용자가 창 내에서 커서를 이동할 때마다 창 프로시저에 WM_MOUSEMOVE 메시지를 보냅니다. 선을 그리기 위해 창 프로시저는 디스플레이 디바이스 컨텍스트를 검색하고 현재 커서 위치와 이전 커서 위치 사이의 창에 선을 그릴 수 있습니다.

다음 예제에서 창 프로시저는 사용자가 마우스 왼쪽 단추를 누르고 있을 때 그리기를 준비합니다( WM_LBUTTONDOWN 메시지 보내기). 사용자가 창 내에서 커서를 이동하면 창 프로시저는 일련의 WM_MOUSEMOVE 메시지를 받습니다. 각 메시지에 대해 창 프로시저는 이전 위치와 현재 위치를 연결하는 선을 그립니다. 선을 그리기 위해 프로시저는 GetDC 를 사용하여 디스플레이 디바이스 컨텍스트를 검색합니다. 그리기를 완료하고 메시지에서 반환하기 전에 프로시저는 ReleaseDC 함수를 사용하여 디스플레이 디바이스 컨텍스트를 해제합니다. 사용자가 마우스 단추를 놓자마자 창 프로시저가 플래그를 지우고 드로잉이 중지됩니다( WM_LBUTTONUP 메시지를 보냅니다).

BOOL fDraw = FALSE; 
POINT ptPrevious; 
 
  . 
  . 
  . 
 
case WM_LBUTTONDOWN: 
    fDraw = TRUE; 
    ptPrevious.x = LOWORD(lParam); 
    ptPrevious.y = HIWORD(lParam); 
    return 0L; 
 
case WM_LBUTTONUP: 
    if (fDraw) 
    { 
        hdc = GetDC(hwnd); 
        MoveToEx(hdc, ptPrevious.x, ptPrevious.y, NULL); 
        LineTo(hdc, LOWORD(lParam), HIWORD(lParam)); 
        ReleaseDC(hwnd, hdc); 
    } 
    fDraw = FALSE; 
    return 0L; 
 
case WM_MOUSEMOVE: 
    if (fDraw) 
    { 
        hdc = GetDC(hwnd); 
        MoveToEx(hdc, ptPrevious.x, ptPrevious.y, NULL); 
        LineTo(hdc, ptPrevious.x = LOWORD(lParam), 
          ptPrevious.y = HIWORD(lParam)); 
        ReleaseDC(hwnd, hdc); 
    } 
    return 0L; 

이 예제와 같이 그리기를 사용하도록 설정하는 애플리케이션은 일반적으로 점 또는 줄을 기록하므로 창이 업데이트될 때마다 줄을 다시 그릴 수 있습니다. 그리기 애플리케이션은 종종 메모리 디바이스 컨텍스트 및 연결된 비트맵을 사용하여 마우스를 사용하여 그린 줄을 저장합니다.