»ç¿ëÀÚ Á¤ÀÇ Ã¼Å© ¸¶Å© ºñÆ®¸Ê »ç¿ëÀÇ ¿¹

ÀÌ Ç׸ñÀÇ ¿¹Á¦´Â µÎ ¸Þ´ºÀÇ ¸Þ´º Ç׸ñ¿¡ ºñÆ®¸Ê »ç¿ëÀÚ ÁöÁ¤ È®ÀζõÀ» ÇÒ´çÇÕ´Ï´Ù. ¹®ÀÚ Æ¯¼ºÀ» ÁöÁ¤ Çϴ ù ¹øÂ° ¸Þ´ºÀÇ ¸Þ´º Ç׸ñ: ±½°Ô, ±â¿ïÀӲà ¹× ¹ØÁÙ. °¢ ¸Þ´º Ç׸ñ ¼±Åà ¶Ç´Â ¼±Åà Ãë¼Ò µÉ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ ¸Þ´º Ç׸ñ¿¡ ´ë ÇÑ ¿¹Á¦´Â À¯»çÇÑ È®Àζõ ÄÁÆ®·ÑÀÇ 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); 
} 
 

 

Index