我这里有一个自绘菜单,如果菜单的所有项全是popup菜单的话,菜单显示时只有12个像素的宽度,根本不能显示上面的文字。我查看MFC代码// Measure item implementation relies on unique control/menu IDs
void CWnd::OnMeasureItem(int /*nIDCtl*/, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
if (lpMeasureItemStruct->CtlType == ODT_MENU)
{
ASSERT(lpMeasureItemStruct->CtlID == 0);
CMenu* pMenu; _AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
if (pThreadState->m_hTrackingWindow == m_hWnd)
{
// start from popup
pMenu = CMenu::FromHandle(pThreadState->m_hTrackingMenu);
}
else
{
// start from menubar
pMenu = GetMenu();
} pMenu = _AfxFindPopupMenuFromID(pMenu, lpMeasureItemStruct->itemID);
if (pMenu != NULL)
pMenu->MeasureItem(lpMeasureItemStruct);// 注意这里
else
TRACE1("Warning: unknown WM_MEASUREITEM for menu item 0x%04X.\n",
lpMeasureItemStruct->itemID);
}
else
{
CWnd* pChild = GetDescendantWindow(lpMeasureItemStruct->CtlID, TRUE);
if (pChild != NULL && pChild->SendChildNotifyLastMsg())
return; // eaten by child
}
// not handled - do default
Default();
}pMenu = _AfxFindPopupMenuFromID(pMenu, lpMeasureItemStruct->itemID);只有pMenu有效才会调用
pMenu->MeasureItem(lpMeasureItemStruct);
但由于Popup菜单根本没有ID,所以pMenu->MeasureItem(lpMeasureItemStruct);
不可能执行,这样菜单的高度和宽度就没法设置,怎么解决呀?
void CWnd::OnMeasureItem(int /*nIDCtl*/, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
if (lpMeasureItemStruct->CtlType == ODT_MENU)
{
ASSERT(lpMeasureItemStruct->CtlID == 0);
CMenu* pMenu; _AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
if (pThreadState->m_hTrackingWindow == m_hWnd)
{
// start from popup
pMenu = CMenu::FromHandle(pThreadState->m_hTrackingMenu);
}
else
{
// start from menubar
pMenu = GetMenu();
} pMenu = _AfxFindPopupMenuFromID(pMenu, lpMeasureItemStruct->itemID);
if (pMenu != NULL)
pMenu->MeasureItem(lpMeasureItemStruct);// 注意这里
else
TRACE1("Warning: unknown WM_MEASUREITEM for menu item 0x%04X.\n",
lpMeasureItemStruct->itemID);
}
else
{
CWnd* pChild = GetDescendantWindow(lpMeasureItemStruct->CtlID, TRUE);
if (pChild != NULL && pChild->SendChildNotifyLastMsg())
return; // eaten by child
}
// not handled - do default
Default();
}pMenu = _AfxFindPopupMenuFromID(pMenu, lpMeasureItemStruct->itemID);只有pMenu有效才会调用
pMenu->MeasureItem(lpMeasureItemStruct);
但由于Popup菜单根本没有ID,所以pMenu->MeasureItem(lpMeasureItemStruct);
不可能执行,这样菜单的高度和宽度就没法设置,怎么解决呀?
解决方案 »
- AsyncSelect(FD_WRITE) 出现 Debug Assertion Failed
- 问个SOAP相关的客户端调用。
- 问一个命令行参数的问题
- 大家帮我看看这段连接错误啊,郁闷死了,一直出现!
- 软件开发项目,从立项、定义、需求分析、概要设计、详细设计、编码实现、测试等,大家认为各开发阶段应该优先选用哪些配套的易用、优秀的开发工具。并且通过对优秀的开发工具的合理评价和交流,方便我们广大开发者。
- switch语句的用法
- 如何读取/写入INI文件啊?
- 有做过MMC插件的没有?
- 紧急~,高分给与解答者----有关WINDOW XP内存映射问题
- 编写COM进程内服务程序时,我实现一个方法时用到代码for(int i=0;i++;i<nCount),结果有Warning
- 如何去掉GDI+放大顯示圖片的邊緣柔化???????????
- 数组名用数组变量来表示该如何实现建立、引用、释放
ID是-1,全部Popup菜单项的ID都是-1,我不知道你说的ID是什么?问题已经解决,在弹出菜单的窗口映射WM_MEASUREITEM消息,在消息映射函数中调用菜单的MeasureItem虚函数就可以了。