Notice
Recent Posts
관리 메뉴

Hacking Arts

마우스 입력 본문

Programing/API Programing

마우스 입력

Rakehell 2014. 10. 10. 22:35

<입력>

- 마우스 이벤트

이전에 WM_LBUTTONDOWN 같은 프로시져에 이벤트를 봤을 것이다. 여러가지 종류가 있다. 근데 이벤트만 발생시키면 너무 정보가 부족하다. 그리고 우리는 윈 프로시져에 lParam이라는 요소가 무엇을 하는지 궁금했을 것인데 이거에 대해 말해 보겠다. 


[ 그림 1 lParam ]

- lParam은 그림과 같은 구조를 가졌다. 이 좌표가 이벤트가 발생한 지역의 포인터를 가지고 있는다.  


그다음은 wParam 값 이다. wParam은 키조합 이벤트를 관리하는데. ctrl 키나 shift키를 누르면서 동시에 다른 것을 할때 복합적으로 정보를 가지게 된다.


[ 그림 2 마우스 이벤트 결과 ]


- 위 그림 2와 같이 출력이 되게 하는 함수 소스

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	static int nX = 0, nY = 0;
	static TCHAR strTemp[MAX_PATH];

	switch (iMessage)
	{
	case WM_CREATE:
		wcscpy(strTemp, L"");
		return 0;
	case WM_LBUTTONDOWN:
		nX = LOWORD(lParam);
		nY = HIWORD(lParam);
		wsprintf(strTemp, L"좌표 (%d,%d), 키보드 조합 상태 : %d", nX, nY, wParam);
		InvalidateRect(hWnd, NULL, TRUE);
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		TextOut(hdc, nX, nY, strTemp, wcslen(strTemp));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}

소스 코드를 보면 strcmp에 출력 문자열을 저장하고 wsprintf로 출력물을 strcmp에 저장한다. 그리고 HIWORD와 LOWRORD는 위 그림을 보면 이해 했을거라고 생각된다. 그렇게 된걸 TextOut이 출력을 하게 해주는 것이다. 그렇다면 InvalidateRect는 무엇을 할까 원래 WM_LBUTTONDOWN같은 이벤트는 출력물이 지워져도 다시 그려주지 않는다. 유일하게 WM_PAINT많이 출력물이 지워지면 다시 그려주는데 이때 InvalidateRect는 WM_PAINT를 호출하는 함수역할을 하게된다.


- 클라이언트 영역과 비클라이언트 영역

클라이언트 영역에 대해서는 이전에 점,선 출력쪽에서 말했었다. 메뉴바나 타이틀바, 즉 메모장에서 텍스트를 작성하는 겉부분의 회색부분들을 비클라이언트 영역이라고 생각하면되고 안에 흰색부분을 클라이언트 영역이라고 생각하면 된다. 그런데 클라이언트 영역과 비클라이언트 영역의 마우스 이벤트가 발생했을 때 다른 값을 가진다. WM_XXX로 시작하게 되면 클라이언트 영역에서 발생하게 된 이벤트이고 WM_NCXXXX로 발생하게 되면 비클라이언트 영역에서 발생한 이벤트라고 생각하면 된다.


- 더블 클릭

마우스 이벤트에서 더블 클릭이 생기게 하려면 이전에 WndClass.style 부분에 CS_DBLCLKS라는 값을 넣어주어야 한다. 그래야만 더블클릭 메시지를 사용한다고 안다고 한다. 


[ 그림 3 더블 클릭 ]

더블 클릭의 경우는 버튼 클릭 이벤트가 발생후 일정 시간 뒤에 다시 발생하면 더블 클릭으로 인식하게 되는 것이다. 위 그림은 더블 클릭시 밑줄이 쳐지는 것을 볼 수 있다.


- 마우스 캡쳐 : 마우스가 윈도우 영역을 벗어나 이동을 했을 경우에도 마우스의 위치를 알아내는 것을 말한다. 


-참고 자료

API Programing / 이창현 / 혜지원

'Programing > API Programing' 카테고리의 다른 글

타이머  (0) 2014.10.11
키보드 입력  (0) 2014.10.10
문자열 / 점 / 선 / 사각형 / 원 / 다각형 / 메시지 박스  (0) 2014.10.10
출력 / GDI / DC  (0) 2014.10.10
APIENTRY와 CALLBACK, WndProc  (0) 2014.09.28