´Ù.½ÃÀÛ ÇÁ·ÎÁ§Æ®

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 µð·ºÅ丮¿¡ ÀúÀåµÈ´Ù.