要把自绘制菜单映射到FrameWnd上。
解决方案 »
- CreateInstance(__uuidof(MSXML2::DOMDocument30));为什么不是m_pXMLDoc的成员错误?
- CDHtmlDialog,显示某些网页时,提示脚本错误找不到对象,程序崩溃。。。
- 多线程
- 得到了BITMAPINFOHEADER后,如何显示BMP的问题
- 在任务管理器中,关闭进程时,如何关闭程序中存在的对象句柄?请看正文
- 如何用sql语句实现把从一个表中查询出来的多条记录一次性插入到另外一个表中?? 指教!
- 怎么样在程序中访问网页,然后得到数据流
- 提一个关于MFC程序编译的问题,困绕我良久了。
- 怎么会有这样的事,I'm 疯ing!!!
- 单步运行OnReceive可以接收到完整数据,连续运行却不行
- 原先曾经写过一些“骗”稿费的文章,初学者请进...
- 关于com 的问题:我做了个exe com 在一台机器上运行,我要在另一台机器上调用它,应该用哪些函数。
void CMyMenu::ReMapMenu(CMenu *pMenu)
{
CMyMenuData * m_pMenuData;
CMenu *m_SubMenu;
int m_MenuCount; m_MenuCount = pMenu->GetMenuItemCount(); for(int i = m_MenuCount -1 ; i >= 0 ; i --)
{
if((m_SubMenu = pMenu->GetSubMenu(i)) != NULL)
ReMapMenu(m_SubMenu);
m_pMenuData = new CMyMenuData;
if(pMenu->GetMenuItemID(i) == 0) // is a separater
{
m_pMenuData->m_IsSeparator = TRUE;
m_pMenuData->m_Icon = 0;
}
else
{
m_pMenuData->m_Icon = 0;
m_pMenuData->m_IsSeparator = FALSE;
pMenu->GetMenuString(i,m_pMenuData->m_MenuTitle,MF_BYPOSITION);
}
m_MenuArray.Add(m_pMenuData);
if(!pMenu->ModifyMenu(i,MF_OWNERDRAW|MF_BYPOSITION,0,(char *)m_pMenuData))
{
AfxMessageBox("ModifyMenu Error!");
return;
}
}
}我在mainframe中定义了CMyMenu m_Menu ;
然后在OnCreate中加了:CMenu *m_TempMenu = GetMenu();
m_Menu.RemapMenu(m_TempMenu);运行后就出现了菜单无消息响应的情况。为了简化说明,我的drawitem和measureitem函数如下:
void CMyMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
lpMeasureItemStruct->itemHeight = 16;
lpMeasureItemStruct->itemWidth = 70;
}void CMyMenu::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CMyMenuData *m_MenuData = (CMyMenuData *)lpDrawItemStruct->itemData;
CDC *m_DC = CDC::FromHandle(lpDrawItemStruct->hDC); m_DC->DrawText(m_MenuData->m_MenuTitle,
&lpDrawItemStruct->rcItem,DT_CENTER|DT_BOTTOM);
}MainFrame中的上述两个函数为:
void CMainFrame::OnMeasureItem(int nIDCtl,
LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
if(lpMeasureItemStruct->CtlType == ODT_MENU)
m_Menu.MeasureItem(lpMeasureItemStruct);
else
CFrameWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
}void CMainFrame::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if(lpDrawItemStruct->CtlType == ODT_MENU)
m_Menu.DrawItem(lpDrawItemStruct);
else
CFrameWnd::OnDrawItem(nIDCtl, lpDrawItemStruct);
}