마우스 입력을 처리하는 예제,
#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 |