CImageList和菜单关联的问题!

时间:2021-02-21 04:57:43
很奇怪的一个问题,实现自绘菜单的过程中,绘制图标使用的是 

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


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


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

#4


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

#5


引用 4 楼 aa3000 的回复:
m_MainMenuImage 和 m_PopMenuImage 是不是加载了一样的图标?


是的,但是顺序不一样!

#6


设置对应的ID

#7


引用 6 楼 zhyp011 的回复:
设置对应的ID


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

#8


m_PopMenu.DrawItem(lpDrawItemStruct); 
m_CustomMenu.DrawItem(lpDrawItemStruct); 

这两句对调,效果会相反?

#9


这个和pImageList有什么关系啊?

#10


引用 9 楼 biweilun 的回复:
这个和pImageList有什么关系啊?


对啊,我觉得也没关系啊,但是问题就是这样啊!

#11


俺也来学习一下

#12


凌晨顶贴  真不容易~

#13


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

#14


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


问题是还是那样啊,怎么回事?

#15


算了算了,还是结贴吧,这个问题下次再解决!

#1


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

#2


你对指针理解不透啊

#3


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


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

#4


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

#5


引用 4 楼 aa3000 的回复:
m_MainMenuImage 和 m_PopMenuImage 是不是加载了一样的图标?


是的,但是顺序不一样!

#6


设置对应的ID

#7


引用 6 楼 zhyp011 的回复:
设置对应的ID


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

#8


m_PopMenu.DrawItem(lpDrawItemStruct); 
m_CustomMenu.DrawItem(lpDrawItemStruct); 

这两句对调,效果会相反?

#9


这个和pImageList有什么关系啊?

#10


引用 9 楼 biweilun 的回复:
这个和pImageList有什么关系啊?


对啊,我觉得也没关系啊,但是问题就是这样啊!

#11


俺也来学习一下

#12


凌晨顶贴  真不容易~

#13


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

#14


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


问题是还是那样啊,怎么回事?

#15


算了算了,还是结贴吧,这个问题下次再解决!