내장형 하드웨어/WINAPI

WINAPI - RopMode2 실습

동화다아아 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;
}


- 실행 결과