ÀÌ Ç׸ñÀÇ ¿¹Á¦´Â µÎ ¸Þ´ºÀÇ ¸Þ´º Ç׸ñ¿¡ ºñÆ®¸Ê »ç¿ëÀÚ ÁöÁ¤ È®ÀζõÀ» ÇÒ´çÇÕ´Ï´Ù. ¹®ÀÚ Æ¯¼ºÀ» ÁöÁ¤ Çϴ ù ¹øÂ° ¸Þ´ºÀÇ ¸Þ´º Ç׸ñ: ±½°Ô, ±â¿ïÀӲà ¹× ¹ØÁÙ. °¢ ¸Þ´º Ç׸ñ ¼±Åà ¶Ç´Â ¼±Åà Ãë¼Ò µÉ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ ¸Þ´º Ç׸ñ¿¡ ´ë ÇÑ ¿¹Á¦´Â À¯»çÇÑ È®Àζõ ÄÁÆ®·ÑÀÇ checked ¹× unchecked »óÅ üũ ¸¶Å© ºñÆ®¸Ê »ç¿ë.
µÎ ¹øÂ° ¸Þ´ºÀÇ ¸Þ´º Ç׸ñ ´Ü¶ô ¸ÂÃã ¼³Á¤À» ÁöÁ¤: ¿ÞÂÊ, °¡¿îµ¥ ¹× ¿À¸¥ÂÊ. ÀÌ·¯ÇÑ ¸Þ´º Ç׸ñ Áß Çϳª¸¸ ¾î¶² ÁÖ¾îÁøµÈ ½Ã°£¿¡ È®ÀÎ µË´Ï´Ù. ÀÌ·¯ÇÑ ¸Þ´º Ç׸ñ¿¡ ´ë ÇÑ ¿¹Á¦¿¡¼´Â ¶óµð¿À ´ÜÃß ÄÁÆ®·ÑÀÇ checked ¹× unchecked »óŸ¦ ´àÀº üũ ¸¶Å© ºñÆ®¸Ê »ç¿ë.
â ÇÁ·Î½ÃÀú OnCreate ÀÀ¿ë ÇÁ·Î±×·¥ Á¤ÀÇ ÇÔ¼ö¸¦ È£Ãâ ÇÏ ¿© WM_CREATE ¸Þ½ÃÁö¸¦ ó¸® ÇÕ´Ï´Ù. OnCreate 4 üũ ¸¶Å© ºñÆ®¸ÊÀ» ¸¸µé°í SetMenuItemBitmaps ÇÔ¼ö¸¦ »ç¿ë ÇÏ ¿© ±×µéÀ» ±×µéÀÇ ÀûÀý ÇÑ ¸Þ´º Ç׸ñÀ» ÇÒ´ç.
°¢ ºñÆ®¸ÊÀ» ¸¸µé·Á¸é OnCreate ºñÆ®¸Ê ƯÁ¤ ±×¸®±â ±â´É¿¡ ´ë ÇÑ Æ÷ÀÎÅ͸¦ ÁöÁ¤ Çϸé ÀÀ¿ë ÇÁ·Î±×·¥ Á¤ÀÇ CreateMenuBitmaps ÇÔ¼ö¸¦ È£Ãâ ÇÕ´Ï´Ù. CreatemenubitmapsÀº ÇÊ¿äÇÑ Å©±âÀÇ ´Ü»ö ºñÆ®¸Ê ¸¸µé°í ¸Þ¸ð¸® ÀåÄ¡ ÄÁÅØ½ºÆ®¿¡ ¼±Åà ÇÏ °í ¹è°æÀ» Áö¿ó´Ï´Ù. ´ÙÀ½ Àü°æ¿¡¼ ä¿ì±â À§ÇØ ÁöÁ¤ÇÑ µå·ÎÀ× ÇÔ¼ö È£Ãâ.
4 °³ÀÇ ÀÀ¿ë ÇÁ·Î±×·¥ Á¤ÀÇ ±×¸®±â ÇÔ¼ö´Â DrawCheck, DrawUncheck, DrawRadioCheck, ¹× DrawRadioUncheck. ±×µéÀº °¢°¢ X, ºó »ç°¢Çü, Æ÷ÇÔ ÇÏ´Â ÀÛÀº ä¿öÁøµÈ Ÿ¿ø Ÿ¿ø¿Í ºó Ÿ¿ø, »ç°¢ÇüÀ» ±×¸³´Ï´Ù.
â ÇÁ·Î½ÃÀú´Â üũ ¸¶Å© ºñÆ®¸ÊÀ» »èÁ¦ ÇÏ ¿© WM_DESTROY ¸Þ½ÃÁö¸¦ ó¸® ÇÕ´Ï´Ù. ±×°ÍÀº GetMenuItemInfo ÇÔ¼ö¸¦ »ç¿ë ÇÏ ¿© °¢ ºñÆ®¸Ê ÇÚµéÀ» °Ë»ö ÇÏ °í ´ÙÀ½¿¡ ÇÚµéÀ» Àü´Þ ÇÕ´Ï´Ù DeleteObject ÇÔ¼ö.
»ç¿ëÀÚ°¡ ¸Þ´º Ç׸ñÀ» ¼±Åà ÇÏ´Â °æ¿ì ¼ÒÀ¯ÀÚ Ã¢À¸·Î WM_COMMAND ¸Þ½ÃÁö°¡ º¸³»Áý´Ï´Ù. ¹®ÀÚ ¸Þ´º¿¡¼ ¸Þ´º Ç׸ñ¿¡ ´ë ÇÑ Ã¢ ÇÁ·Î½ÃÀú´Â ÀÀ¿ë ÇÁ·Î±×·¥ Á¤ÀÇ CheckCharacterItem ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù. â ÇÁ·Î½ÃÀú ÀÀ¿ë ÇÁ·Î±×·¥ Á¤ÀÇ CheckParagraphItem ÇÔ¼ö¸¦ È£Ãâ ÇÏ´Â ´Ü¶ô ¸Þ´º¿¡¼ Ç׸ñ¿¡ ´ë ÇÑ.
¹®ÀÚ ¸Þ´º¿¡¼ °¢ Ç׸ñÀº üũ ÇÏ °í µ¶¸³ÀûÀ¸·Î È®ÀÎ µÇÁö ¾ÊÀº µÉ ¼ö ÀÖ½À´Ï´Ù. µû¶ó¼ Checkcharacteritem´Â ´Ü¼øÈ÷ ÁöÁ¤ µÈ ¸Þ´º Ç׸ñÀÇ ¼±Åà »óŸ¦ ÀüȯÇÕ´Ï´Ù. ù°, ÇÔ¼ö GetMenuItemInfo ÇÔ¼ö°¡ ÇöÀç ¸Þ´º Ç׸ñ »óÅ ȣÃ⠵˴ϴÙ. MFS_CHECKED »óÅ Ç÷¡±×¸¦ Àüȯ ÇÏ °í SetMenuItemInfo ÇÔ¼ö¸¦ È£Ãâ ÇÏ ¿© »õ »óŸ¦ ¼³Á¤ ÇÏ´Â ´ÙÀ½.
¹®ÀÚ Æ¯¼ºÀ» ´Þ¸® ÇÑ ¹ø¿¡ ÇϳªÀÇ ´Ü¶ô ¸ÂÃãÀ» ¼±ÅÃÇÒ ¼ö ÀÖ½À´Ï´Ù. µû¶ó¼, CheckParagraphItem ÁöÁ¤ µÈ ¸Þ´º Ç׸ñÀ» È®ÀÎ ÇÏ °í ¸Þ´ºÀÇ ±âŸ ¸ðµç Ç׸ñ¿¡¼ È®ÀΠǥ½Ã¸¦ Á¦°Å ÇÕ´Ï´Ù. ÀÌ·¸°Ô ÇÏ·Á¸é CheckMenuRadioItem ÇÔ¼ö¸¦ È£Ãâ.
´ÙÀ½Àº ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ Çì´õ ÆÄÀÏÀÇ °ü·Ã ºÎºÐ.
/ / ¹®ÀÚ ¸Þ´ºÀÇ ¸Þ´º Ç׸ñ ½Äº°ÀÚ # define IDM_CHARACTER 10 # define IDM_BOLD 11 # define IDM_ITALIC 12 # define IDM_UNDERLINE 13 / / ´Ü¶ô ¸Þ´ºÀÇ ¸Þ´º Ç׸ñ ½Äº°ÀÚ # define IDM_PARAGRAPH 20 # define IDM_LEFT 21 # define IDM_CENTER 22 # define IDM_RIGHT 23 / / ±×¸®±â ÇÔ¼ö Æ÷ÀÎÅÍ Çü½ÄÀ» typedef VOID ÇÔ¼ö (WINAPI * DRAWFUNC) (HDC hdc, Å©±â Å©±â)
´ÙÀ½Àº ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ Ã¢ ÇÁ·Î½ÃÀú¿Í °ü·Ã µÈ ±â´É¿¡ ´ë ÇÑ °ü·Ã ºÎºÐ.
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_COMMAND:
switch (LOWORD(wParam))
{
case IDM_BOLD:
case IDM_ITALIC:
case IDM_UNDERLINE:
CheckCharacterItem(hwnd, LOWORD(wParam));
break;
case IDM_LEFT:
case IDM_CENTER:
case IDM_RIGHT:
CheckParagraphItem(hwnd, LOWORD(wParam));
break;
// Process other commands here.
}
break;
// Process other messages here.
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
VOID WINAPI CheckCharacterItem(HWND hwnd, UINT uID)
{
HMENU hmenuBar = GetMenu(hwnd);
HMENU hmenuPopup;
MENUITEMINFO mii;
// Get the handle to the Character menu.
mii.fMask = MIIM_SUBMENU; // information to get
GetMenuItemInfo(hmenuBar, IDM_CHARACTER, FALSE, &mii);
hmenuPopup = mii.hSubMenu;
// Get the state of the specified menu item.
mii.fMask = MIIM_STATE; // information to get
GetMenuItemInfo(hmenuPopup, uID, FALSE, &mii);
// Toggle the checked state.
mii.fState ^= MFS_CHECKED;
SetMenuItemInfo(hmenuPopup, uID, FALSE, &mii);
}
VOID WINAPI CheckParagraphItem(HWND hwnd, UINT uID)
{
HMENU hmenuBar = GetMenu(hwnd);
HMENU hmenuPopup;
MENUITEMINFO mii;
// Get the handle to the Paragraph menu.
mii.fMask = MIIM_SUBMENU; // information to get
GetMenuItemInfo(hmenuBar, IDM_PARAGRAPH, FALSE, &mii);
hmenuPopup = mii.hSubMenu;
// Check the specified item and uncheck all the others.
CheckMenuRadioItem(
hmenuPopup, // handle to menu
IDM_LEFT, // first item in range
IDM_RIGHT, // last item in range
uID, // item to check
MF_BYCOMMAND // IDs, not positions
);
}
BOOL WINAPI OnCreate(HWND hwnd)
{
HMENU hmenuBar = GetMenu(hwnd);
HMENU hmenuPopup;
MENUITEMINFO mii;
UINT uID;
HBITMAP hbmChecked;
HBITMAP hbmUnchecked;
// Get the handle to the Character menu.
mii.fMask = MIIM_SUBMENU; // information to get
GetMenuItemInfo(hmenuBar, IDM_CHARACTER, FALSE, &mii);
hmenuPopup = mii.hSubMenu;
// Create the checked and unchecked bitmaps.
hbmChecked = CreateMenuBitmap(DrawCheck);
hbmUnchecked = CreateMenuBitmap(DrawUncheck);
// Set the checkmark bitmaps for each menu item.
for (uID = IDM_BOLD; uID <= IDM_UNDERLINE; uID++)
{
SetMenuItemBitmaps(hmenuPopup, uID, MF_BYCOMMAND,
hbmUnchecked, hbmChecked);
}
// Get the handle to the Paragraph pop-up menu.
mii.fMask = MIIM_SUBMENU; // information to get
GetMenuItemInfo(hmenuBar, IDM_PARAGRAPH, FALSE, &mii);
hmenuPopup = mii.hSubMenu;
// Create the checked and unchecked bitmaps.
hbmChecked = CreateMenuBitmap(DrawRadioCheck);
hbmUnchecked = CreateMenuBitmap(DrawRadioUncheck);
// Set the checkmark bitmaps for each menu item.
for (uID = IDM_LEFT; uID <= IDM_RIGHT; uID++)
{
SetMenuItemBitmaps(hmenuPopup, uID, MF_BYCOMMAND,
hbmUnchecked, hbmChecked);
}
// Initially check the IDM_LEFT paragraph item.
CheckMenuRadioItem(hmenuPopup, IDM_LEFT, IDM_RIGHT,
IDM_LEFT, MF_BYCOMMAND);
return TRUE;
}
HBITMAP WINAPI CreateMenuBitmap(DRAWFUNC lpfnDraw)
{
// Create a DC compatible with the desktop window's DC.
HWND hwndDesktop = GetDesktopWindow();
HDC hdcDesktop = GetDC(hwndDesktop);
HDC hdcMem = CreateCompatibleDC(hdcDesktop);
// Determine the required bitmap size.
SIZE size = { GetSystemMetrics(SM_CXMENUCHECK),
GetSystemMetrics(SM_CYMENUCHECK) };
// Create a monochrome bitmap and select it.
HBITMAP hbm = CreateBitmap(size.cx, size.cy, 1, 1, NULL);
HBITMAP hbmOld = SelectObject(hdcMem, hbm);
// Erase the background and call the drawing function.
PatBlt(hdcMem, 0, 0, size.cx, size.cy, WHITENESS);
(*lpfnDraw)(hdcMem, size);
// Clean up.
SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem);
ReleaseDC(hwndDesktop, hdcDesktop);
return hbm;
}
VOID WINAPI DrawCheck(HDC hdc, SIZE size)
{
HBRUSH hbrOld;
hbrOld = SelectObject(hdc, GetStockObject(NULL_BRUSH));
Rectangle(hdc, 0, 0, size.cx, size.cy);
MoveToEx(hdc, 0, 0, NULL);
LineTo(hdc, size.cx, size.cy);
MoveToEx(hdc, 0, size.cy - 1, NULL);
LineTo(hdc, size.cx - 1, 0);
SelectObject(hdc, hbrOld);
}
VOID WINAPI DrawUncheck(HDC hdc, SIZE size)
{
HBRUSH hbrOld;
hbrOld = SelectObject(hdc, GetStockObject(NULL_BRUSH));
Rectangle(hdc, 0, 0, size.cx, size.cy);
SelectObject(hdc, hbrOld);
}
VOID WINAPI DrawRadioCheck(HDC hdc, SIZE size)
{
HBRUSH hbrOld;
hbrOld = SelectObject(hdc, GetStockObject(NULL_BRUSH));
Ellipse(hdc, 0, 0, size.cx, size.cy);
SelectObject(hdc, GetStockObject(BLACK_BRUSH));
Ellipse(hdc, 2, 2, size.cx - 2, size.cy - 2);
SelectObject(hdc, hbrOld);
}
VOID WINAPI DrawRadioUncheck(HDC hdc, SIZE size)
{
HBRUSH hbrOld;
hbrOld = SelectObject(hdc, GetStockObject(NULL_BRUSH));
Ellipse(hdc, 0, 0, size.cx, size.cy);
SelectObject(hdc, hbrOld);
}
VOID WINAPI OnDestroy(HWND hwnd)
{
HMENU hmenuBar = GetMenu(hwnd);
HMENU hmenuPopup;
MENUITEMINFO mii;
// Get the handle to the Character menu.
mii.fMask = MIIM_SUBMENU; // information to get
GetMenuItemInfo(hmenuBar, IDM_CHARACTER, FALSE, &mii);
hmenuPopup = mii.hSubMenu;
// Get the check-mark bitmaps and delete them.
mii.fMask = MIIM_CHECKMARKS;
GetMenuItemInfo(hmenuPopup, IDM_BOLD, FALSE, &mii);
DeleteObject(mii.hbmpChecked);
DeleteObject(mii.hbmpUnchecked);
// Get the handle to the Paragraph menu.
mii.fMask = MIIM_SUBMENU; // information to get
GetMenuItemInfo(hmenuBar, IDM_PARAGRAPH, FALSE, &mii);
hmenuPopup = mii.hSubMenu;
// Get the check-mark bitmaps and delete them.
mii.fMask = MIIM_CHECKMARKS;
GetMenuItemInfo(hmenuPopup, IDM_LEFT, FALSE, &mii);
DeleteObject(mii.hbmpChecked);
DeleteObject(mii.hbmpUnchecked);
}