Programming Language/Windows API
마우스로 도형 옮기기
1. 마우스로 드래그해서 원 옮기기
[1] 마우스가 클릭되었을 때의 좌표가 원 내에 있는지 확인
[2] 원 내에 있다면 WM_MOUSEMOVE 메세지가 발생했을 때 원의 좌표를 마우스 좌표로 변경
[3] 마우스 드래그 중일 때는 원의 색상을 빨간색으로 변경
2. 소스
1) 윈도우 메세지 처리함수
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
PAINTSTRUCT ps;
HDC hdc;
static int x, y;
//원의 좌표
int mx, my;
//마우스의 좌표
static BOOL flag;
//마우스가 원의 영역안에 있는지 상태
case WM_CREATE:
{
x = 250;
y = 250;
//처음 원의 위치
flag = FALSE;
//처음 상태는 클릭되어있지 않으므로 FALSE
}
break;
case WM_LBUTTONDOWN:
{
mx = LOWORD(lParam);
//마우스의 x좌표를 mx에 저장
my = HIWORD(lParam);
//마우스의 y좌표를 my에 저장
if (InCircle(x, y, mx, my)) {
//원의 영역내에 있다면
flag = TRUE;
}
InvalidateRgn(hWnd, NULL, TRUE);
}
break;
case WM_LBUTTONUP:
{
flag = FALSE;
//마우스버튼을 떼면 FALSE로 변경
InvalidateRgn(hWnd, NULL, TRUE);
}
break;
case WM_MOUSEMOVE:
{
mx = LOWORD(lParam);
//마우스의 x좌표를 mx에 저장
my = HIWORD(lParam);
//마우스의 y좌표를 my에 저장
if (flag) {
x = mx;
y = my;
//마우스 좌표를 원의 좌표로 변경
InvalidateRgn(hWnd, NULL, TRUE);
//해당 창번호의 영역전체를 무효화 후 다시 그리기
}
}
break;
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
// 메뉴 선택을 구문 분석합니다:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
my_paint(hdc, &flag, &x, &y);
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
2) 사용자 정의함수
#include<math.h>
#define BSIZE 50
//반지름
double LengthPts(int x1, int y1, int x2, int y2) {
return sqrt((float)((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1)));
//피타고라스 정의를 이용하여 원의 중심으로부터 마우스포인터까지 거리를 반환
}
BOOL InCircle(int x, int y, int mx, int my) {
if (LengthPts(x, y, mx, my) < BSIZE) {
//원의 중심으로부터 반지름 내 거리에 있다면
return TRUE;
}
else {
return FALSE;
}
}
void my_paint(HDC hdc, BOOL *flag, int *x, int *y) {
HBRUSH hBrush;
if (*flag) {
//Rectangle(hdc, *x - 50, *y - 50, *x + 50, *y + 50);
hBrush = CreateSolidBrush(RGB(255, 0, 0));
//빨간색을 얻어와 HBRUSH 타입의 hBrush에 저장
SelectObject(hdc, hBrush);
//창의 속성 중 BRUSH를 hBrush로 변경
}
else {
SelectObject(hdc, GetStockObject(WHITE_BRUSH));
//창의 속성 중 BRUSH를 흰색으로 변경
}
Ellipse(hdc, *x - 50, *y - 50, *x + 50, *y + 50);
//원 그리기
}
3. 시연
- 마우스로 드래그하여 원을 이동할 수 있다.
'Programming Language > Windows API' 카테고리의 다른 글
| 사각형 그리기 (0) | 2018.09.30 |
|---|---|
| 도형 자동이동 (0) | 2018.09.30 |
| keyboard[마지막] (0) | 2018.09.10 |
| shape (0) | 2018.08.27 |
| caret (0) | 2018.08.27 |
댓글