9/5 API Mouse 캡쳐

정수현·2024년 9월 5일

API Programming

목록 보기
8/10

마우스 (Mouse)


마우스 캡쳐

  • 마우스 캡쳐 : WM_LBUTTONDOWN에서 SetCapture()

  • 현재 어떤 윈도우가 캡쳐되었는지 : GetCapture()
    ↪ 마우스 캡쳐 시엔, WM_NCHITTEST 메시지는 발생하지 않는다.

  • 마우스 캡쳐 해제 : WM_LBUTTONUP (다른 윈도우 클릭) OR ReleaseCapture()

마우스 캡쳐 - 선 그리기

1) 마우스 캡쳐 SetCapture(hwnd);

static POINTS start, end;
switch(msg)
{
	case WM_LBUTTONDOWN:
    {
    	start = end = MAKEPOINTS(lParam);
        SetCapture(hwnd);
        
        return 0;
    }
}
  • 시작점 start과 끝점 end을 선언한다.

  • 클라이언트 영역을 좌 클릭했을 때, startend는 같은 위치에 있다.

  • 그 시점에서 마우스 캡쳐 발생한다. ⇒ SetCapture(hwnd);

2) 누가 마우스를 캡쳐하고 있는지 GetCapture()

case WM_MOUSEMOVE:
{
	if(GetCapture() == hwnd)
    {
    	HDC hdc = GetDC(hwnd);
        
        SetROP2(hdc, R2_NOT);
        
        // 지우는 역할
        MoveToEx(hdc, start.x, start.y, NULL);
		LineTo(hdc, end.x, end.y);
        
        end = MAKEPOINTS(lParam);
        
        //그리는 역할
		MoveToEx(hdc, start.x, start.y, NULL);
		LineTo(hdc, end.x, end.y);

		ReleaseDC(hwnd, hdc);
    }
    
    return 0;
}
  • SetROP2(hdc, R2_NOT); : 그리기 모드 설정
    ↪ 서로 같은 것을 만나면 TRUE → 투명해짐
    ↪ 서로 다른 것을 만나면 FALSE → 그려짐

  • MoveToEx(hdc, start.x, start.y, NULL);
    ↪ 시작할 위치
    LineTo(hdc, end.x, end.y);
    ↪ 끝낼 위치

3) 마우스 캡쳐 해제 ReleaseCapture()

case WM_LBUTTONUP:
{
	ReleaseCapture();
    
    return 0;
}
  • 마우스에서 손가락을 떼면 마우스 캡쳐가 해제된다.

0개의 댓글