¶ó.Åø¹Ù

´ÙÀ½Àº Åø¹Ù¸¦ Ãß°¡ÇØ º¸ÀÚ. ¸Þ´º¿Í ´ÜÃàÅ°º¸´Ù´Â ¾Æ¹«·¡µµ Åø¹Ù°¡ ÈξÀ ´õ ¾²±â Æí¸®ÇÏ´Ù. ƯÈ÷ ÀÌ·± ±×·¡ÇÈ ÇÁ·Î±×·¥Àº ¸¶¿ì½º¸¦ ¸¹ÀÌ »ç¿ëÇϱ⠶§¹®¿¡ Å°º¸µåº¸´Ù´Â ¸¶¿ì½º·Î ¸í·ÉÀ» ¼±ÅÃÇÏ´Â °ÍÀÌ ´õ ºü¸£°í ÁÁ´Ù. Åø¹Ùµµ Â÷Àϵå À©µµ¿ìÀ̹ǷΠÀ©µµ¿ì ÇÚµéÀ» ¸ÕÀú ¼±¾ðÇÑ´Ù.

 

HWND hToolBar;

 

±×¸®°í Åø¹Ù¸¦ »ý¼ºÇÏ´Â ÇÔ¼ö¸¦ ÀÛ¼ºÇÑ´Ù. Åø¹Ù¿¡ »ç¿ëÇÒ ºñÆ®¸ÊÀº ¸®¼Ò½º¿¡ ÀÌ¹Ì ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î ÀÌ ºñÆ®¸ÊÀ¸·Î Åø ¹öÆ°À» »ý¼ºÇϱ⸸ ÇÏ¸é µÈ´Ù.

 

void CreateToolBar()

{

   TBBUTTON ToolBtn[]={

      {0,IDM_FILE_NEW,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,0},

      {1,IDM_FILE_OPEN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,1},

      {2,IDM_FILE_SAVE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,2},

      {4,0,0,TBSTYLE_SEP,0,0},

      {3,IDM_EDIT_CUT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,3},

      {4,IDM_EDIT_COPY,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,4},

      {5,IDM_EDIT_PASTE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,5},

      {4,0,0,TBSTYLE_SEP,0,0},

      {6,IDM_SHAPE_SELECT,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0,0,6},

      {7,IDM_SHAPE_LINE,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0,0,7},

      {8,IDM_SHAPE_ELLIPSE,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0,0,8},

      {9,IDM_SHAPE_RECTANGLE,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0,0,9},

      {10,IDM_SHAPE_TEXT,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0,0,10},

      {11,IDM_SHAPE_BITMAP,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0,0,11},

      {12,IDM_SHAPE_META,TBSTATE_ENABLED,TBSTYLE_CHECKGROUP,0,0,0,12},

      {4,0,0,TBSTYLE_SEP,0,0},

      {13,IDM_SHAPE_PROPERTY,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,0,13},

   };

   TCHAR *szToolText="»õÆÄÀÏ\0¿­±â\0ÀúÀå\0ÀÚ¸£±â\0º¹»ç\0ºÙÀ̱â"

      "\0¼±ÅÃ\0¼±\0¿ø\0»ç°¢Çü\0ÅؽºÆ®\0ºñÆ®¸Ê\0¸ÞŸ\0¼Ó¼º\0";

 

   hToolBar=CreateToolbarEx(hWndMain, WS_CHILD | WS_VISIBLE

      | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT ,

      99, 14, g_hInst, IDB_TOOLBAR, ToolBtn, 17,

      16,15,16,15,sizeof(TBBUTTON));

 

   SendMessage(hToolBar,TB_ADDSTRING,NULL,(LPARAM)szToolText);

   SendMessage(hToolBar,TB_AUTOSIZE,0,0);

}

 

Åø ¹öÆ°ÀÇ IDµéÀº ÀÌ¹Ì ¸¸µé¾îÁ® ÀÖ´Â ¸Þ´ºÀÇ Ç׸ñµé°ú ´ëÀÀµÇ´Â °ÍµéÀ̹ǷΠº°µµÀÇ ¸í·É ó¸® ·çƾÀ» µû·Î ÀÛ¼ºÇÏÁö ¾Ê¾Æµµ µÈ´Ù. ¸ÞÀÎ À©µµ¿ì°¡ »ý¼ºµÉ ¶§ Åø¹Ù¸¦ °°ÀÌ ¸¸µç´Ù.

 

LRESULT Main_OnCreate(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   InitCommonControls();

   hWndMain=hWnd;

   hCanvas=CreateWindow("Canvas",NULL,WS_CHILD | WS_VISIBLE,

      0,0,0,0, hWnd,(HMENU)0,g_hInst,NULL);

   CreateToolBar();

   return 0;

}

 

Main_OnCreate¿¡¼­ Á÷Á¢ Åø¹Ù¸¦ ¸¸µé ¼öµµ ÀÖÁö¸¸ Äڵ尡 ±æ¾îÁ® º°µµÀÇ ÇÔ¼ö·Î ºÐ¸®ÇØ µÎ¾ú´Ù. µü Çѹø¸¸ »ç¿ëÇÏ´õ¶óµµ ºÐ¸® °¡´ÉÇÑ ÀÛ¾÷ ´ÜÀ§´Â °¡±ÞÀûÀ̸é ÇÔ¼ö·Î ºÐ¸®ÇÏ´Â °ÍÀÌ ÁÁ´Ù. ¸ÞÀÎ À©µµ¿ìÀÇ ÀÛ¾÷ ¿µ¿ª Å©±â°¡ º¯°æµÉ ¶§ Åø¹Ù¿Í ĵ¹ö½º¸¦ Àç¹èÄ¡ÇÏ¿© Åø¹Ù°¡ Ç×»ó ĵ¹ö½ºÀ§¿¡ ÀÖµµ·Ï ÇÑ´Ù.

 

LRESULT Main_OnSize(HWND hWnd,WPARAM wParam,LPARAM lParam)

{

   RECT wrt;

   int toolheight;

 

   if (wParam != SIZE_MINIMIZED) {

      SendMessage(hToolBar,TB_AUTOSIZE,0,0);

      GetWindowRect(hToolBar,&wrt);

      toolheight=wrt.bottom-wrt.top;

      MoveWindow(hCanvas,0,toolheight,LOWORD(lParam),HIWORD(lParam)-toolheight,TRUE);

   }

   return 0;

}

 

ĵ¹ö½º´Â Åø¹ÙÀÇ ³ôÀ̸¦ Á¦¿ÜÇÑ ³ª¸ÓÁö ºÎºÐÀ» ¸ðµÎ Â÷ÁöÇÑ´Ù. ¸ÞÀÎ À©µµ¿ì°¡ Á÷Á¢ µµÇüÀ» °ü¸®ÇÏÁö ¾Ê°í ĵ¹ö½º¶ó´Â Â÷Àϵ尡 µµÇüÀ» °ü¸®Çϱ⠶§¹®¿¡ Åø¹Ù°¡ Ãß°¡µÇ¾ú´Ù°í Çؼ­ µµÇü ÆíÁý Äڵ尡 ¿µÇâÀ» ¹Þ¾Æ¾ß ÇÒ ÀÌÀ¯´Â ¾ø´Ù. ¸¸¾à ¾ÖÃÊ¿¡ ĵ¹ö½º¸¦ ºÐ¸®ÇØ ³õÁö ¾Ê¾Ò´Ù¸é Åø¹Ù¿¡ ÀÇÇØ µµÇüµéÀÌ ÀνÄÇÏ´Â ¿øÁ¡ÀÌ ¹Ù²î°Ô µÇ¹Ç·Î ´ë´ëÀûÀÎ ÄÚµåÀÇ ¼öÁ¤ÀÌ ºÒ°¡ÇÇÇÒ °ÍÀÌ´Ù. Åø ¹öÆ°ÀÇ ID´Â ¸ÞÀÎ ¸Þ´ºÀÇ ID¿Í ÀÏÄ¡ÇϹǷΠÅø ¹öÆ°ÀÇ ¸í·ÉÀº º°µµ·Î ó¸®ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.

¿©±â±îÁö ÀÛ¼ºÇÑ ÈÄ Å×½ºÆ®ÇØ º¸¸é Åø¹Ù´Â ÀÌ¹Ì Àß µ¿ÀÛÇÑ´Ù. Åø¹Ù¿¡¼­ Á÷¼±À̳ª Ÿ¿øÀ» ¼±ÅÃÇÑ ÈÄ ±×¸®±â¸¦ ÇØ º¸¸é ¼±ÅÃµÈ µµÇüÀÌ Àß ±×·ÁÁú °ÍÀÌ´Ù. ±×·¯³ª ¸Þ´º³ª ´ÜÃàÅ°·Î µµ±¸¸¦ º¯°æÇϸé Åø ¹Ù¿¡´Â ÀÌ »ç½ÇÀÌ Áï½Ã ¹Ý¿µµÇÁö ¾Ê´Â´Ù. Åø¹Ù´Â ¸í·ÉÀ» ÀԷ¹޴ µµ±¸À̱⵵ ÇÏÁö¸¸ ÇöÀç ÇÁ·Î±×·¥ÀÇ »óŸ¦ Ç¥½ÃÇÏ´Â Ãâ·Âµµ±¸À̱⵵ ÇϹǷΠ»ç¿ëÀÚ°¡ ¼±ÅÃÇÑ µµ±¸¸¦ º¸¿© ÁÖ¾î¾ß ÇÑ´Ù.

Áï, Åø¹Ùµµ ¸Þ´ºÃ³·³ »óŸ¦ °ü¸®ÇÏ¿© ¼±ÅÃµÈ µµ±¸µµ º¸¿©ÁÖ°í »ç¿ëÇÒ ¼ö ¾ø´Â ¹öÆ°Àº »ç¿ë ±ÝÁö½ÃÅ°±âµµ ÇØ¾ß ÇÑ´Ù. ±×·±µ¥ Åø ¹Ù´Â È­¸é¿¡ Ç×»ó º¸ÀÌ´Â »óÅÂÀ̹ǷΠ¸Þ´º°¡ ÆîÃÄÁú ¶§ º¸³»Áö´Â WM_INITMENU¿¡ ÇØ´çÇÏ´Â ¸Þ½ÃÁö°¡ µû·Î ¾ø´Ù. ±×·¡¼­ Åø¹Ù¸¦ °ü¸®ÇÒ ½ÃÁ¡À» Á¤Çϱ⠾î·Á¿îµ¥ ÁÖ±âÀûÀ¸·Î ÇÁ·Î±×·¥ÀÇ »óŸ¦ Á¡°ËÇÏ¿© Åø¹ÙÀÇ »óŸ¦ °ü¸®ÇØ¾ß ÇÑ´Ù. ÀÌ·± ¸ñÀûÀ¸·Î ŸÀ̸Ӹ¦ ¾²´Â °ÍÀº ´Ù¼Ò ³¶ºñ°¡ ½ÉÇϱ⠶§¹®¿¡ ÁַΠó¸®ÇÒ ¸Þ½ÃÁö°¡ ¾ø´Â ½Ã°£ÀÎ ¾ÆÀ̵é ŸÀÓÀ» È°¿ëÇÑ´Ù.

 

void OnIdle()

{

   static DTool OldTool=(DTool)-1;

 

   if (OldTool == NowTool) {

      return;

   }

   OldTool=NowTool;

   SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_SELECT,MAKELONG(TBSTATE_ENABLED,0));

   SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_LINE,MAKELONG(TBSTATE_ENABLED,0));

   SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_ELLIPSE,MAKELONG(TBSTATE_ENABLED,0));

   SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_RECTANGLE,MAKELONG(TBSTATE_ENABLED,0));

   SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_TEXT,MAKELONG(TBSTATE_ENABLED,0));

   SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_BITMAP,MAKELONG(TBSTATE_ENABLED,0));

   SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_META,MAKELONG(TBSTATE_ENABLED,0));

   switch (NowTool) {

   case DT_SELECT:

      SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_SELECT,

          MAKELONG(TBSTATE_CHECKED | TBSTATE_ENABLED,0));

      break;

   case DT_LINE:

      SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_LINE,

          MAKELONG(TBSTATE_CHECKED | TBSTATE_ENABLED,0));

      break;

   case DT_ELLIPSE:

      SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_ELLIPSE,

          MAKELONG(TBSTATE_CHECKED | TBSTATE_ENABLED,0));

      break;

   case DT_RECTANGLE:

      SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_RECTANGLE,

          MAKELONG(TBSTATE_CHECKED | TBSTATE_ENABLED,0));

      break;

   case DT_TEXT:

      SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_TEXT,

          MAKELONG(TBSTATE_CHECKED | TBSTATE_ENABLED,0));

      break;

   case DT_BITMAP:

      SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_BITMAP,

          MAKELONG(TBSTATE_CHECKED | TBSTATE_ENABLED,0));

      break;

   case DT_META:

      SendMessage(hToolBar,TB_SETSTATE,IDM_SHAPE_META,

          MAKELONG(TBSTATE_CHECKED | TBSTATE_ENABLED,0));

      break;

   }

}

 

¸ðµç µµ±¸¸¦ ºñ¼±Åà »óÅ·Π¸¸µç ÈÄ NowTool¿¡ ´ëÀÀµÇ´Â Åø ¹öÆ°¸¸ ¼±Åà »óÅ·Π¸¸µé¾ú´Ù. ÀÌ ÄÚµå´Â ÅøÀÌ º¯°æµÉ ¶§¸¸ ½ÇÇàÇØ¾ß ÇϹǷΠÃÖÈÄ·Î Àû¿ëµÈ ÅøÀ» OldTool Á¤Àû º¯¼ö¿¡ ÀúÀåÇØ µÎ°í NowToolÀÌ OldTool°ú ´Þ¶óÁú ¶§¸¸ Åø ¹öÆ° »óŸ¦ °ü¸®Çϵµ·Ï Çß´Ù. WinMainÀÇ ¸Þ½ÃÁö ·çÇÁ¿¡¼­ ¾ÆÀ̵é ŸÀÓÀ» ã¾Æ ÀûÀýÇÑ ½ÃÁ¡¿¡ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.

 

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance

     ,LPSTR lpszCmdParam,int nCmdShow)

   ....

   HACCEL hAccel;

   BOOL AllowIdle=TRUE;

   hAccel=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1));

   for (;;) {

      do {

          if (!GetMessage(&Message,NULL,0,0))

             goto endloop;

          if (Message.message != 0x118/*WM_SYSTIMER*/) {

             AllowIdle=TRUE;

          }

          if (!TranslateAccelerator(hWnd,hAccel,&Message)) {

             TranslateMessage(&Message);

             DispatchMessage(&Message);

          }

      } while (PeekMessage(&Message,NULL,0,0,PM_NOREMOVE));

 

      if (AllowIdle) {

          OnIdle();

          AllowIdle=FALSE;

      }

   }

 

endloop:

   return (int)Message.wParam;

}

 

¸Þ½ÃÁö ·çÇÁ¿¡¼­ Å¥ÀÇ ¸Þ½ÃÁö¸¦ ²¨³» ó¸®ÇÏ´Â Æ´Æ´ÀÌ Çѹø¾¿ OnIdleÀ» ºÒ·¯ Åø ¹öÆ°ÀÇ »óŸ¦ °ü¸®ÇÒ °ÍÀÌ´Ù. ÀÌ ¿Ü¿¡ ¾ÆÀ̵é ŸÀÓ¿¡ ´õ ÇÊ¿äÇÑ Ã³¸®°¡ ÀÖÀ¸¸é ÀÌ ÇÔ¼ö¿¡ ÀÛ¼ºÇÏ¸é µÈ´Ù.