¼ÒÀ¯ÀÚ°¡ ±×¸° ¸Þ´º Ç׸ñÀÇ ¿¹

ÀÌ Ç׸ñÀÇ ¿¹Á¦¿¡¼­´Â ¸Þ´º¿¡¼­ ¼ÒÀ¯ÀÚ°¡ ±×¸° ¸Þ´º Ç׸ñÀ» »ç¿ëÇÕ´Ï´Ù. ¸Þ´º Ç׸ñ ±Û²Ã Ư¼ºÀ» ¼±Åà ÇÏ °í ÇØ´ç Ư¼ºÀ» °¡Áø ±Û²ÃÀ» »ç¿ë ÇÏ ¿© °¢ ¸Þ´º Ç׸ñÀ» Ç¥½Ã ÇÏ´Â ÀÀ¿ë ÇÁ·Î±×·¥. ¿¹¸¦ µé¾î, ±â¿ïÀӲà ±Û²Ã¿¡ ±â¿ïÀӲà ¸Þ´º Ç׸ñÀÌ Ç¥½Ã µË´Ï´Ù. ¹®ÀÚ ¸Þ´º À̸§ ¸Þ´º Ç¥½ÃÁÙ¿¡¼­ ¸Þ´º¸¦ ¿±´Ï´Ù.

¸Þ´º ¸ðÀ½ ¹× µå·Ó ´Ù¿î ¸Þ´º¸¦ óÀ½ È®ÀåµÈ ¸Þ´º ÅÛÇø´ ¸®¼Ò½º¿¡ ÀÇÇØ Á¤ÀÇ µË´Ï´Ù. ¸Þ´º¿¡¼­ ´ÙÀ½ ¹®ÀÚ¿­ 4 ÅØ½ºÆ® ¸Þ´º Ç׸ñÀ» óÀ½ Æ÷ÇÔ ¸Þ´º ¼­½Ä ÆÄÀÏ ¼ÒÀ¯ÀÚ°¡ ±×¸° Ç׸ñÀ» ÁöÁ¤ÇÒ ¼ö ¾ø½À´Ï´Ù, ¶§¹®¿¡: "ÀϹÝ", "±½°Ô," "±â¿ïÀÓ²Ã" ¹× "¹ØÁÙ." ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ Ã¢ ÇÁ·Î½ÃÀú WM_CREATE ¸Þ½ÃÁö¸¦ ó¸®ÇÒ ¶§ÀÌ ¼ÒÀ¯ÀÚ°¡ ±×¸° Ç׸ñÀ» º¯°æ ÇÕ´Ï´Ù. â ÇÁ·Î½ÃÀú¿¡ °¢ ¸Þ´º Ç׸ñ¿¡ ´ëÇØ ´ÙÀ½ ´Ü°è¸¦ ¼öÇà ÇÏ´Â ÀÀ¿ë ÇÁ·Î±×·¥ Á¤ÀÇ OnCreate ÇÔ¼ö È£Ãâ WM_CREATE ¸Þ½ÃÁö¸¦ ¹ÞÀ¸¸é

  1. ÀÀ¿ë ÇÁ·Î±×·¥ Á¤ÀÇ MYITEM ±¸Á¶ ÇÒ´ç.
  2. ÀÀ¿ë ÇÁ·Î±×·¥ Á¤ÀÇ MYITEM ±¸Á¶¿¡ ÀúÀå ÇÏ´Â ¸Þ´º Ç׸ñÀÇ ÅØ½ºÆ®¸¦ °¡Á®¿É´Ï´Ù.
  3. ¸Þ´º Ç׸ñÀ» Ç¥½Ã ÇÏ´Â µ¥ »ç¿ë ÇÏ´Â ±Û²ÃÀ» ¸¸µé°í ÀÀ¿ë ÇÁ·Î±×·¥ Á¤ÀÇ MYITEM ±¸Á¶¿¡ ÇÚµéÀ» ÀúÀå.
  4. MFT_OWNERDRAW ¸Þ´º Ç׸ñ Çü½ÄÀ» º¯°æ ÇÏ °í Ç׸ñ µ¥ÀÌÅÍ¿Í ÀÀ¿ë ÇÁ·Î±×·¥ Á¤ÀÇ MYITEM ±¸Á¶¿¡ ´ë ÇÑ Æ÷ÀÎÅ͸¦ ÀúÀå.

°¢ ÀÀ¿ë ÇÁ·Î±×·¥ Á¤ÀÇ 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); 
} 
 

 

Index