³ª.¼Ó¼º ÆíÁý

»õ·Î »ý¼ºµÇ´Â ¸ðµç µµÇüÀº Àü¿ª º¯¼ö OptÀÇ ¼Ó¼ºÀ» µû¸£¹Ç·Î OptÀÇ ¸â¹ö¸¦ º¯°æÇϸé ÀÌÈÄ »ý¼ºµÉ µµÇüÀÇ ¼Ó¼ºÀ» ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ ÀÌ¹Ì ±×·ÁÁø µµÇüÀÇ ¼Ó¼ºµµ ¹Ù²Ü ¼ö ÀÖ¾î¾ß Çϴµ¥ ¿©·¯ °³ÀÇ ¼Ó¼ºÀ» ÇѲ¨¹ø¿¡ º¸¿©ÁÖ°í º¯°æÇØ¾ß ÇϹǷΠ´ëÈ­ »óÀÚ¸¦ »ç¿ëÇÏ´Â °ÍÀÌ Æí¸®ÇÏ´Ù. ¸®¼Ò½º¿¡´Â µµÇüÀÇ ¼Ó¼º º¯°æ¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Â ´ëÈ­»óÀÚ ÅÛÇø®Æ®°¡ ÀÌ¹Ì ÀÛ¼ºµÇ¾î ÀÖ´Ù.

¿ÞÂÊ¿¡´Â ¼±°ú ¸éÀÇ ¼Ó¼ºÀ» ÀԷ¹޴ ÄÁÆ®·ÑÀÌ ÀÖ°í ¿À¸¥ÂÊ¿¡´Â ±Û²ÃÀÇ ¼Ó¼ºÀ» ÀԷ¹޴ ÄÁÆ®·ÑÀÌ Àִµ¥ ÅØ½ºÆ® ÅøÀº ¾ÆÁ÷ Ãß°¡µÇÁö ¾Ê¾ÒÀ¸¹Ç·Î ÀÏ´Ü ¿ÞÂÊ ÄÁÆ®·Ñ¸¸ »ç¿ëÇϵµ·Ï ÇÏÀÚ. »ö»ó°ªÀ» ÀԷ¹޴ ÄÞº¸ ¹Ú½º´Â ¿À³Ê µå·Î¿ì ¼Ó¼ºÀ» °¡Áö´Âµ¥ ¹Ì¸® Á¤ÇØÁø »ö»óÁß Çϳª¸¦ ¼±ÅÃÇϵµ·Ï ÇÑ´Ù. Àü¿ª »ö»ó Å×À̺íÀ» ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇÑ´Ù.

 

COLORREF arColor[]={-1,RGB(0,0,0),RGB(255,255,255),RGB(255,0,0),RGB(0,255,0),

   RGB(0,0,255),RGB(255,255,0),RGB(255,0,255),RGB(0,255,255),RGB(64,64,64),

   RGB(128,128,128),RGB(192,192,192)};

 

ÄÞº¸ ¹Ú½º´Â ÀÌ »ö»óµéÀ» ±×·¡ÇÈÀ¸·Î º¸¿© ÁÖ¸ç »ç¿ëÀÚ´Â ÀÌ Áß Çϳª¸¦ °í¸¦ ¼ö ÀÖ´Ù. ÀÌ ´ëÈ­»óÀÚ¿¡¼­ ¾÷´Ù¿î ÄÁÆ®·ÑÀ» »ç¿ëÇϹǷΠcommctrl.h¸¦ ÀÎŬ·çµåÇØ¾ß Çϸç OnCreate¿¡¼­´Â InitCommonControls ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÑ´Ù. ÇÁ·ÎÁ§Æ® ¼³Á¤ÀÇ ¸µÅ© ÅÇ¿¡¼­ comctl32.libµµ ¿¬°áÇϵµ·Ï ÇÏÀÚ.

 

#include <windows.h>

#include <commctrl.h>

#include "resource.h"

....

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

{

   InitCommonControls();

   ....

 

¼Ó¼º ÆíÁý ´ëÈ­»óÀÚ Çϳª·Î Àü¿ª ¼Ó¼º°ú °³º° µµÇüÀÇ ¼Ó¼ºÀ» °°ÀÌ ÆíÁýÇØ¾ß ÇϹǷΠÀÌ ´ëÈ­»óÀÚ´Â ÆÄ¶ó¹ÌÅ͸¦ ÅëÇØ Á¶Á¤ ´ë»óÀ» Àü´Þ¹Þ¾Æ ±× °á°ú¸¦ ´Ù½Ã µ¹·Á ÁÖµµ·Ï ÇØ¾ß ÇÑ´Ù. ´ëÈ­»óÀÚ·Î Àü´ÞµÇ´Â ÆÄ¶ó¹ÌÅÍ´Â ¸ðµç ¼Ó¼ºÀ» Æ÷ÇÔÇϰí ÀÖ´Â DObject ±¸Á¶Ã¼ÀÇ Æ÷ÀÎÅÍ¿©¾ß ÇÑ´Ù. ´ëÈ­»óÀÚ ÇÁ·Î½ÃÀú¸¦ ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.

 

BOOL CALLBACK PropertyDlgProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

   static DObject *Obj;

   LPMEASUREITEMSTRUCT lpmis;

   LPDRAWITEMSTRUCT lpdis;

   HBRUSH ColorBrush, OldBrush;

   COLORREF Color;

   int i;

 

   switch(iMessage) {

   case WM_INITDIALOG:

      for (i=0;i<sizeof(arColor)/sizeof(arColor[0]);i++) {

          SendDlgItemMessage(hDlg,IDC_CBLINECOLOR,CB_ADDSTRING,0,(LPARAM)arColor[i]);

          SendDlgItemMessage(hDlg,IDC_CBPLANECOLOR,CB_ADDSTRING,0,(LPARAM)arColor[i]);

      }

      SendDlgItemMessage(hDlg,IDC_SPLINEWIDTH,UDM_SETRANGE,0,MAKELONG(10,0));

 

      Obj=(DObject *)lParam;

      SetDlgItemInt(hDlg,IDC_EDLINEWIDTH,Obj->LineWidth,FALSE);

      for (i=0;i<sizeof(arColor)/sizeof(arColor[0]);i++) {

          if (arColor[i] == Obj->LineColor) {

             break;

          }

      }

      SendDlgItemMessage(hDlg,IDC_CBLINECOLOR,CB_SETCURSEL,i,0);

      for (i=0;i<sizeof(arColor)/sizeof(arColor[0]);i++) {

          if (arColor[i] == Obj->PlaneColor) {

             break;

          }

      }

      SendDlgItemMessage(hDlg,IDC_CBPLANECOLOR,CB_SETCURSEL,i,0);

      return TRUE;

   case WM_MEASUREITEM:

      lpmis=(LPMEASUREITEMSTRUCT)lParam;

      lpmis->itemHeight=24;

      return TRUE;

   case WM_DRAWITEM:

      lpdis=(LPDRAWITEMSTRUCT)lParam;

 

      if (lpdis->itemState & ODS_SELECTED) {

          FillRect(lpdis->hDC, &lpdis->rcItem, GetSysColorBrush(COLOR_HIGHLIGHT));

      } else {

          FillRect(lpdis->hDC, &lpdis->rcItem, GetSysColorBrush(COLOR_WINDOW));

      }

 

      Color=(COLORREF)SendMessage(lpdis->hwndItem, CB_GETITEMDATA, lpdis->itemID, 0);

      if (Color == (COLORREF)-1) {

          ColorBrush=(HBRUSH)GetStockObject(NULL_BRUSH);

      } else {

          ColorBrush=CreateSolidBrush(Color);

      }

      OldBrush=(HBRUSH)SelectObject(lpdis->hDC, ColorBrush);

      Rectangle(lpdis->hDC,lpdis->rcItem.left+5,lpdis->rcItem.top+2,

          lpdis->rcItem.right-5, lpdis->rcItem.bottom-2);

      SelectObject(lpdis->hDC, OldBrush);

      if (Color == (COLORREF)-1) {

          SetTextAlign(lpdis->hDC,TA_CENTER);

          SetBkMode(lpdis->hDC,TRANSPARENT);

          TextOut(lpdis->hDC,(lpdis->rcItem.right+lpdis->rcItem.left)/2,

             lpdis->rcItem.top+4,"Åõ¸í",4);

      } else {

          DeleteObject(ColorBrush);

      }

      return TRUE;

   case WM_COMMAND:

      switch (wParam) {

      case IDOK:

          Obj->LineWidth=GetDlgItemInt(hDlg,IDC_EDLINEWIDTH,NULL,FALSE);

          i=SendDlgItemMessage(hDlg,IDC_CBLINECOLOR,CB_GETCURSEL,0,0);

          Obj->LineColor=arColor[i];

          i=SendDlgItemMessage(hDlg,IDC_CBPLANECOLOR,CB_GETCURSEL,0,0);

          Obj->PlaneColor=arColor[i];

          EndDialog(hDlg,IDOK);

          return TRUE;

      case IDCANCEL:

          EndDialog(hDlg,IDCANCEL);

          return TRUE;

      }

      break;

   }

   return FALSE;

}

 

µÎ °³ÀÇ »ö»ó ÄÞº¸ ¹Ú½º¿¡ »ö»óÇ¥ÀÇ »ö»óÀ» Ç׸ñ µ¥ÀÌÅÍ·Î Ãß°¡ÇØ ³õ°í ¼±ÀÇ »ö»óÀ» Á¶Á¤ÇÏ´Â ½ºÇÉ ¹öưÀÇ ¹üÀ§¸¦ 0~10À¸·Î ¼³Á¤ÇÑ´Ù. WM_INITDIALOG¿¡¼­ lParamÀ¸·Î Àü´ÞµÇ´Â DObjectÀÇ Æ÷ÀÎÅ͸¦ ¹Þ¾Æ µé¿© ÀÌ °´Ã¼ÀÇ ³»¿ë´ë·Î ÄÁÆ®·ÑÀ» ÃʱâÈ­Çß´Ù. ¼±ÀÇ ±½±â´Â ´Ü¼øÇÑ Á¤¼ö°ªÀ̹ǷΠSetDlgItemInt·Î ¿¡µðÆ®¿¡ Ãâ·ÂÇÏ¸é µÇ°í »ö»óÀº »ö»óÇ¥¿Í ÀÏÄ¡ÇÏ´Â Ç׸ñÀ» ã¾Æ ÄÞº¸ ¹Ú½º¿¡ ¼±ÅÃÇÑ´Ù. ÀԷ¹ÞÀº ¼³Á¤°ªÀ» ÄÁÆ®·Ñ¿¡ ±×´ë·Î º¸¿© ÁÖ´Â °ÍÀÌ´Ù.

µÎ °³ÀÇ ¿À³Ê µå·Î¿ì ÄÞº¸ ¹Ú½º¸¦ °¡Áö°í ÀÖÀ¸¹Ç·Î WM_MEASUREITEM ¸Þ½ÃÁö¿Í WM_DRAWITEM ¸Þ½ÃÁö¸¦ ó¸®Çϰí Àִµ¥ ¸ðµç »ö»óÀÇ ³ôÀÌ´Â 24Çȼ¿·Î µ¿ÀÏÇÏ´Ù. WM_DRAWITEM¿¡¼­´Â ¼±Åà »óÅÂÀÏ ¶§ ÆÄ¶õ»ö ¹è°æÀ» Ä¥ÇÏ°í ±×·¸Áö ¾ÊÀ» ¶§´Â Èò»ö ¹è°æÀ» Ä¥ÇÑ ÈÄ Ç׸ñ ID·ÎºÎÅÍ Ç׸ñ µ¥ÀÌÅÍ·Î ÀúÀåµÈ »ö»óÀÇ ºê·¯½Ã¸¦ ¸¸µç ÈÄ »ç°¢ÇüÀ» ±×·È´Ù. ´Ü, -1ÀÏ °æ¿ì´Â Åõ¸í»öÀÓÀ» ÅØ½ºÆ®·Î Ç¥½ÃÇÑ´Ù. µÎ °³ÀÇ ÄÞº¸ ¹Ú½º¿¡ ´ëÇÑ ¿À³Ê µå·Î¿ì 󸮸¦ Çϰí Àִµ¥ µÎ ÄÞº¸ ¹Ú½ºÀÇ ¸ð¾çÀÌ ¿ÏÀüÈ÷ ÀÏÄ¡ÇϹǷΠ¾î¶² ÄÁÆ®·ÑÀÌ ±×¸®±â¸¦ ¿äûÇß´ÂÁö´Â Á¡°ËÇÒ ÇÊ¿ä¾øÀÌ Ç׸ñ ID¸¸À¸·Î ±×¸®±â¸¦ ¼öÇàÇÏ¸é µÈ´Ù.

WM_COMMAND¿¡¼­´Â IDOK ¹öưÀ» ´©¸¦ ¶§ ÆíÁýµÈ °á°ú¸¦ lParamÀ¸·Î Àü´ÞµÈ DObject ±¸Á¶Ã¼¿¡ ´Ù½Ã ä¿ö¼­ µ¹·ÁÁØ´Ù. ÀÌ ´ëÈ­»óÀÚ¸¦ È£ÃâÇÏ´Â ÂÊ¿¡¼­´Â ÆíÁý ´ë»óÀÎ DObject °´Ã¼ÀÇ Æ÷ÀÎÅ͸¦ ÆÄ¶ó¹ÌÅÍ·Î Àü´ÞÇÑ´Ù. ¿ì¼± ÆíÁý/¼Ó¼º ¸í·ÉÀÌ ¼±ÅõǾúÀ» ¶§ ¸ÞÀÎ À©µµ¿ì¿¡¼­ ÀÌ ´ëÈ­»óÀÚ¸¦ ´ÙÀ½°ú °°ÀÌ È£ÃâÇÑ´Ù.

 

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

{

   switch(LOWORD(wParam)) {

   ....

   case IDM_SHAPE_PROPERTY:

      if (NowSel == -1) {

          DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_PROPERTY),

             hWnd,PropertyDlgProc,(LPARAM)&Opt);

      } else {

          SendMessage(hCanvas,WM_COMMAND,MAKEWPARAM(IDM_POPUP_PROPERTY,0),0);

      }

      break;

 

¼±Åà µµÇüÀÌ ¾ø´Ù¸é Àü¿ª ¿É¼ÇÀ» º¯°æÇ϶ó´Â ¶æÀ̹ǷΠÀü¿ª ¿É¼Ç °´Ã¼ÀÎ OptÀÇ ¹øÁö¸¦ ÆÄ¶ó¹ÌÅÍ·Î Àü´ÞÇß´Ù. ´ëÈ­»óÀÚ´Â OptÀÇ ³»¿ë´ë·Î ÄÁÆ®·ÑÀ» ÃʱâÈ­ÇÏ°í »ç¿ëÀÚ°¡ ¿É¼ÇÀ» Á¶Á¤Çϸé OptÀÇ ¼Ó¼º°ªÀ» Á÷Á¢ ¹Ù²Ü °ÍÀÌ´Ù. Àü¿ª ¼Ó¼ºÀÌ º¯°æµÇ¾úÀ» ¶§ ¸ÞÀÎ À©µµ¿ì°¡ Ãß°¡ µ¿ÀÛÀ» ÇÒ ÇÊ¿ä´Â ¾øÀ¸¹Ç·Î ´ëÈ­»óÀÚÀÇ ¸®ÅϰªÀº Á¡°ËÇÒ Çʿ䰡 ¾ø´Ù. Àü¿ª ¼Ó¼ºÀº ´ÙÀ½ ±×¸± µµÇü¿¡¸¸ ¿µÇâÀ» ¹ÌÄ¡¸ç ÀÌ¹Ì ±×·ÁÁø µµÇü¿¡ ´ëÇØ¼­´Â ¾Æ¹«·± ¿µÇâ·ÂÀ» ¹ßÈÖÇÏÁö ¾Ê´Â´Ù. º¯°æµÈ Àü¿ª ¿É¼ÇÀº ´ÙÀ½ µµÇüÀ» ±×¸± ¶§ »ç¿ëµÈ´Ù.

¼±Åà µµÇüÀÌ ÀÖ´Â »óÅ¿¡¼­ ÀÌ ¸Þ´º¸¦ ¼±ÅÃÇßÀ¸¸é ¼±ÅÃµÈ µµÇüÀÇ ¼Ó¼º¸¸ º¯°æÇ϶ó´Â ¶æÀε¥ À̶§´Â ĵ¹ö½º¿¡°Ô ¸í·ÉÀ» Àü´ÞÇÏ¿© ´ë½Å ó¸®Çϵµ·Ï Çß´Ù. ĵ¹ö½º´Â ÀڽŸ¸ÀÇ ÆË¾÷ ¸Þ´º¸¦ °¡Áö°í ÀÖÀ¸¸ç ÆË¾÷ ¸Þ´º¿¡¼­ ¼Ó¼ºÀ» ÆíÁýÇÒ ¼ö ÀÖ´Ù. ĵ¹ö½ºÀÇ OnCommand¿¡µµ ´ÙÀ½ Äڵ带 Ãß°¡ÇÑ´Ù.

 

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

{

   switch(LOWORD(wParam)) {

   ....

   case IDM_POPUP_PROPERTY:

      if (NowSel != -1) {

          if (DialogBoxParam(g_hInst, MAKEINTRESOURCE(IDD_PROPERTY),

             hWnd,PropertyDlgProc,(LPARAM)arObj[NowSel])==IDOK) {

             InvalidateRect(hWnd,NULL,TRUE);

          }

      }

      break;

   }

   return 0;

}

 

¼±ÅÃµÈ µµÇüÀÇ Æ÷ÀÎÅ͸¦ ¹Ù·Î Àü´ÞÇÏ¿© ÀÌ µµÇüÀÇ ¼Ó¼ºÀ» ÆíÁýÇϵµ·Ï Çß´Ù. ¼Ó¼º ÆíÁýÀ» ¿Ï·áÇßÀ¸¸é º¯°æµÈ µµÇüÀ» ´Ù½Ã ±×·Á¾ß ÇϹǷΠÀÛ¾÷ ¿µ¿ªÀ» ¹«È¿È­ÇÑ´Ù. ÆíÁýÀ» Ãë¼ÒÇßÀ¸¸é ¾Æ¹« µ¿ÀÛµµ ÇÒ Çʿ䰡 ¾ø´Ù.