WINAPI - RopMode2 실습
내장형 하드웨어/WINAPI / 2011. 9. 9. 23:52
#include "MsgProc.h"
#include "resource.h"
int sx, sy, oldx, oldy;
int iMenu;
BOOL bNowDraw = FALSE;
LRESULT OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
return 0;
}
LRESULT OnCommand(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
switch(LOWORD(wParam))
{
case ID_FILE_MENU1: // 자유 곡선 모드
iMenu = 1;
break;
case ID_FILE_MENU2: // 선 모드
iMenu = 2;
break;
case ID_FILE_MENU3: // 원 모드
iMenu = 3;
break;
case ID_FILE_MENU4: // 사각형 모드
iMenu = 4;
break;
case ID_FILE_EXIT:
DestroyWindow(hWnd);
break;
}
return 0;
}
LRESULT OnLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
sx = LOWORD(lParam); // 각 좌표가 저장되고 이것을 다시 oldx에 삽입
sy = HIWORD(lParam); // 처음 마우스를 누른 위치
oldx = sx;
oldy = sy;
bNowDraw = TRUE; // 그림을 그린다.
return 0;
}
LRESULT OnMouseMove(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
hdc = GetDC(hWnd);
switch(iMenu)
{
case 1:
if(bNowDraw==TRUE)
{
MoveToEx(hdc,sx, sy, NULL);
sx = LOWORD(lParam);
sy = HIWORD(lParam);
LineTo(hdc, sx, sy);
ReleaseDC(hWnd, hdc);
}
break;
case 2:
if(bNowDraw)
{
SetROP2(hdc, R2_NOT); // 반전모드 이용
MoveToEx(hdc, sx, sy, NULL);
LineTo(hdc, oldx, oldy); // oldx = sx, oldy = sy
oldx = LOWORD(lParam); // 새로운 값을 읽는다.(MouseMove된 현재 좌표)
oldy = HIWORD(lParam); // 지워져야 할 선의 끝 좌표
MoveToEx(hdc, sx, sy, NULL); // 마우스 클릭시 현재 좌표
LineTo(hdc, oldx, oldy); // 최종 이동된 좌표
ReleaseDC(hWnd, hdc);
}
break;
case 3:
if(bNowDraw)
{
SetROP2(hdc,R2_NOTXORPEN);
Ellipse(hdc, sx, sy, oldx, oldy); // oldx = sx, oldy = sy
oldx = LOWORD(lParam); // 새로운 값을 읽는다.(MouseMove된 현재 좌표)
oldy = HIWORD(lParam); // 지워져야 할 선의 끝 좌표
SelectObject(hdc, GetStockObject(NULL_BRUSH));
Ellipse(hdc, sx, sy, oldx, oldy); // oldx = sx, oldy = sy
ReleaseDC(hWnd, hdc);
}
break;
case 4:
if(bNowDraw)
{
SetROP2(hdc,R2_NOTXORPEN);
Rectangle(hdc, sx, sy, oldx, oldy); // oldx = sx, oldy = sy
oldx = LOWORD(lParam); // 새로운 값을 읽는다.(MouseMove된 현재 좌표)
oldy = HIWORD(lParam); // 지워져야 할 선의 끝 좌표
SelectObject(hdc, GetStockObject(NULL_BRUSH));
Rectangle(hdc, sx, sy, oldx, oldy); // oldx = sx, oldy = sy
ReleaseDC(hWnd, hdc);
}
break;
}
return 0;
}
LRESULT OnLButtonUp(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
hdc = GetDC(hWnd);
switch(iMenu)
{
case 1:
bNowDraw = FALSE;
break;
case 2:
bNowDraw = FALSE;
MoveToEx(hdc, sx, sy, NULL);
LineTo(hdc, oldx, oldy);
ReleaseDC(hWnd, hdc);
break;
case 3:
bNowDraw = FALSE;
SelectObject(hdc, GetStockObject(NULL_BRUSH));
Ellipse(hdc, sx, sy, oldx, oldy);
ReleaseDC(hWnd, hdc);
break;
case 4:
bNowDraw = FALSE;
SelectObject(hdc, GetStockObject(NULL_BRUSH));
Rectangle(hdc, sx, sy, oldx, oldy);
ReleaseDC(hWnd, hdc);
break;
}
return 0;
}
LRESULT OnLbuttonDblclk(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
InvalidateRect(hWnd, NULL, TRUE); // 화면 클리어
return 0;
}
LRESULT OnDestroy(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
PostQuitMessage(0);
return 0;
}
- 실행 결과
'내장형 하드웨어 > WINAPI' 카테고리의 다른 글
WINAPI - Font (0) | 2011.09.16 |
---|---|
WINAPI - 비트맵 출력, 메모리 DC (0) | 2011.09.15 |
WINAPI - 그리기 모드 (0) | 2011.09.09 |
WINAPI - 그래픽(색상) (0) | 2011.09.08 |
WINAPI - 그래픽(GDI 오브젝트) (0) | 2011.09.07 |