반응형
0. InvalidateRect
우선 지속전인 화면 표시를 위해서는 InvalidateRect 라는 함수가 필요합니다.
해당 함수는 특정 영역을 업데이트 (다시 그리는)는 함수입니다.
BOOL InvalidateRect( _In_ HWND hWnd, _In_ const RECT *lpRect, _In_ BOOL bErase ); |
매게 변수 | 의미 |
hWnd | 업데이트할 윈도우의 핸들값을 입력합니다. 해당부분이 NULL일 경우 모든 윈도우를 다시 그립니다. |
*lpRect | 업데이트할 영역을 설정합니다. RECT 구조의 좌표로 입력할 경우 해당 영역에 , NULL 일 경우 전체 영역이 설정됩니다. |
bErase | 영역안에 배경이 업데이트 될때 제거될 것인지의 여부를 결정합니다. 값이 true이면 BeginPaint 함수가 호출될 때 배경이 제거됩니다. 값이 false면 배경을 변경되지 않습니다. |
1. 키보드 입력 처리
다음 예제는 키보드 왼쪽과 오른쪽 화살표를 누르면 해당 방향으로 5만큼씩 이동하는 예제입니다.
전역변수로 REC _rc를 통해 그릴 사각형의 위치를 미리 지정하였습니다.
RECT _rc = { 200, 200 , 300 , 300}; // (전역 변수)
....
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch (iMessage)
{
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
Rectangle(hdc, _rc.left, _rc.top, _rc.right, _rc.bottom);
EndPaint(hWnd, &ps);
}
break;
case WM_KEYDOWN:
switch (wParam)
{
case VK_LEFT:
{
_rc.left -= 5;
_rc.right -= 5;
InvalidateRect(hWnd, NULL, true);
break;
}
case VK_RIGHT:
{
_rc.left += 5;
_rc.right += 5;
InvalidateRect(hWnd, NULL, true);
break;
}
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return (DefWindowProc(hWnd, iMessage, wParam, lParam));
}
WM_KEYDOWN Message에 wParam 값으로 Virtual - Key Codes를 사용했습니다.
2. 마우스 입력 처리
마우스를 움직이면 해당 커서의 좌표가 화면 왼쪽 상단에 출력되는 예제입니다.
역시 WM_MOUSEMOVE Message를 통해 마우스의 움직일때를 처리했으며, lParam 값을 통해서
LOWORD(lParam) , HIWORD(lParam) 매크로 값을 전달 받아서 POINT 구조체에 담아 출력했습니다.
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
static POINT ptMouse;
switch (iMessage)
{
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
TCHAR str[100];
wsprintf(str , TEXT("마우스 X 좌표 = %d , 마우스 Y 좌표 = %d") , ptMouse.x , ptMouse.y);
TextOut(hdc , 10 , 20, str , lstrlen(str) );
EndPaint(hWnd, &ps);
break;
}
case WM_MOUSEMOVE:
{
ptMouse.x=LOWORD(lParam);
ptMouse.y=HIWORD(lParam);
InvalidateRect(_hWnd, NULL, true);
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return (DefWindowProc(hWnd, iMessage, wParam, lParam));
}
3. 마우스 복합 입력 처리
마우스가 움직이는 중에 왼쪽 클릭이라든지 하는 부분들을 처리할떄 사용할 수 있는 예제입니다.
마우스가 움직이는 도중에 wParam 값에 Virtual - Key Codes 값을 주었습니다.
(https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd375731(v=vs.85).aspx)
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
static POINT ptMouse;
switch (iMessage)
{
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
TCHAR str[100];
wsprintf(str , TEXT("마우스 X 좌표 = %d , 마우스 Y 좌표 = %d") , ptMouse.x , ptMouse.y);
TextOut(hdc , 10 , 20, str , lstrlen(str) );
EndPaint(hWnd, &ps);
break;
}
case WM_MOUSEMOVE:
{
switch(wParam)
{
case VK_LBUTTON:
{
ptMouse.x=LOWORD(lParam);
ptMouse.y=HIWORD(lParam);
InvalidateRect(_hWnd, NULL, true);
break;
}
}
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return (DefWindowProc(hWnd, iMessage, wParam, lParam));
}
반응형
'프로그래밍 관련 > Win API' 카테고리의 다른 글
WIndows API - #9 -1. 그래픽 처리 (Old를 같이 쓰는 이유) (1) (0) | 2015.09.03 |
---|---|
WIndows API - #8. 충돌 처리 (사각형 , 원형 , 마우스) - 작성 중.. (0) | 2015.09.01 |
WIndows API - #6. API 문자열 출력 함수들에 관하여.. (0) | 2015.08.24 |
WIndows API - #5. 윈도우 문자열 (0) | 2015.08.24 |
WIndows API - #4. 윈도우창 출력 함수 자세히보기(2) (0) | 2015.08.23 |