다음을 통해 공유


마우스로 그리기

사용자가 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; 

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