ApiDraw01Àº ±â´ÉÀÌ °£´ÜÇϱ⠶§¹®¿¡ ¼Ò½ºµµ ¾ÆÁÖ Âª°Ô ÀÛ¼ºµÇ¾î ÀÖ´Ù. ¸Þ½ÃÁö ó¸® ÇÔ¼ö°¡ switch ¹®À¸·Î µÇ¾î ÀÖ¾î ¾î¶² ¸Þ½ÃÁöµéÀÌ ¾î¶»°Ô 󸮵ǴÂÁö¸¦ ÇÑ´«¿¡ ¾Ë¾Æ º¼ ¼ö ÀÖ¾î¼ ÁÁ±â´Â ÇÏÁö¸¸ ÀÌ·± ¹æ½ÄÀº È®Àå¿¡ ºÒ¸®ÇÏ´Ù. ¾ÕÀ¸·Î ´õ ¸¹Àº ¸Þ½ÃÁöµéÀ» ó¸®ÇÏ°Ô µÉ °ÍÀε¥ ÀÌ ÄÚµåµéÀÌ ¸ðµÎ WndProcÀ̳ª CanvasProc¿¡ ÀÛ¼ºµÈ´Ù¸é ÇÔ¼ö°¡ ³Ê¹« ±æ¾îÁ® ¼Ò½º¸¦ ÆíÁýÇϱ⠾î·Á¿öÁø´Ù. »Ó¸¸ ¾Æ´Ï¶ó °¢ ¸Þ½ÃÁö¸¦ ó¸®Çϱâ À§ÇÑ Áö¿ª º¯¼öµéµµ ´õ ¸¹ÀÌ ÇÊ¿äÇØÁö´Âµ¥ ÀÌ º¯¼öµéÀÌ ¸ðµÎ ¸Þ½ÃÁö ó¸® ÇÔ¼öÀÇ Áö¿ª º¯¼ö°¡ µÈ´Ù¸é ¼Óµµµµ ¸¹ÀÌ ´À·ÁÁú °ÍÀÌ´Ù.
¾ÆÁÖ °£´ÜÇÑ ¿¹Á¦ ¼öÁØ¿¡¼´Â switch¹®µµ ³ª»ÚÁö ¾ÊÁö¸¸ °è¼Ó È®ÀåÇÒ ÇÁ·ÎÁ§Æ®¶ó¸é °¢ ¸Þ½ÃÁöº°·Î Àü´ã ÇÔ¼ö¸¦ Çϳª¾¿ ¸¸µå´Â °ÍÀÌ ÁÁ´Ù. ÀÌ·± °³³äÀÌ ¹Ù·Î ¸Þ½ÃÁö Å©·¡Ä¿Àε¥ ±»ÀÌ ¸Þ½ÃÁö Å©·¡Ä¿±îÁö µ¿¿øÇÏÁö ¾Ê´õ¶óµµ ÇÔ¼ö¸¸ ºÐ¸®Çصµ »ó´çÈ÷ Æí¸®ÇØÁø´Ù. ApiDraw02 ÇÁ·ÎÁ§Æ®´Â ApiDraw01 ÇÁ·ÎÁ§Æ®¿Í µ¿ÀÏÇÑ ±â´ÉÀ» À¯ÁöÇÏ¸é¼ ÇÁ·ÎÁ§Æ®ÀÇ ÇüŸ¸ º¯°æÇß´Ù. Àü´ã ÇÔ¼ö¸¦ µÎ¸é ÇÔ¼ö°¡ ³Ê¹« ±æ¾îÁöÁö ¾Ê¾Æ¼ ÁÁ°í Áö¿ª º¯¼öµµ ÀÚÀ¯·Ó°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù.
±×¸®°í ½Ç½ÀÀÇ ÆíÀǸ¦ À§ÇØ ¾ÕÀ¸·Î ó¸®ÇÏ°ÔµÉ ¸Þ½ÃÁöµé¿¡ ´ëÇØ¼µµ ¹Ì¸® Àü´ã ÇÔ¼ö¸¦ ÀÛ¼ºÇØ µÎ±â·Î ÇÏÀÚ. ¸ÞÀÎ À©µµ¿ìÀÇ ¸Þ½ÃÁö ó¸® ÇÔ¼ö´Â Main_OnÀ¸·Î ½ÃÀ۵Ǹç ĵ¹ö½ºÀÇ ¸Þ½ÃÁö ó¸® ÇÔ¼ö´Â ÀüÄ¡»ç OnÀ¸·Î¸¸ ½ÃÀÛÇϵµ·Ï Çß´Ù. ÀÌ ÀÛ¾÷Àº ´©°¡ ÇØµµ µ¿ÀÏÇϱ⠶§¹®¿¡ Á¶±ÝÀÌ¶óµµ ½Ç½À ½Ã°£À» ¹ú±â À§ÇØ ³»°¡ ¹Ì¸® ÀÛ¼ºÇØ ³õ¾Ò´Ù. ¿©·¯ºÐµéÀº ºÎÁö·±È÷ ³í¸®¸¸ »ý°¢ÇÏ°í ½Ç½À¸¸ ÇÏ¸é µÈ´Ù. Àüü ¼Ò½º´Â ´ÙÀ½°ú °°´Ù.
#include <windows.h>
#include "resource.h"
// ŸÀÔ ¹× Àü¿ª º¯¼ö
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT("ApiDraw");
HWND hCanvas;
enum DTool { DT_SELECT, DT_LINE, DT_ELLIPSE, DT_RECTANGLE, DT_TEXT,
DT_BITMAP, DT_META };
enum DMode { DM_NONE, DM_DRAW, DM_MOVE, DM_SIZE };
DTool NowTool;
DMode DragMode;
int sx,sy,oldx,oldy;
// ÇÔ¼ö ¿øÇü
LRESULT Main_OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam);
LRESULT Main_OnDestroy(HWND hWnd,WPARAM wParam,LPARAM lParam);
LRESULT Main_OnSize(HWND hWnd,WPARAM wParam,LPARAM lParam);
LRESULT Main_OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam);
LRESULT Main_OnInitMenu(HWND hWnd,WPARAM wParam,LPARAM lParam);
LRESULT Main_OnSetFocus(HWND hWnd,WPARAM wParam,LPARAM lParam);
LRESULT OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam);
LRESULT OnDestroy(HWND hWnd,WPARAM wParam,LPARAM lParam);
LRESULT OnPaint(HWND hWnd,WPARAM wParam,LPARAM lParam);
LRESULT OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam);
LRESULT OnLButtonDown(HWND hWnd,WPARAM wParam,LPARAM lParam);
LRESULT OnMouseMove(HWND hWnd,WPARAM wParam,LPARAM lParam);
LRESULT OnLButtonUp(HWND hWnd,WPARAM wParam,LPARAM lParam);
LRESULT OnKeyDown(HWND hWnd,WPARAM wParam,LPARAM lParam);
LRESULT OnSetCursor(HWND hWnd,WPARAM wParam,LPARAM lParam);
LRESULT OnSize(HWND hWnd,WPARAM wParam,LPARAM lParam);
LRESULT OnContextMenu(HWND hWnd,WPARAM wParam,LPARAM lParam);
LRESULT OnLButtonDblclk(HWND hWnd,WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK CanvasProc(HWND,UINT,WPARAM,LPARAM);
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(hInstance,MAKEINTRESOURCE(IDI_APIDRAW));
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:
return Main_OnCreate(hWnd,wParam,lParam);
case WM_DESTROY:
return Main_OnDestroy(hWnd,wParam,lParam);
case WM_SIZE:
return Main_OnSize(hWnd,wParam,lParam);
case WM_COMMAND:
return Main_OnCommand(hWnd,wParam,lParam);
case WM_INITMENU:
return Main_OnInitMenu(hWnd,wParam,lParam);
case WM_SETFOCUS:
return Main_OnSetFocus(hWnd,wParam,lParam);
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
LRESULT Main_OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
hWndMain=hWnd;
hCanvas=CreateWindow("Canvas",NULL,WS_CHILD | WS_VISIBLE,
0,0,0,0, hWnd,(HMENU)0,g_hInst,NULL);
return 0;
}
LRESULT Main_OnDestroy(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
PostQuitMessage(0);
return 0;
}
LRESULT Main_OnSize(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
if (wParam != SIZE_MINIMIZED) {
MoveWindow(hCanvas,0,0,LOWORD(lParam),HIWORD(lParam),TRUE);
}
return 0;
}
LRESULT Main_OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
switch(LOWORD(wParam)) {
case IDM_FILE_EXIT:
DestroyWindow(hWnd);
break;
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;
}
LRESULT Main_OnInitMenu(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
return 0;
}
LRESULT Main_OnSetFocus(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
return 0;
}
// ĵ¹ö½º À©µµ¿ìÀÇ ¸Þ½ÃÁö ó¸® ÇÔ¼ö
LRESULT CALLBACK CanvasProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
switch(iMessage) {
case WM_CREATE:
return OnCreate(hWnd,wParam,lParam);
case WM_DESTROY:
return OnDestroy(hWnd,wParam,lParam);
case WM_PAINT:
return OnPaint(hWnd,wParam,lParam);
case WM_COMMAND:
return OnCommand(hWnd,wParam,lParam);
case WM_LBUTTONDOWN:
return OnLButtonDown(hWnd,wParam,lParam);
case WM_MOUSEMOVE:
return OnMouseMove(hWnd,wParam,lParam);
case WM_LBUTTONUP:
return OnLButtonUp(hWnd,wParam,lParam);
case WM_KEYDOWN:
return OnKeyDown(hWnd,wParam,lParam);
case WM_SETCURSOR:
return OnSetCursor(hWnd,wParam,lParam);
case WM_SIZE:
return OnSize(hWnd,wParam,lParam);
case WM_CONTEXTMENU:
return OnContextMenu(hWnd,wParam,lParam);
case WM_LBUTTONDBLCLK:
return OnLButtonDblclk(hWnd,wParam,lParam);
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
LRESULT OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
NowTool=DT_LINE;
DragMode=DM_NONE;
return 0;
}
LRESULT OnDestroy(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
return 0;
}
LRESULT OnPaint(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
hdc=BeginPaint(hWnd, &ps);
EndPaint(hWnd, &ps);
return 0;
}
LRESULT OnCommand(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
return 0;
}
LRESULT OnLButtonDown(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
sx=LOWORD(lParam);
sy=HIWORD(lParam);
oldx=sx;
oldy=sy;
DragMode=DM_DRAW;
SetCapture(hWnd);
return 0;
}
LRESULT OnMouseMove(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
int ex,ey;
HDC hdc;
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;
}
LRESULT OnLButtonUp(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
DragMode=DM_NONE;
ReleaseCapture();
return 0;
}
LRESULT OnKeyDown(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
return 0;
}
LRESULT OnSetCursor(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
return(DefWindowProc(hWnd,WM_SETCURSOR,wParam,lParam));
}
LRESULT OnSize(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
return 0;
}
LRESULT OnContextMenu(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
return 0;
}
LRESULT OnLButtonDblclk(HWND hWnd,WPARAM wParam,LPARAM lParam)
{
return 0;
}
WndProc°ú CanvasProcÀº Àü´ÞµÈ ¸Þ½ÃÁö¿¡ µû¶ó Àü´ã ÇÔ¼ö¸¦ È£ÃâÇÒ »ÓÀÌ´Ù. °¢ ¸Þ½ÃÁöÀÇ Çڵ鷯¿¡ ¸Þ½ÃÁö¿¡ ¹ÝÀÀÇÏ´Â ½ÇÁ¦ ÄÚµåµéÀÌ ÀÛ¼ºµÇ¾î ÀÖ´Ù. Çö ½ÃÁ¡¿¡¼ ºñ¾îÀÖ´Â Çڵ鷯µéµµ Àִµ¥ ¾ÕÀ¸·Î ÀÌ Çڵ鷯¿¡ Äڵ带 ä¿ö ³ª°¥ °ÍÀÌ´Ù.
ApiDraw02 ÇÁ·ÎÁ§Æ®ÀÇ ¶Ç ´Ù¸¥ Ư¡Àº ½Ç½À¿¡ ÇÊ¿äÇÑ ¸®¼Ò½º°¡ ¸ðµÎ ÀÛ¼ºµÇ¾î ÀÖ´Ù´Â Á¡ÀÌ´Ù. ¸Þ´º³ª ´ëÈ»óÀÚ ¸®¼Ò½ºµµ ´©°¡ ¸¸µé¾îµµ ºñ½ÁÇÒ ¼ö¹Û¿¡ ¾øÀ¸¹Ç·Î ¿¹ºñ µ¿ÀÛÀ» ÃëÇØ µÎ¾úÀ¸¸ç ½Ç½ÀÁß¿¡ ¸®¼Ò½º¸¦ °¡Á®´Ù ¾²±â¸¸ ÇÏ¸é µÈ´Ù. ¸®¼Ò½º ºä¸¦ ¿¾î ¾î¶² ¸®¼Ò½ºµéÀÌ ÀÛ¼ºµÇ¾î ÀÖ´ÂÁö ±¸°æÇØ º¸µµ·Ï ÇÏÀÚ. ¿¹Á¦¸¦ ½ÇÇàÇϸé ÀÌ¹Ì ¿ÏÀüÇÑ ¸Þ´º°¡ ÀÛ¼ºµÇ¾î ÀÖ´Ù. ¹°·Ð ¾ÆÁ÷ ±â´ÉÀº ±¸ÇöµÇ¾î ÀÖÁö ¾Ê´Ù.
Àü¿ª º¯¼öÀÇ ¸ñ·Ï¿¡´Â º¯È°¡ ¾øÁö¸¸ DTool ¿°ÅÇü°ú DMode ¿°ÅÇüÀÇ ¸â¹ö°¡ Ãß°¡µÇ¾ú´Ù. ±×¸®±â µµ±¸¿¡ ÅØ½ºÆ®, ºñÆ®¸Ê, ¸ÞŸ ÆÄÀÏ µîÀÌ ÀÖ°í µå·¡±× ¸ðµå¿¡´Â À̵¿, Å©±â º¯°æÀÌ Ãß°¡µÇ¾ú´Ù. ÀÌ ¸â¹öµéµµ ¾ÕÀ¸·ÎÀÇ ½Ç½À¿¡ »ç¿ëµÉ °ÍÀÌ´Ù.
ÀÌÈÄ ½Ç½ÀÀ» ÇÒ ¶§´Â ApiDraw02 ÇÁ·ÎÁ§Æ®¸¦ ½ÃÀÛ ÇÁ·ÎÁ§Æ®·Î »ç¿ëÇÏ¿© ÀÌ ÇÁ·ÎÁ§Æ®ÀÇ »çº»À¸·ÎºÎÅÍ ½Ç½ÀÀ» ÁøÇàÇÏ¸é µÈ´Ù. ÇÁ·ÎÁ§Æ®´Â ºñÁÖ¾ó C++ 6.0°ú 2003¿¡¼ ¸ðµÎ ¿ ¼ö ÀÖµµ·Ï µÇ¾î ÀÖÀ¸¸ç 6.0Àº ÄÄÆÄÀÏ °á°ú°¡ Debug6, Release6 µð·ºÅ丮¿¡ ÀúÀåµÇ°í 2003Àº Debug, Release µð·ºÅ丮¿¡ ÀúÀåµÈ´Ù.