WinCE 扩展CMenu遇到的问题,求解
最近需要用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);
}
}
}