很奇怪的一个问题,实现自绘菜单的过程中,绘制图标使用的是 pImageList->Draw(m_dc,IconIndex,CPoint(m_rect.left+2,m_rect.top+2),
ILD_TRANSPARENT);的方式绘制的,pImageList 是 菜单的一个指针变量,void CCustomMenu::SetMenuImageList(CImageList *pImageList)
{
this->pImageList = pImageList;
}是 CMainFrame 中传递给它值,问题来了,绘制是绘制出来了,但是问题是我有两个菜单需要绘制,一个是标准的主框架的菜单,还有一个是弹出式的菜单,右键单击弹出,但是怎么会图标变成一样的了呢,也就是主框架上的图标和弹出式菜单的图标是一一对应相同的,搞什么鬼,我明明是 m_CustomMenu.SetMenuImageList(&m_MainMenuImage);
m_PopMenu.SetMenuImageList(&m_PopMenuImage);赋了不同的值啊,但是为什么会这样,是不是有一个覆盖掉其中一个了在 CMainFrame::OnDrawItem 中m_PopMenu.DrawItem(lpDrawItemStruct);
m_CustomMenu.DrawItem(lpDrawItemStruct);如果把上面两句话位置改一下,结果正好相反,也就是本来是是标准菜单把弹出菜单覆盖了,换一下上面的语句之后,就变成弹出菜单把标准菜单的图标覆盖了,你说怪不怪,不知道是什么原因,我在怀疑是 CImageList 是不是用了同一个,虽然设置了两个,可能指针的原因只用一个,会不会呢???

解决方案 »

  1.   

    当你调用SetMenuImageList的时候把pImageList的值赋值了,而pImageList只是一个成员变量而已,你调用两次SetMenuImageList当然就是pImageList指向了后面那次的赋值。
      

  2.   


    但是 CCustomMenu 有两个变量啊,指向的相应的指针应该不一样才对啊!
      

  3.   

    m_MainMenuImage 和 m_PopMenuImage 是不是加载了一样的图标?
      

  4.   


    设置什么 ID ,两个菜单用不同的图标ID?
      

  5.   

    m_PopMenu.DrawItem(lpDrawItemStruct); 
    m_CustomMenu.DrawItem(lpDrawItemStruct); 这两句对调,效果会相反?
      

  6.   

    这个和pImageList有什么关系啊?
      

  7.   

    OnDrawItem中,你的代码是在同一个菜单上绘制了两次,不是你想象的在两个不同的菜单上绘制,你应该根据情况调用不同的语句,比如:
    if ( m_PopMenu.GetSafeHMenu() == (HMENU)lpDrawItemStruct.hwndItem )
        m_PopMenu.DrawItem(lpDrawItemStruct);
    else
        m_CustomMenu.DrawItem(lpDrawItemStruct); 
    其实由于所有控件的自绘消息都在OnDrawItem中处理,应该还要更复杂的判断,因此最好控件自己处理WM_DRAWITEM消息或者重写DrawItem虚函数。