比如绘制系统菜单:在绘制"还原"."最大化"."最小化"."关闭"几个菜单项目的时候,他们带有位图.初始化:::ModifyMenu(hMenu,
                        item, 
                        itemInfo.fState | MF_BYPOSITION | MF_OWNERDRAW, 
                        itemID,
                        (LPCTSTR)item);在OnMeasureItem设置高度,没有接收到这几个带有位图标记的菜单的OnMeasureItem函数,请问:需要怎么设置才能修改其高度,又怎么在OnDrawItem中绘制位图标记?谢谢....

解决方案 »

  1.   

    响应WM_INITMENUPOPUP消息设置MF_OWNERDRAW。
    绘制位图就是创建一个内存DC,将要绘制的位图选入,然后BitBlt贴到DRAWITEMSTRUCT结构中的dc上。
      

  2.   

    修改高度就是在OnMeasureItem函数中给lpMeasureItemStruct->itemHeight赋值。注意:不要调用基类的OnMeasureItem函数。
      

  3.   

    另外控件右键菜单的弹出,比如EDIT控件的菜单, 根本就接收不到WM_INITMENUPOPUP消息,所以很难修改.
    除非是重载控件截获右键菜单消息, 但还是不能修改系统菜单啊,不可能每个系统菜单都自己画一个吧.
    请求高手解答!
      

  4.   


    系统菜单收不到OnMeasureItem消息, 如果能收到那肯定可以改变大小, 
    我试的是这样的, 弹出系统菜单的时候收不到OnMeasureItem消息(没办法修改宽度,还有"最大化","最小化",两个高度也变小了.), 但OnDrawItem是可以收到的,
    只不过是系统图标没有办法获得,不可能自己找图标吧?
    我最近就在做这个问题, 一直没有解决.
    如果楼上的有什么好方法可以说出来,
    如果楼上的亲自试过的话可以把代码贴出来,除非是你还有什么其它的方法没有说出来.
    我看楼主的问题也是和我的问题一样,没有解决
      

  5.   

    我前面已经说了,要“响应WM_INITMENUPOPUP消息设置MF_OWNERDRAW”,这样才会收到WM_MEASUREITEM消息。
      

  6.   


    谢谢你的指点, 我的代码如下:void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
    {
    CMDIFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);

    // TODO: Add your message handler code here
    if(bSysMenu)
    {
    CMenu *pMenu = CMenu::FromHandle(pPopupMenu->GetSafeHmenu());
    if(pMenu != NULL)
    {
    UINT nState;
    for(UINT i = 0; i < pMenu->GetMenuItemCount(); i ++)
    {
    LPCOOLMENU lpMenu = new COOLMENU;
    lpMenu->nMenuID = pMenu->GetMenuItemID(i);
    nState=pMenu->GetMenuState(i,MF_BYPOSITION);
    pMenu->GetMenuString(i, lpMenu->strText, MF_BYPOSITION); pMenu->ModifyMenu(i, nState|MF_BYPOSITION | MF_OWNERDRAW, lpMenu->nMenuID, LPCTSTR(lpMenu));
    }
    }
    }确实是可以收到WM_MEASUREITEM消息, 这一点是我以前没有弄清楚, 
    但是收到的只有"移动","大小",这两个ITEM的消息, 正如楼主说的 "还原"."最大化"."最小化"."关闭"几个菜单项是收不到WM_MEASUREITEM消息的,所以高度和前面的图标没办法设置, 我想这几个菜单一定是很特殊,系统自己处理了,所以这个方法对一般菜单还行,对系统菜单就不一定行了!
      

  7.   

    LS怎么又这么轻易就得出了“不行”的结论?
    对于"还原"."最大化"."最小化"."关闭"这几个带bitmap图标的Item,需要把bitmap去掉再设置MF_OWNERDRAW。可以先GetMenuItemInfo,把hbmpItem赋值为NULL,再SetMenuItemInfo。LZ的帖子标题上打着[加急]字样,怎么发完帖子就见不到人了?莫非LS就是LZ?
      

  8.   

    首先,我不是LZ,楼主可能最近比较忙吧.另外
    我在上面的代码pMenu->ModifyMenu(i, nState|MF_BYPOSITION | MF_OWNERDRAW, lpMenu->nMenuID, LPCTSTR(lpMenu)); 前加了
    MENUITEMINFO mii = {0}; 
    pMenu->GetMenuItemInfo(i,&mii);
    if(mii.hbmpItem != NULL)
    mii.hbmpItem = NULL; SetMenuItemInfo(pMenu->GetSafeHmenu(), i, true, &mii);结果发现mii.hbmpItem都是NULL, 这是怎么回事, 是不是我GetMenuItemInfo用的不对?
    怎样才能获得系统菜单前面的图标数据呢?
      

  9.   

    mii结构没有正确初始化,至少cbSize和fMask要赋值。
      

  10.   

    我在上面的代码pMenu->ModifyMenu(i, nState|MF_BYPOSITION | MF_OWNERDRAW, lpMenu->nMenuID, LPCTSTR(lpMenu)); 前加了 MENUITEMINFO mii = {0}; 
    mii.cbSize = sizeof(MENUITEMINFO); 
    mii.fMask =  MIIM_SUBMENU | MIIM_TYPE | MIIM_DATA; pMenu->GetMenuItemInfo(i,&mii); 
    if(mii.hbmpItem != NULL) 
    {
    CBitmap *bm;
    CImageList *pImageList;
    bm = new CBitmap;
    // Bit= (HBITMAP)LoadImage(NULL,"test.bmp" ,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    bm->Attach(mii.hbmpItem);
    pImageList = new CImageList;
    pImageList->Create(16, 16, ILC_MASK, 1, 1);
    pImageList->Add(bm, RGB(192,192,192));
    int C=pImageList->GetImageCount();  mii.hbmpItem = NULL; 
    }mii.fType = MFT_STRING; 
    mii.cch = sizeof(lpMenu->strText); 
    mii.dwTypeData = lpMenu->strText.GetBuffer(0);SetMenuItemInfo(pMenu->GetSafeHmenu(), i, true, &mii); 
    经过上面的修改,系统菜单的长度和宽度都可以自己控制了,if(mii.hbmpItem != NULL) 也能进去了,但是前面的图标获取不到,
    int C=pImageList->GetImageCount();
    返回的是0,
    如果用加载自己的BMP图片是可以的,我就想知道系统菜单是不是获取不到图片还是我获取的方法不对?
      

  11.   

    pMenu->GetMenuItemInfo(i,&mii); 这一行改成 GetMenuItemInfo(pMenu->GetSafeHmenu(), i, true, &mii); 
      

  12.   

    这个hbmpItem不是真正的位图,只是一个索引值,系统根据这个索引值来绘制对应的图标。我没有研究过能否从系统中取出这个图标。
      

  13.   

    你们两个都是高手!不要争吵了.
    出来隔壁帮帮我啦.
    地址:<菜单的问题>
      

  14.   

    我没办法获得系统的最大化,还原等图标, INDEX倒是有就是,8,9,10,11四个,但是我看到都是获得系统文件及文件夹图标的方法,这个的最大化,还原等系统图标还不知道如何获取, 有图标索引值也没有用啊,要不就是自己做个ICON图标,要不就是用GDI直接画线, 那几个系统图标应该比较简单的实现,就是要判断系统菜单的ID号及变灰状态.