WinCE 扩展CMenu遇到的问题,求解

topgun0506 2007-01-31 05:46:20
最近需要用DirectShow设计一个Camera应用程序,为了美化界面想扩展些组件出来,在扩展CMenu时麻烦不断,首先发现在WinCE下GetMenuItemID有Bug,对MF_POPUP类型子菜单其返回值并非文档中介绍的-1,而是菜单句柄。于是自好绕路通过GetSubMenu先判断是否为Pop菜单然后在判断是否为分隔栏或普通菜单。
现在想重载LoadMenu,在加载资源过程中就将其Style设定为MF_OWNERDRAW,然后在重载DrawItem,但是现在发现只要将Style设定为MF_OWNERDRAW,调用TrackPopupMenuEx函数时显示时就出错,而该为MF_STRING就正常,请问问题出在哪儿?下面是我的LoadMenu函数中调用用来修改风格的函数,我是通过AppendMenu一项一项加载菜单项的:
void CSXMenu::ChangeMenuStyle(CMenu *pMenu,HMENU hMenu)
{

if(pMenu == NULL)
return;

UINT nItemID = 0;
CMenu *pTempMenu = NULL;
int nCount = (int)pMenu->GetMenuItemCount();
for(int i = 0; i < nCount; i++)
{
MENUITEMINFO menuInfo;
menuInfo.cbSize = sizeof(MENUITEMINFO);

//Because the bug of GetMenuItemID,have to use GetSubMenu
pTempMenu = pMenu->GetSubMenu(i);
if(pTempMenu == NULL)
{
//No Pop Menu,So It's a Normal Menu or Separator
nItemID = pMenu->GetMenuItemID(i);
if(nItemID == 0)
{
//Separator Item
CMenuItem *pMenuItem = new CMenuItem;
::AppendMenu(hMenu,MF_SEPARATOR,0,(LPCTSTR)pMenuItem);

//::ModifyMenu(hMenu,i,MF_BYPOSITION | MF_OWNERDRAW,-1,(LPCTSTR)pMenuItem);

#if 0
menuInfo.fMask = MIIM_TYPE;
pMenu->GetMenuItemInfo(i,&menuInfo,TRUE);
menuInfo.fType = MFT_OWNERDRAW;
menuInfo.dwItemData = *test;
pMenu->SetMenuItemInfo(i,&menuInfo,TRUE);
#endif
}
else
{
//Normal Menu Item
CString strMenuText;
CMenuItem *pMenuItem = new CMenuItem;
pMenu->GetMenuString(i,strMenuText,MF_BYPOSITION);
//pMenuItem->SetString((LPCTSTR)strMenuText);
UINT nState = pMenu->GetMenuState(i,MF_BYPOSITION);
//::AppendMenu(hMenu,MF_STRING,nItemID,strMenuText);

//ModifyMenuEx(i,MF_BYPOSITION,nItemID);
#if 0
menuInfo.fMask = MIIM_TYPE;
pMenu->GetMenuItemInfo(i,&menuInfo,TRUE);
menuInfo.fType = MFT_OWNERDRAW;
menuInfo.fType &= ~MF_STRING;
menuInfo.dwItemData = *test;
pMenu->SetMenuItemInfo(i,&menuInfo,TRUE);
#endif
}

}
else
{
//Pop Menu
//Create Popup Menu
HMENU hSubMenu = ::CreatePopupMenu();
CString strMenuText;
CMenuItem *pMenuItem = new CMenuItem;
pMenu->GetMenuString(i,strMenuText,MF_BYPOSITION);
//::InsertMenu(hMenu,i,MF_BYPOSITION | MF_POPUP | MF_STRING,(UINT)hSubMenu,strMenuText);
//::ModifyMenu(hMenu,i,MF_BYPOSITION | MF_OWNERDRAW| MF_POPUP ,(UINT)hSubMenu,(LPCTSTR)pMenuItem);
UINT nState = pMenu->GetMenuState(i,MF_BYPOSITION);
//::AppendMenu(hMenu,MF_POPUP | MF_STRING,(UINT)hSubMenu,strMenuText);
menuInfo.fMask = MIIM_TYPE;
menuInfo.fType = MFT_OWNERDRAW|MFT_STRING|MF_POPUP;
InsertMenuItem(hMenu,i,TRUE,&menuInfo);

#if 0
menuInfo.fMask = MIIM_TYPE;
pMenu->GetMenuItemInfo(i,&menuInfo,TRUE);
menuInfo.fType = MFT_OWNERDRAW;
//menuInfo.dwItemData = *test;
pMenu->SetMenuItemInfo(i,&menuInfo,TRUE);
#endif
ChangeMenuStyle(pTempMenu,hSubMenu);
}
}
}
...全文
383 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Panghuang 2008-09-24
  • 打赏
  • 举报
回复
菜单可以自绘,但是很痛苦,比Windows下功能弱多了
91program 2008-06-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lucas2 的回复:]
evc下到底能不能对菜单进行自绘阿,我也卡在这个问题上了。
网上都没找到相关信息,谁帮帮忙阿!!
[/Quote]

当然可以,你可以去我的BLOG看看(BLOG中没有自绘的方法,呵呵...)
CE的开始菜单都可以自绘,更不要说其它菜单了。
lucas2 2008-06-10
  • 打赏
  • 举报
回复
evc下到底能不能对菜单进行自绘阿,我也卡在这个问题上了。
网上都没找到相关信息,谁帮帮忙阿!!

19,504

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧