your must modify all it's menu items's MeasureItem.

解决方案 »

  1.   

    这个问题我碰到过,发现在MeasureItem里MFC的内部对弹出式菜单返回为NULL,后来不得以重写此函数,不知是否不对或有其他方法
      

  2.   

    // Measure item implementation relies on unique control/menu IDs
    void CWnd::OnMeasureItem(int /*nIDCtl*/, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
    {
    if (lpMeasureItemStruct->CtlType == ODT_MENU)
    {
    ASSERT(lpMeasureItemStruct->CtlID == 0);
    CMenu* pMenu; _AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
    if (pThreadState->m_hTrackingWindow == m_hWnd)
    {
    // start from popup
    pMenu = CMenu::FromHandle(pThreadState->m_hTrackingMenu);
    }
    else
    {
    // start from menubar
    pMenu = GetMenu();
    } pMenu = _AfxFindPopupMenuFromID(pMenu, lpMeasureItemStruct->itemID);
    if (pMenu != NULL)
    pMenu->MeasureItem(lpMeasureItemStruct);
    else
    TRACE1("Warning: unknown WM_MEASUREITEM for menu item 0x%04X.\n",
    lpMeasureItemStruct->itemID);
    }
    else
    {
    CWnd* pChild = GetDescendantWindow(lpMeasureItemStruct->CtlID, TRUE);
    if (pChild != NULL && pChild->SendChildNotifyLastMsg())
    return;     // eaten by child
    }
    // not handled - do default
    Default();
    }