9/5 API Mouse

정수현·2024년 9월 5일

API Programming

목록 보기
7/10

마우스 (Mouse)

마우스 관련 정보

GetSystemMetrics()


윈도우의 명칭

  • Client 영역
    : 마우스, 키보드 입력을 받고 출력을 보여주기 위한 영역

  • Non Client 영역
    : Client 이외의 영역 ex) 캡션바, 메뉴, 최대화, 닫기버튼 등


물리 좌표계

⑴ 클라이언트 좌표계 : 윈도우 클라이언트 영역의 좌상단을 기준 (0,0)으로 한 좌표계
⑵ 윈도우 좌표계 : 윈도우의 좌상단을 기준 (0,0)으로 한 좌표계
⑶ 스크린 좌표계 : 모니터의 좌상단을 기준 (0,0)으로 한 좌표계

  • 클라이언트 좌표 ⇆ 스크린 좌표 변환 함수
    ClientToScreen()
    ScreenToClient()

마우스 메시지

마우스 부가 정보 [ 클라이언트 영역 ]

⑴ 마우스 메시지 발생 → (당시의) 마우스 좌표 → lParam
⑵ 마우스 버튼 상태 & 키보드 조합 키(Shift,Ctrl) → wParam

LBUTTONDOWN:
{
	POINTS pt = MAKEPOINTS(lParam);
    POINT pt1 = { LOWORD(lParam), HIWORD(lParam) };
}

즉, WM_LBUTTONDOWNlParam에 클라이언트 좌표가 전달된다.

마우스 부가 정보 [ 비클라이언트 영역 ]

⑴ 마우스 메시지 발생 → 윈도우 좌표 → lParam
⑵ hit-test code → wParam


Hit Test Code

  • Hit Test Code
    : 현재 커서가 윈도우 어느 부분에 있는지 알려준다.

  • WM_NCHITTEST 메시지
    : 마우스 이벤트 발생 시 가장 먼저 발생되는 메시지
    WM_NCHITTEST 메시지는 DefWindowProc()로 전달된다.
    DefWindowProc()는 커서의 좌표를 조사해 Hit Test Code를 리턴한다.

case WN_NCHITTEST:
{
	DWORD code = DefWindowProc(hwnd, msg, wParam, lParam);
    
    if(code == HTCLIENT && GetkeyState(VK_CONTROL) < 0)
    {
    	code = HTCAPTION;
    }
    else if (code == HTLEFT)
    	code = HTRIGHT;
    
    return code;
}
  • if
    code == HTCLIENT : 현재 마우스 위치가 Client 영역에 있는가
    GetkeyState(VK_CONTROL) > 0 : 현재 Ctrl 키가 눌러졌는가
    ↪ TRUE면, code = HTCAPTION; : HitTestCode 변경

이거 코드 무슨 뜻 ??

  • else if
    code == HTLEFT :
    ↪ TRUE면, code = HTRIGHT :

0개의 댓글