动态生成菜单问题,在线等。

lionpl 2011-09-21 03:26:03
我需要动态生成一个菜单,先做了一个简单的程序实现它,调试没有问题,但是运行中断,麻烦哪位高手帮忙解答,谢谢了。
我在CMainFrame的OnCreate事件处理函数中添加以下代码:
CMenu menu;
menu.CreatePopupMenu();
GetMenu()->AppendMenuW(MF_POPUP,(UINT) menu.m_hMenu, _T("VC++"));
menu.AppendMenuW(MF_STRING, 111, _T("Hello"));
menu.AppendMenuW(MF_STRING, 112, _T("World"));
menu.Detach();
运行后在这句发生中断
{ ASSERT(::IsMenu(m_hMenu)); return ::AppendMenu(m_hMenu, nFlags, nIDNewItem, lpszNewItem); }
说是没有找到符号pMainFrame
具体的添加方式我也是按照这个网页上的说明一步步添加的http://elton.iteye.com/blog/294733
其实是一个很简单的代码,麻烦哪位高手帮忙看看是哪出了问题呢
...全文
141 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lionpl 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 guyue6670 的回复:]
楼主把代码换成这个就可以了;你的代码中GetMenu()得到的NULL,
这个函数在CWND中Retrieves the window's menu.就是NULL
CMenu menu;
menu.CreatePopupMenu();
/*CMenu* m = this->GetMenu(IDR_MENU1);
m->AppendMenu(MF_POPUP,(U……
[/Quote]
我不知道你这代码从哪找来的,但是很多东西都没讲明来历,如p.x,p.y是如何定义的等等。
最重要的一个问题是我的代码在VC6.0里能运行实现,但是在VS2008却不行,主要是因为两者菜单运行机制不一样。网上也有很多求教这个问题的,我想知道除了在建立工程时选择经典菜单这种方法外,有没有修改代码的办法。
美丽海洋 2011-09-23
  • 打赏
  • 举报
回复
楼主把代码换成这个就可以了;你的代码中GetMenu()得到的NULL,
这个函数在CWND中Retrieves the window's menu.就是NULL


CMenu menu;
menu.CreatePopupMenu();
/*CMenu* m = this->GetMenu(IDR_MENU1);
m->AppendMenu(MF_POPUP,(UINT) menu.m_hMenu, _T("VC++")); */
menu.AppendMenu(MF_STRING, 111, _T("Hello"));
menu.AppendMenu(MF_STRING, 112, _T("World"));
CPoint p = point;
ClientToScreen(&p);
menu.TrackPopupMenu(0,p.x,p.y,this);
mahaiwenjun 2011-09-23
  • 打赏
  • 举报
回复
同求,高手解答 ,顶起
mahaiwenjun 2011-09-23
  • 打赏
  • 举报
回复
同求,高手解答
mahaiwenjun 2011-09-23
  • 打赏
  • 举报
回复
同求,高手解答
lionpl 2011-09-23
  • 打赏
  • 举报
回复
继续求答案,语法没有问题,就是VC6.0与VS2008的区别,哪位高手有类似经验啊???
lionpl 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 visualeleven 的回复:]
GetMenu()->AppendMenuW(MF_POPUP,(UINT) menu.m_hMenu, _T("VC++"));
----------------
你的GetMenu()返回的值应该是无效的吧
[/Quote]
刚才又再网上查看了一下,的确是GetMenu()没有获得返回值。
因为VS2008SP1后用的是MFCmenuBar,而不是CMenu,请问这个程序要怎么改才能在VS08中使用呢?
lionpl 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 visualeleven 的回复:]
GetMenu()->AppendMenuW(MF_POPUP,(UINT) menu.m_hMenu, _T("VC++"));
----------------
你的GetMenu()返回的值应该是无效的吧
[/Quote]
问题还没解决,我新增了一个菜单资源IDR_MENU1,在主菜单里面响应一个函数增加IDR_MENU1中的一项
下面代码在VC06里面运行没有问题,但是到VS2008里面就出现中断问题。
CMenu addmenu,*mainmenu;
if(addmenu.LoadMenu(IDR_MENU1)) //装入菜单资源。
{
mainmenu = AfxGetMainWnd()->GetMenu();
mainmenu->InsertMenu(3,MF_POPUP|MF_BYPOSITION|MF_STRING, (UINT)addmenu.GetSubMenu(0)->m_hMenu,"测试");
mainmenu->Detach();
addmenu.Detach();
DrawMenuBar();
}
Eleven 2011-09-21
  • 打赏
  • 举报
回复
GetMenu()->AppendMenuW(MF_POPUP,(UINT) menu.m_hMenu, _T("VC++"));
----------------
你的GetMenu()返回的值应该是无效的吧
cwy2010 2011-09-21
  • 打赏
  • 举报
回复
((CMainFrame * )AfxGetMainWnd ())->GetMenu() 试试行不?
lionpl 2011-09-21
  • 打赏
  • 举报
回复
继续等待高手出现啊
欣客 2011-09-21
  • 打赏
  • 举报
回复

CMenu popMenu;
popMenu.CreatePopupMenu();
popMenu.AppendMenu(MF_STRING,WM_CMD1,"1");
popMenu.AppendMenu(MF_STRING,WM_CMD2,"2");
popMenu.TrackPopupMenu(TPM_LEFTALIGN,pt1.x,pt1.y,GetParent());
popMenu.Detach();
popMenu.DestroyMenu();
dfasri 2011-09-21
  • 打赏
  • 举报
回复
打开DELPHI, 抄抄里面的代码, 百分百不会运行错误...
lionpl 2011-09-21
  • 打赏
  • 举报
回复
VS2008下运行出现中断诶
寒冰雪 2011-09-21
  • 打赏
  • 举报
回复
VS2005 SDI下调试没问题的说。。

LZ可以中断以后查下调用堆栈。。
lionpl 2011-09-21
  • 打赏
  • 举报
回复
我刚试过了,还是一样的错误
罗平 2011-09-21
  • 打赏
  • 举报
回复
GetMenu()->InsertMenu(1,MF_POPUP,(UINT)menu.m_hMenu,L"VC++"); 主菜单项用 InsertMenu试试。

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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