是SDI工程在CMainFrame的Create中把菜单设置成了自画-------------------------------------------------------------------------------
我自画菜单,但是,却只画了每个子菜单下的第一个分隔符,其它的都没有画,为什么?
-------------------------------------------------------------------------------这是我更改菜单为自画菜单样式的函数(自定义自画菜单类):
void CAutoMenu::SetAutoDrawStyle( CMenu *pMenu )
{
int i, j;
j = pMenu->GetMenuItemCount();
for ( i = 0; i < j; i++ )
{
CMenu *pSubMenu = pMenu->GetSubMenu( i );
if ( pSubMenu != NULL )
{
SetAutoDrawStyle( pSubMenu );
}
else
{
MENUITEMINFO mii;
mii.fMask = MIIM_TYPE;
pMenu->GetMenuItemInfo( i, &mii, true );  //最后一个参数是false也一样
pMenu->ModifyMenu( i, mii.fType | MFT_OWNERDRAW | MFT_STRING );
}
}
}这是自画菜单的测试函数:
void CAutoMenu::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct )
{
if ( !m_bSetAlready )
return; LPDRAWITEMSTRUCT pit = lpDrawItemStruct;
CString strText; m_pMenu->GetMenuString( pit->itemID, strText, MF_BYCOMMAND );
::FillRect( pit->hDC, &pit->rcItem, CBrush(RGB(200, 150, 150)) );
static int iCount;
//strText.Format( "%d", iCount );
::TextOut( pit->hDC, pit->rcItem.left, pit->rcItem.top, strText.GetBuffer(strText.GetLength()),
strText.GetLength() );
iCount ++;
}在CMainFrame中:
(其中的m_AutoMenu为CMainFrame中声明的CAutoMenu类型的变量)
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
     ...
CMenu *pMenu = GetMenu();
m_AutoMenu.SetMenu( pMenu );
     ... return 0;
}void CMainFrame::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
// TODO: Add your message handler code here and/or call default
CFrameWnd::OnDrawItem(nIDCtl, lpDrawItemStruct);
m_AutoMenu.DrawItem( lpDrawItemStruct );
}void CMainFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
{
// TODO: Add your message handler code here and/or call default
CFrameWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
m_AutoMenu.MeasureItem( lpMeasureItemStruct );
}

解决方案 »

  1.   

    CAutoMenu::SetMenu中,只调用了
    CAutoMenu::SetAutoDrawStyle,即void CAutoMenu::SetMenu( CMenu *pMenu )
    {
       if ( m_bSetAlready )
         return;
       m_bSetAlready = true;
       m_pMenu = pMenu;
       SetAutoDrawStyle( pMenu );
    }在设置自画样式的函数里把 mii.fMask = MIIM_TYPE; 一行注释掉也一样
      

  2.   

    设轩样式改成了:
    MENUITEMINFO mii;
    mii.fMask = MIIM_TYPE;// | MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU;
    pMenu->GetMenuItemInfo( i, &mii, true );
    pMenu->ModifyMenu( i, mii.fType | MF_BYPOSITION | MFT_OWNERDRAW | MFT_STRING );
    之后,都有了自画,但是却变成了一个很窄的小竖条,怎么办呀?
      

  3.   

    pMenu->GetSubMenu()->ModifyMenu
      ( i, mii.fType | MF_BYPOSITION | MFT_OWNERDRAW | MFT_STRING );
      

  4.   

    写错了,呵呵 
    pMenu->GetSubMenu(0)->TrackPopupMenu
    (TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x, 
    point.y, this);我回答了你的问题,你回答我一个:
    “老板说mis部不是赚钱的部门...”是什么意思?
    上次我看到你的名字就纳闷了一大会儿:
    mis : miss ? mission ?....
      

  5.   

    不好意思,刚才连你的问题都没看清楚,
    还以为你要动态创建浮动菜单呢 //修改菜单风格为自绘
    pMenu->ModifyMenu(i,MF_BYPOSITION|MF_OWNERDRAW,lpItem->uID,(LPCTSTR)lpItem);
      

  6.   

    pMenu->ModifyMenu(i,MF_BYPOSITION|MF_OWNERDRAW,lpItem->uID,(LPCTSTR)lpItem);
    一句中,lpItem是从何而来?
      

  7.   

    mis部门 : 信息技术部门,Management Information System
    一般是拥有计算机网络的工厂会有“老板说mis部不是赚钱的部门...”
    这一句话一直都让我郁闷。我上个工作是台湾的一个很大的电脑主板维修厂里的mis部(当程序员),后来一个特高级主管说,其它的部门都是会赚钱,就你们mis部门不但不会赚钱,反而还要花钱!超郁闷呀,如果用这种理念来经营一个企业,我想,这个企业迟早会完蛋的,最起码它永远都不会变成一个可以让人害怕的对手企业,不会成为世界性的大企业,因为那种眼光,是如此之短浅,是如此之落后,是让人如此之不屑
    ......................
      

  8.   

    哦~~~~~~~~~~~~~~~~~我有个例子,你自个儿看嘛,我懒得贴代码了。
    [email protected]
      

  9.   

    对你老板的话,你可以这么回应:
    送他一个风筝,然后把线剪断,让他和其它风筝一起比赛试试。偶开始还以为是miss呢,一个公司里面的miss不赚钱也没有什么,漂亮就好^o^
      

  10.   


    我用别人的MenuEx,我新建一个工程就可以,但我要在我现在已经ok的工程中添加就不行,都是和新建的工程的添加步骤一模一样的,但就是不行,哎,晕了已经
      

  11.   

    miss不赚钱也没有什么,漂亮就好^o^说得极是呀,现在深有体会  :)
      

  12.   

    你跟踪一下代码试试,不行就把你的程序发到我的信箱;
    我晚上回来看,现在去dating , 嘿嘿 ^o^
      

  13.   


    不行,这程序不能外泄(不好意思)这是原来的程序,我是修改的,只能编译成release,不能debug,这一点一直都郁闷,调试非常不方便我不管它了,等客户要求时再说吧,但是我自己还是应该把这个弄会的,说不定以后会有用的 :)
      

  14.   

    dating
    ---------------------
    老兄,是什么意思?还没有见过这个词   ( * - * )
      

  15.   

    我是从vckbase上看的三篇文章
    用他们的类来做,一直不行,后来才发现一个问题:
    用他们的类,CMainFrame的父类必需是CMDIWnd(好象没有记错吧),但我的却不是这算什么问题嘛