ù ¹øÂ° ¿¹Á¦ÀÎ ApiDraw01Àº ÀüÇüÀûÀÎ API ÇÁ·ÎÁ§Æ®ÀÇ ÇüŸ¦ Çϰí ÀÖ´Ù. ¸Þ´º¿¡¼ ±×¸®°íÀÚ ÇÏ´Â µµÇüÀ» ¼±ÅÃÇÑ ÈÄ ¸¶¿ì½º·Î µå·¡±×ÇÏ¿© Á÷¼±, »ç°¢Çü, Ÿ¿ø µîÀ» ±×¸®´Â Á¤µµÀÇ ±â´É¸¸ °¡Áö°í ÀÖ´Ù. 6ÀåÀÇ RopMode ¿¹Á¦¿Í À¯»çÇϹǷΠRopMode ¿¹Á¦¸¦ ÀÌÇØÇß´Ù¸é ÀÌ ¿¹Á¦ Á¤µµ´Â ¾î·ÆÁö ¾Ê°Ô ÀÌÇØ°¡ µÉ °ÍÀÌ´Ù. ´Ù¸¸ ÀÌ ¿¹Á¦´Â Â÷ÈÄÀÇ È®À强À» °í·ÁÇÏ¿© À©µµ¿ì ±¸Á¶³ª º¯¼öÀÇ Å¸ÀÔ ¼³°è¸¦ È®Àå °¡´ÉÇϵµ·Ï Çß´Ù´Â Á¤µµ°¡ ´Ù¸£´Ù. Àüü ¼Ò½º´Â ´ÙÀ½°ú °°´Ù.
#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK CanvasProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT("ApiDraw");
// ŸÀÔ ¹× Àü¿ª º¯¼ö
HWND hCanvas;
enum DTool { DT_LINE, DT_ELLIPSE, DT_RECTANGLE };
enum DMode { DM_NONE, DM_DRAW };
DTool NowTool;
DMode DragMode;
int sx,sy,oldx,oldy;
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=NULL;
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=WndProc;
WndClass.lpszClassName=lpszClass;
WndClass.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);
WndClass.style=0;
RegisterClass(&WndClass);
WndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
WndClass.lpfnWndProc=CanvasProc;
WndClass.lpszClassName="Canvas";
WndClass.lpszMenuName=NULL;
WndClass.style=CS_DBLCLKS;
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,0,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int)Message.wParam;
}
// ¸ÞÀÎ À©µµ¿ìÀÇ ¸Þ½ÃÁö ó¸® ÇÔ¼ö
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
switch(iMessage) {
case WM_CREATE:
hWndMain=hWnd;
hCanvas=CreateWindow("Canvas",NULL,WS_CHILD | WS_VISIBLE,
0,0,0,0,hWnd,(HMENU)0,g_hInst,NULL);
return 0;
case WM_SIZE:
if (wParam != SIZE_MINIMIZED) {
MoveWindow(hCanvas,0,0,LOWORD(lParam),HIWORD(lParam),TRUE);
}
return 0;
case WM_COMMAND:
switch(LOWORD(wParam)) {
case IDM_SHAPE_LINE:
NowTool=DT_LINE;
break;
case IDM_SHAPE_ELLIPSE:
NowTool=DT_ELLIPSE;
break;
case IDM_SHAPE_RECTANGLE:
NowTool=DT_RECTANGLE;
break;
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
// ĵ¹ö½º À©µµ¿ìÀÇ ¸Þ½ÃÁö ó¸® ÇÔ¼ö
LRESULT CALLBACK CanvasProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
int ex,ey;
HDC hdc;
switch(iMessage) {
case WM_CREATE:
NowTool=DT_LINE;
DragMode=DM_NONE;
return 0;
case WM_LBUTTONDOWN:
sx=LOWORD(lParam);
sy=HIWORD(lParam);
oldx=sx;
oldy=sy;
DragMode=DM_DRAW;
SetCapture(hWnd);
return 0;
case WM_MOUSEMOVE:
ex=(int)(short)LOWORD(lParam);
ey=(int)(short)HIWORD(lParam);
if (DragMode==DM_DRAW) {
hdc=GetDC(hWnd);
SetROP2(hdc,R2_NOTXORPEN);
SelectObject(hdc,GetStockObject(NULL_BRUSH));
switch (NowTool) {
case DT_LINE:
MoveToEx(hdc,sx,sy,NULL);
LineTo(hdc,oldx,oldy);
MoveToEx(hdc,sx,sy,NULL);
LineTo(hdc,ex,ey);
break;
case DT_ELLIPSE:
Ellipse(hdc,sx,sy,oldx,oldy);
Ellipse(hdc,sx,sy,ex,ey);
break;
case DT_RECTANGLE:
Rectangle(hdc,sx,sy,oldx,oldy);
Rectangle(hdc,sx,sy,ex,ey);
break;
}
oldx=ex;
oldy=ey;
ReleaseDC(hWnd,hdc);
}
return 0;
case WM_LBUTTONUP:
DragMode=DM_NONE;
ReleaseCapture();
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
WinMain¿¡¼ µÎ °³ÀÇ À©µµ¿ì Ŭ·¡½º¸¦ µî·ÏÇϰí Àִµ¥ ¸ÞÀÎ À©µµ¿ì¿Ü¿¡ ĵ¹ö½º¸¦ À§ÇÑ À©µµ¿ì Ŭ·¡½º¸¦ µû·Î µî·ÏÇß´Ù. ¸ÞÀÎ À©µµ¿ì´Â WM_CREATE¿¡¼ ĵ¹ö½º¸¦ »ý¼ºÇϸç WM_SIZE¿¡¼ ĵ¹ö½º¸¦ ÀÚ½ÅÀÇ ÀÛ¾÷ ¿µ¿ª Àüü¿¡ °¡µæ ä¿î´Ù. ÀÌ ¿Ü¿¡ ¸ÞÀÎ À©µµ¿ì°¡ ÇÏ´Â ÀÏÀ̶ó°í´Â ¸Þ´º°¡ ¼±ÅÃµÉ ¶§ ±×¸®±â µµ±¸¸¦ ¹Ù²Ù´Â °Í Á¤µµ »ÓÀÌ´Ù. ¸¶¿ì½º·ÎºÎÅÍ µµÇüÀ» »ý¼ºÇÏ°í ±×¸®´Â ¸ðµç µ¿ÀÛÀº ĵ¹ö½º°¡ Çϵµ·Ï µÇ¾î ÀÖ´Ù.
°á±¹ ¸ÞÀÎ À©µµ¿ì´Â ĵ¹ö½º¸¦ ´ã´Â ²®µ¥±â ³ë¸©À» ÇÒ »ÓÀÌ¸ç ±× ÀÚü°¡ ÇÁ·Î±×·¥ÀÇ ±â´ÉÀ» Á÷Á¢ Á¦°øÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. ¿Ö ÀÌ·± ½ÄÀ¸·Î ĵ¹ö½º À©µµ¿ì¸¦ µû·Î ºÐ¸®Çϴ°¡ Çϸé Â÷ÈÄÀÇ È®À强°ú °ü¸®ÀÇ Æí¸®¸¦ À§ÇؼÀÌ´Ù. ÇöÀç »óȲ¿¡¼´Â ¸ÞÀÎ À©µµ¿ì°¡ Á÷Á¢ ±×·¡ÇÈ °´Ã¼¸¦ °ü¸®Çصµ ¾Æ¹«·± ¹®Á¦°¡ ¾ø´Ù. ±×·¯³ª Åø¹Ù³ª ÆÈ·¹Æ® µîÀÌ Ãß°¡µÉ ¶§´Â »óȲÀÌ ´Þ¶óÁø´Ù.
¿ÞÂÊ ±×¸²Ã³·³ Â÷Àϵ尡 ¾øÀ» ¶§´Â ¸ÞÀÎ À©µµ¿ìÀÇ ÀÛ¾÷ ¿µ¿ªÀ» ±âÁØÀ¸·Î ±×·¡ÇÈ °´Ã¼ÀÇ ÁÂÇ¥¸¦ ÀúÀåÇÏ¸é µÈ´Ù. ÀÌ »óÅ¿¡¼ (100,100)Àº ÀÛ¾÷ ¿µ¿ª Á»ó´ÜÀ» ±âÁØÀ¸·Î (100,100) ÁÂÇ¥°¡ µÉ °ÍÀÌ´Ù. ±×·¯³ª ¿À¸¥ÂÊ ±×¸²Ã³·³ Åø¹Ù³ª ÆÈ·¹Æ®µéÀÌ ¹èÄ¡µÇ¸é ÀÌ·± Â÷Àϵ嵵 ¸ÞÀÎ À©µµ¿ìÀÇ ÀÛ¾÷ ¿µ¿ª¿¡ ¹èÄ¡µÇ¹Ç·Î ±×·¡ÇÈ °´Ã¼¿¡ ÀúÀåµÈ ÁÂÇ¥¸¦ ±×´ë·Î ¾µ ¼ö ¾ø°í Â÷ÀϵåµéÀÇ ÁÂÇ¥¸¦ °è»ê¿¡ Æ÷ÇÔ½ÃÄÑ¾ß ÇÑ´Ù. °´Ã¼¸¦ ±×¸± ¶§ »Ó¸¸ ¾Æ´Ï¶ó ¸¶¿ì½º ¸Þ½ÃÁöÀÇ ÀμöµéÀ» ÇØ¼®ÇÒ ¶§µµ Â÷Àϵ带 °í·ÁÇØ¾ß ÇϹǷΠ¹«Ã´ ºÒÆíÇÏ´Ù.
±×¸²À» ±×¸®´Â ĵ¹ö½º À©µµ¿ì¸¦ µû·Î ¸¸µé°í ĵ¹ö½ºÀÇ ÀÛ¾÷ ¿µ¿ª¿¡ ±×¸®±â¸¦ Çϸé ÀÌÈÄ Åø¹Ù³ª ÆÈ·¹Æ®µéÀÌ Ãß°¡µÇ´õ¶óµµ ÁÂÇ¥¸¦ Á¶Á¤ÇÒ Çʿ䰡 ¾ø´Ù. ¸ÞÀÎ À©µµ¿ì´Â ĵ¹ö½º, Åø¹Ù µîÀ» ¸¶À½´ë·Î Àç¹èÄ¡ÇÒ ¼ö ÀÖ´Â ÀÚÀ¯°¡ »ý±â´Â °ÍÀÌ´Ù. ÀÌ·± ÀÌÀ¯·Î ĵ¹ö½º¸¦ µû·Î ¸¸µé°í ¸ðµç ±×¸®±â µ¿ÀÛÀº ĵ¹ö½º°¡ Àü´ãÇϵµ·Ï Çß´Ù.
´ÙÀ½Àº Àü¿ª º¯¼öµéÀ» º¸ÀÚ. DTool ¿°ÅÇü ŸÀÔÀº ±×¸®±â µµ±¸µéÀ̸ç ÇöÀç Á÷¼±, Ÿ¿ø, »ç°¢Çü µîÀÌ Á¤ÀǵǾî ÀÖ´Ù. DToolÇüÀÇ NowToolÀÌ ÇöÀç ±×¸®±â µµ±¸¸¦ ±â¾ïÇϸç ÀÌ °ªÀº ¶ÇÇÑ µµÇüÀÇ Å¸ÀÔ ½Äº°Àڷεµ »ç¿ëµÈ´Ù. DMode ¿°ÅÇüÀº ¸¶¿ì½º°¡ ÇöÀç ¹«¾ùÀ» Çϰí ÀÖ´Â ÁßÀΰ¡¸¦ ±â¾ïÇϸç ÁÖ·Î WM_MOUSEMOVE¿¡¼ ÀÌ °ªÀ» ÂüÁ¶ÇÑ´Ù. sx, sy´Â µµÇüÀ» ±×¸®±â À§ÇØ µå·¡±×¸¦ ½ÃÀÛÇÑ ÁÂÇ¥À̸ç oldx, oldy´Â µå·¡±× ÁßÀÇ ÁÂÇ¥ÀÌ´Ù. ÀÌ º¯¼öÀÇ ¿ëµµ´Â RopMode ¿¹Á¦¿Í µ¿ÀÏÇÏ´Ù.
ĵ¹ö½º À©µµ¿ìÀÇ ÇÁ·Î½ÃÀú¿¡´Â ¸¶¿ì½º·Î µµÇüÀ» ±×¸®´Â ÀϹÝÀûÀÎ ÄÚµåµéÀÌ ÀÛ¼ºµÇ¾î ÀÖ´Ù. ¸¶¿ì½º ¿ÞÂÊ ¹öưÀ» ´©¸¦ ¶§ µå·¡±× ½ÃÀÛÁ¡À» sx, sy¿¡ ÀúÀåÇØ µÎ°í ¸¶¿ì½º À̵¿½Ã ¹ÝÀü ±×¸®±â ¸ðµå·Î µµÇüÀ» º¸¿©ÁÖ´Ù°¡ ¸¶¿ì½º ¹öưÀ» ³õÀ» ¶§ µµÇüÀ» È®Á¤Áþ´Â ¹æ½ÄÀÌ´Ù. ÀÌ ¿¹Á¦´Â RopMode ¿¹Á¦¿¡ ºñÇØ µÎ °¡Áö ¸é¿¡¼ ´Ù¸¥µ¥ ¿ì¼± ±×¸®±â ¸ðµå°¡ R2_NOTÀÌ ¾Æ´Ñ R2_NOTXORPENÀ̶ó´Â Á¡ÀÌ ´Ù¸¥µ¥ ÀÌ ÇÁ·Î±×·¥Àº Èæ¹éÀÌ ¾Æ´Ñ »ö»óÀÌ ÀÖ´Â µµÇüµµ ±×·Á¾ß Çϱ⠶§¹®ÀÌ´Ù.
¶ÇÇÑ WM_LBUTTONUP¿¡¼ µµÇüÀ» ´Ù½Ã Çѹø ±×¸®Áö ¾ÊÀ½À¸·Î½á ÀÓ½ÃÀûÀ¸·Î ±×·ÁÁø µµÇüÀ» È®Á¤ÁþÁö ¾Ê¾Æ µµÇü³¢¸® °ãÃÄÁø ºÎºÐÀÌ ¹ÝÀüµÈ »óÅ·Π³²¾Æ ÀÖ´Â ¹®Á¦°¡ ÀÖ´Ù. ÀÌ ¹®Á¦´Â ±×¸®±â Á¤º¸°¡ ÀúÀåµÇ°í ±×·¡ÇÈ °´Ã¼¸¦ ´Ù½Ã º¹±¸ÇÒ ¼ö ÀÖ°Ô µÇ¸é ÀÚ¿¬½º·´°Ô ÇØ°áµÇ¹Ç·Î °ÆÁ¤ÇÏÁö ¾Ê¾Æµµ µÈ´Ù.