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 是不是用了同一个,虽然设置了两个,可能指针的原因只用一个,会不会呢???
15 个解决方案
#1
当你调用SetMenuImageList的时候把pImageList的值赋值了,而pImageList只是一个成员变量而已,你调用两次SetMenuImageList当然就是pImageList指向了后面那次的赋值。
#2
你对指针理解不透啊
#3
但是 CCustomMenu 有两个变量啊,指向的相应的指针应该不一样才对啊!
#4
m_MainMenuImage 和 m_PopMenuImage 是不是加载了一样的图标?
#5
是的,但是顺序不一样!
#6
设置对应的ID
#7
设置什么 ID ,两个菜单用不同的图标ID?
#8
m_PopMenu.DrawItem(lpDrawItemStruct);
m_CustomMenu.DrawItem(lpDrawItemStruct);
这两句对调,效果会相反?
m_CustomMenu.DrawItem(lpDrawItemStruct);
这两句对调,效果会相反?
#9
这个和pImageList有什么关系啊?
#10
对啊,我觉得也没关系啊,但是问题就是这样啊!
#11
俺也来学习一下
#12
凌晨顶贴 真不容易~
#13
OnDrawItem中,你的代码是在同一个菜单上绘制了两次,不是你想象的在两个不同的菜单上绘制,你应该根据情况调用不同的语句,比如:
if ( m_PopMenu.GetSafeHMenu() == (HMENU)lpDrawItemStruct.hwndItem )
m_PopMenu.DrawItem(lpDrawItemStruct);
else
m_CustomMenu.DrawItem(lpDrawItemStruct);
其实由于所有控件的自绘消息都在OnDrawItem中处理,应该还要更复杂的判断,因此最好控件自己处理WM_DRAWITEM消息或者重写DrawItem虚函数。
if ( m_PopMenu.GetSafeHMenu() == (HMENU)lpDrawItemStruct.hwndItem )
m_PopMenu.DrawItem(lpDrawItemStruct);
else
m_CustomMenu.DrawItem(lpDrawItemStruct);
其实由于所有控件的自绘消息都在OnDrawItem中处理,应该还要更复杂的判断,因此最好控件自己处理WM_DRAWITEM消息或者重写DrawItem虚函数。
#14
问题是还是那样啊,怎么回事?
#15
算了算了,还是结贴吧,这个问题下次再解决!
#1
当你调用SetMenuImageList的时候把pImageList的值赋值了,而pImageList只是一个成员变量而已,你调用两次SetMenuImageList当然就是pImageList指向了后面那次的赋值。
#2
你对指针理解不透啊
#3
但是 CCustomMenu 有两个变量啊,指向的相应的指针应该不一样才对啊!
#4
m_MainMenuImage 和 m_PopMenuImage 是不是加载了一样的图标?
#5
是的,但是顺序不一样!
#6
设置对应的ID
#7
设置什么 ID ,两个菜单用不同的图标ID?
#8
m_PopMenu.DrawItem(lpDrawItemStruct);
m_CustomMenu.DrawItem(lpDrawItemStruct);
这两句对调,效果会相反?
m_CustomMenu.DrawItem(lpDrawItemStruct);
这两句对调,效果会相反?
#9
这个和pImageList有什么关系啊?
#10
对啊,我觉得也没关系啊,但是问题就是这样啊!
#11
俺也来学习一下
#12
凌晨顶贴 真不容易~
#13
OnDrawItem中,你的代码是在同一个菜单上绘制了两次,不是你想象的在两个不同的菜单上绘制,你应该根据情况调用不同的语句,比如:
if ( m_PopMenu.GetSafeHMenu() == (HMENU)lpDrawItemStruct.hwndItem )
m_PopMenu.DrawItem(lpDrawItemStruct);
else
m_CustomMenu.DrawItem(lpDrawItemStruct);
其实由于所有控件的自绘消息都在OnDrawItem中处理,应该还要更复杂的判断,因此最好控件自己处理WM_DRAWITEM消息或者重写DrawItem虚函数。
if ( m_PopMenu.GetSafeHMenu() == (HMENU)lpDrawItemStruct.hwndItem )
m_PopMenu.DrawItem(lpDrawItemStruct);
else
m_CustomMenu.DrawItem(lpDrawItemStruct);
其实由于所有控件的自绘消息都在OnDrawItem中处理,应该还要更复杂的判断,因此最好控件自己处理WM_DRAWITEM消息或者重写DrawItem虚函数。
#14
问题是还是那样啊,怎么回事?
#15
算了算了,还是结贴吧,这个问题下次再解决!