ÀÌ Ç׸ñÀÇ ¿¹Á¦¿¡¼´Â ¸Þ´º¿¡¼ ¼ÒÀ¯ÀÚ°¡ ±×¸° ¸Þ´º Ç׸ñÀ» »ç¿ëÇÕ´Ï´Ù. ¸Þ´º Ç׸ñ ±Û²Ã Ư¼ºÀ» ¼±Åà ÇÏ °í ÇØ´ç Ư¼ºÀ» °¡Áø ±Û²ÃÀ» »ç¿ë ÇÏ ¿© °¢ ¸Þ´º Ç׸ñÀ» Ç¥½Ã ÇÏ´Â ÀÀ¿ë ÇÁ·Î±×·¥. ¿¹¸¦ µé¾î, ±â¿ïÀӲà ±Û²Ã¿¡ ±â¿ïÀӲà ¸Þ´º Ç׸ñÀÌ Ç¥½Ã µË´Ï´Ù. ¹®ÀÚ ¸Þ´º À̸§ ¸Þ´º Ç¥½ÃÁÙ¿¡¼ ¸Þ´º¸¦ ¿±´Ï´Ù.
¸Þ´º ¸ðÀ½ ¹× µå·Ó ´Ù¿î ¸Þ´º¸¦ óÀ½ È®ÀåµÈ ¸Þ´º ÅÛÇø´ ¸®¼Ò½º¿¡ ÀÇÇØ Á¤ÀÇ µË´Ï´Ù. ¸Þ´º¿¡¼ ´ÙÀ½ ¹®ÀÚ¿ 4 ÅؽºÆ® ¸Þ´º Ç׸ñÀ» óÀ½ Æ÷ÇÔ ¸Þ´º ¼½Ä ÆÄÀÏ ¼ÒÀ¯ÀÚ°¡ ±×¸° Ç׸ñÀ» ÁöÁ¤ÇÒ ¼ö ¾ø½À´Ï´Ù, ¶§¹®¿¡: "ÀϹÝ", "±½°Ô," "±â¿ïÀÓ²Ã" ¹× "¹ØÁÙ." ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ Ã¢ ÇÁ·Î½ÃÀú WM_CREATE ¸Þ½ÃÁö¸¦ ó¸®ÇÒ ¶§ÀÌ ¼ÒÀ¯ÀÚ°¡ ±×¸° Ç׸ñÀ» º¯°æ ÇÕ´Ï´Ù. â ÇÁ·Î½ÃÀú¿¡ °¢ ¸Þ´º Ç׸ñ¿¡ ´ëÇØ ´ÙÀ½ ´Ü°è¸¦ ¼öÇà ÇÏ´Â ÀÀ¿ë ÇÁ·Î±×·¥ Á¤ÀÇ OnCreate ÇÔ¼ö È£Ãâ WM_CREATE ¸Þ½ÃÁö¸¦ ¹ÞÀ¸¸é
°¢ ÀÀ¿ë ÇÁ·Î±×·¥ Á¤ÀÇ MYITEM ±¸Á¶¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ Ç׸ñ µ¥ÀÌÅ͸¦ ÀúÀå Çϱ⠶§¹®¿¡ ÇØ´ç ÇÏ´Â ¸Þ´º Ç׸ñ¿¡ ´ë ÇÑ WM_MEASUREITEM ¹× WM_DRAWITEM ¸Þ½ÃÁö¿Í ÇÔ²²¿¡¼ â ÇÁ·Î½ÃÀú¿¡ Àü´Þ µË´Ï´Ù. Æ÷ÀÎÅÍ MEASUREITEMSTRUCT ¹× DRAWITEMSTRUCT ±¸Á¶ÀÇ itemData ±¸¼º¿ø¿¡ Æ÷ÇÔ.
WM_MEASUREITEM ¸Þ½ÃÁö°¡ Ç¥½Ã µË´Ï´Ù óÀ½À¸·Î °¢ ¼ÒÀ¯ÀÚ°¡ ±×¸° ¸Þ´º Ç׸ñ¿¡ ´ë ÇÑ Àü¼Û µË´Ï´Ù. ÀÀ¿ë ÇÁ·Î±×·¥ ÇÁ·Î¼¼½º ÀåÄ¡ ÄÁÅؽºÆ®¿¡ ¸Þ´º Ç׸ñ¿¡ ´ë ÇÑ ±Û²ÃÀ» ¼±Åà ÇÏ °í ´ÙÀ½ °ø°£À» °áÁ¤ ÇÏ ¿©ÀÌ ¸Þ½ÃÁö ÇØ´ç ±Û²Ã¿¡¼ ¸Þ´º Ç׸ñ ÅؽºÆ®¸¦ Ç¥½Ã ÇÏ´Â µ¥ ÇÊ¿äÇÑ. ±Û²Ã ¹× ¸Þ´º Ç׸ñ ÅؽºÆ® µÎ ¸Þ´º Ç׸ñÀÇ MYITEM ±¸Á¶ (ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ÀÇÇØ Á¤ÀÇ µÈ ±¸Á¶)¿¡ ÀÇÇØ ÁöÁ¤ µË´Ï´Ù. ÀÀ¿ë ÇÁ·Î±×·¥À» »ç¿ë ÇÏ ¿© ÅؽºÆ®ÀÇ Å©±â¸¦ °áÁ¤ ÇÕ´Ï´Ù GetTextExtentPoint32 ÇÔ¼ö.
â ÇÁ·Î½ÃÀú¸¦ ÀûÀý ÇÑ ±Û²Ã ¸Þ´º Ç׸ñ ÅؽºÆ®¸¦ Ç¥½Ã ÇÏ ¿© WM_DRAWITEM ¸Þ½ÃÁö¸¦ ó¸® ÇÕ´Ï´Ù. ±Û²Ã ¹× ¸Þ´º Ç׸ñ ÅؽºÆ® µÎ ¸Þ´º Ç׸ñÀÇ MYITEM ±¸Á¶¿¡ ÀÇÇØ ÁöÁ¤ µË´Ï´Ù. ÀÀ¿ë ÇÁ·Î±×·¥ ¸Þ´º Ç׸ñÀÇ »óÅ¿¡ ÀûÇÕ ÇÑ ÅؽºÆ® ¹× ¹è°æ »ö»ó ¼±ÅÃ.
â ÇÁ·Î½ÃÀú ±Û²Ã ¹× ¸Þ¸ð¸® Æı« WM_DESTROY ¸Þ½ÃÁö¸¦ ó¸® ÇÕ´Ï´Ù. ÀÀ¿ë ÇÁ·Î±×·¥ ±Û²ÃÀ» »èÁ¦ ÇÏ °í °¢ ¸Þ´º Ç׸ñ¿¡ ´ë ÇÑ ÀÀ¿ë ÇÁ·Î±×·¥ Á¤ÀÇ MYITEM ±¸Á¶ È®º¸.
´ÙÀ½Àº ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ Çì´õ ÆÄÀÏÀÇ °ü·Ã ºÎºÐ.
/ / ¸Þ´º Ç׸ñ ½Äº°ÀÚ ¹®ÀÚ ¸Þ´º¿¡ ´ë ÇÑ # define IDM_CHARACTER 10 # define IDM_REGULAR 11 # define IDM_BOLD 12 # define IDM_ITALIC 13 # define IDM_UNDERLINE 14 / ±¸Á¶ ¸Þ´º Ç׸ñ typedef struct Tagmyitem¿Í °ü·Ã µÈ / {HFONT hfont;
int cchItemText;
char szItemText [1];
} MYITEM;
# define CCH_MAXITEMTEXT 256
´ÙÀ½Àº ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ Ã¢ ÇÁ·Î½ÃÀú¿Í °ü·Ã µÈ ÇÔ¼öÀÇ °ü·Ã ºÎºÐ.
LRESULT CALLBACK MainWindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (uMsg)
{
case WM_CREATE:
if (!OnCreate(hwnd))
return -1;
break;
case WM_DESTROY:
OnDestroy(hwnd);
PostQuitMessage(0);
break;
case WM_MEASUREITEM:
OnMeasureItem(hwnd, (LPMEASUREITEMSTRUCT) lParam);
return TRUE;
case WM_DRAWITEM:
OnDrawItem(hwnd, (LPDRAWITEMSTRUCT) lParam);
return TRUE;
// Additional message processing goes here.
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
BOOL WINAPI OnCreate(HWND hwnd)
{
HMENU hmenuBar = GetMenu(hwnd);
HMENU hmenuPopup;
MENUITEMINFO mii;
UINT uID;
MYITEM *pMyItem;
// Get the handle to the pop-up menu.
mii.fMask = MIIM_SUBMENU; // information to get
GetMenuItemInfo(hmenuBar, IDM_CHARACTER, FALSE, &mii);
hmenuPopup = mii.hSubMenu;
// Modify each menu item. Assume that the IDs IDM_REGULAR
// through IDM_UNDERLINE are consecutive numbers.
for (uID = IDM_REGULAR; uID <= IDM_UNDERLINE; uID++)
{
// Allocate an item structure, leaving space for a
// string of up to CCH_MAXITEMTEXT characters.
pMyItem = (MYITEM *) LocalAlloc(LMEM_FIXED,
sizeof(MYITEM) + CCH_MAXITEMTEXT);
// Save the item text in the item structure.
mii.fMask = MIIM_TYPE;
mii.dwTypeData = pMyItem->szItemText;
mii.cch = CCH_MAXITEMTEXT;
GetMenuItemInfo(hmenuPopup, uID, FALSE, &mii);
pMyItem->cchItemText = mii.cch;
// Reallocate the structure to the minimum required size.
pMyItem = (MYITEM *) LocalReAlloc(pMyItem,
sizeof(MYITEM) + mii.cch, LMEM_MOVEABLE);
// Create the font used to draw the item.
pMyItem->hfont = CreateMenuItemFont(uID);
// Change the item to an owner-drawn item, and save
// the address of the item structure as item data.
mii.fMask = MIIM_TYPE | MIIM_DATA;
mii.fType = MFT_OWNERDRAW;
mii.dwItemData = (DWORD) pMyItem;
SetMenuItemInfo(hmenuPopup, uID, FALSE, &mii);
}
return TRUE;
}
HFONT CreateMenuItemFont(UINT uID)
{
LOGFONT lf;
ZeroMemory(&lf, sizeof(lf));
lf.lfHeight = 20;
lstrcpy(lf.lfFaceName, "Times New Roman");
switch (uID)
{
case IDM_BOLD:
lf.lfWeight = FW_HEAVY;
break;
case IDM_ITALIC:
lf.lfItalic = TRUE;
break;
case IDM_UNDERLINE:
lf.lfUnderline = TRUE;
break;
}
return CreateFontIndirect(&lf);
}
VOID WINAPI OnDestroy(HWND hwnd)
{
HMENU hmenuBar = GetMenu(hwnd);
HMENU hmenuPopup;
MENUITEMINFO mii;
UINT uID;
MYITEM *pMyItem;
// Get the handle to the menu.
mii.fMask = MIIM_SUBMENU; // information to get
GetMenuItemInfo(hmenuBar, IDM_CHARACTER, FALSE, &mii);
hmenuPopup = mii.hSubMenu;
// Free resources associated with each menu item.
for (uID = IDM_REGULAR; uID <= IDM_UNDERLINE; uID++)
{
// Get the item data.
mii.fMask = MIIM_DATA;
GetMenuItemInfo(hmenuPopup, uID, FALSE, &mii);
pMyItem = (MYITEM *) mii.dwItemData;
// Destroy the font and free the item structure.
DeleteObject(pMyItem->hfont);
LocalFree(pMyItem);
}
}
VOID WINAPI OnMeasureItem(HWND hwnd, LPMEASUREITEMSTRUCT lpmis)
{
MYITEM *pMyItem = (MYITEM *) lpmis->itemData;
HDC hdc = GetDC(hwnd);
HFONT hfntOld = SelectObject(hdc, pMyItem->hfont);
SIZE size;
GetTextExtentPoint32(hdc, pMyItem->szItemText,
pMyItem->cchItemText, &size);
lpmis->itemWidth = size.cx;
lpmis->itemHeight = size.cy;
SelectObject(hdc, hfntOld);
ReleaseDC(hwnd, hdc);
}
VOID WINAPI OnDrawItem(HWND hwnd, LPDRAWITEMSTRUCT lpdis)
{
MYITEM *pMyItem = (MYITEM *) lpdis->itemData;
COLORREF clrPrevText, clrPrevBkgnd;
HFONT hfntPrev;
int x, y;
// Set the appropriate foreground and background colors.
if (lpdis->itemState & ODS_SELECTED)
{
clrPrevText = SetTextColor(lpdis->hDC,
GetSysColor(COLOR_HIGHLIGHTTEXT));
clrPrevBkgnd = SetBkColor(lpdis->hDC,
GetSysColor(COLOR_HIGHLIGHT));
}
else
{
clrPrevText = SetTextColor(lpdis->hDC,
GetSysColor(COLOR_MENUTEXT));
clrPrevBkgnd = SetBkColor(lpdis->hDC,
GetSysColor(COLOR_MENU));
}
// Determine where to draw and leave space for a check-mark.
x = lpdis->rcItem.left;
y = lpdis->rcItem.top;
x += GetSystemMetrics(SM_CXMENUCHECK);
// Select the font and draw the text.
hfntPrev = SelectObject(lpdis->hDC, pMyItem->hfont);
ExtTextOut(lpdis->hDC, x, y, ETO_OPAQUE,
&lpdis->rcItem, pMyItem->szItemText,
pMyItem->cchItemText, NULL);
// Restore the original font and colors.
SelectObject(lpdis->hDC, hfntPrev);
SetTextColor(lpdis->hDC, clrPrevText);
SetBkColor(lpdis->hDC, clrPrevBkgnd);
}