³ª.ApiDraw01

ù ¹øÂ° ¿¹Á¦ÀÎ 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¿¡¼­ µµÇüÀ» ´Ù½Ã Çѹø ±×¸®Áö ¾ÊÀ½À¸·Î½á ÀÓ½ÃÀûÀ¸·Î ±×·ÁÁø µµÇüÀ» È®Á¤ÁþÁö ¾Ê¾Æ µµÇü³¢¸® °ãÃÄÁø ºÎºÐÀÌ ¹ÝÀüµÈ »óÅ·Π³²¾Æ ÀÖ´Â ¹®Á¦°¡ ÀÖ´Ù. ÀÌ ¹®Á¦´Â ±×¸®±â Á¤º¸°¡ ÀúÀåµÇ°í ±×·¡ÇÈ °´Ã¼¸¦ ´Ù½Ã º¹±¸ÇÒ ¼ö ÀÖ°Ô µÇ¸é ÀÚ¿¬½º·´°Ô ÇØ°áµÇ¹Ç·Î °ÆÁ¤ÇÏÁö ¾Ê¾Æµµ µÈ´Ù.