»õ·Î »ý¼ºµÇ´Â ¸ðµç µµÇüÀº Àü¿ª º¯¼ö 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;
}
¼±ÅÃµÈ µµÇüÀÇ Æ÷ÀÎÅ͸¦ ¹Ù·Î Àü´ÞÇÏ¿© ÀÌ µµÇüÀÇ ¼Ó¼ºÀ» ÆíÁýÇϵµ·Ï Çß´Ù. ¼Ó¼º ÆíÁýÀ» ¿Ï·áÇßÀ¸¸é º¯°æµÈ µµÇüÀ» ´Ù½Ã ±×·Á¾ß ÇϹǷΠÀÛ¾÷ ¿µ¿ªÀ» ¹«È¿ÈÇÑ´Ù. ÆíÁýÀ» Ãë¼ÒÇßÀ¸¸é ¾Æ¹« µ¿ÀÛµµ ÇÒ Çʿ䰡 ¾ø´Ù.