본문 바로가기
프로그래밍/API

API-마우스입력

by 리뷰하는 (게임)프로그래머_리프TV 2010. 4. 21.


마우스 입력을 처리하는 예제,

#include <windows.h>

LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("Mouse");

int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
					 LPSTR lpszCmdParam, int nCmdShow )
{
	HWND hWnd;
	MSG Message;
	WNDCLASS WndClass;
	g_hInst = hInstance;

	WndClass.cbClsExtra = 0;
	WndClass.cbWndExtra = 0;
	WndClass.hbrBackground = (HBRUSH)GetStockObject( COLOR_WINDOW+1 );
	WndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
	WndClass.hIcon = LoadIcon( NULL, IDI_APPLICATION );
	WndClass.hInstance = hInstance;
	WndClass.lpfnWndProc = WndProc;
	WndClass.lpszClassName = lpszClass;
	WndClass.lpszMenuName = NULL;
	WndClass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;	// 더블 클릭을 하기 위한 CS_DBLCLKS
	// 더블 클릭을 따로 스타일에서 지정해 주는 이유는,
	// 프로그래머가 3연속 클릭이라던가,
	// 무한 클릭으로 수치변경같은걸 해준다고 했을때,
	// 그것 클릭의 연장이 아닌,
	// 더블클릭으로 봐선 안되기 때문이다.
	RegisterClass( &WndClass );

	hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
		NULL, (HMENU)NULL, hInstance, NULL );
	ShowWindow( hWnd, nCmdShow );

	while( GetMessage( &Message, NULL, 0, 0 ) )
	{
		TranslateMessage( &Message );
		DispatchMessage( &Message );
	}
	return (int)Message.wParam;
}

LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{
	HDC hdc;
	static int x;			// 마우스의 x,y
	static int y;
	static BOOL bNowDraw = FALSE;	// 현재 마우스 버튼이 눌려 있는가?
	
	switch( iMessage )
	{
	case WM_LBUTTONDOWN:	// 최초 왼쪽 버튼이 눌리면
		x = LOWORD( lParam );		// 마우스의 x, y 를 받아 오고
		y = HIWORD( lParam );
		bNowDraw = TRUE;			// 마우스가 현재 눌려 있다고 말한다.
		return 0;
	case WM_MOUSEMOVE:				// 마우스가 이동할때
		if( bNowDraw == TRUE )		// 현재 마우스 왼쪽 버튼이 눌려 있는 상황이면
		{
			hdc = GetDC( hWnd );
			MoveToEx( hdc, x, y, NULL );	// 마우스의 x,y로 cp를 변경하고
			x = LOWORD( lParam );			// 마우스가 이동할때 마다 x, y 좌표를 갱신
			y = HIWORD( lParam );
			LineTo( hdc, x, y );		// 화면에 라인을 그려준다.
			ReleaseDC( hWnd, hdc );
		}
		return 0;
	case WM_LBUTTONUP:		// 마우스 버튼을 때면,
		bNowDraw = FALSE;	// 마우스 왼쪽 버튼이 떨어졌다고 변경한다.
		return 0;
	case WM_LBUTTONDBLCLK:		// 더블 클릭을 누르면
		InvalidateRect( hWnd, NULL, TRUE );	// 화면 무효화를 실행(화면을 지우게 될 것이다.)
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return( DefWindowProc( hWnd, iMessage, wParam, lParam));
}​


//실행 화면


설명 : 마우스 왼쪽 버튼을 누르고 움직이면 선이 그어지고, 더블 클릭을 하면 화면을 지운다.(무효화에 대한 처리는 되어있지 않음)

'프로그래밍 > API' 카테고리의 다른 글

API-2개의 타이머  (0) 2010.04.21
API-타이머  (0) 2010.04.21
API-Key입력(2)  (0) 2010.04.21
API-Key입력(1)  (0) 2010.04.21
API-MessageBox  (0) 2010.04.19