首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 弹出式菜单 [已结帖,结帖人:czcwzw]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czcwzw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-10-29 09:49:39 楼主
    CMfcView::CMfcView()
    {
    // TODO: add construction code here
    static CMenu menu;
    menu.LoadMenu(IDR_MENU1);
    pmenu=menu.GetSubMenu(0);

    }

    void CMfcView::OnRButtonDown(UINT nFlags, CPoint point)
    {
    // TODO: Add your message handler code here and/or call default

            ClientToScreen(&point);
    pmenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);//把 CMenu *pmenu;定义为视图类的成员
    CView::OnRButtonDown(nFlags, point);
    }

    右键单击时显示不出来???
    120  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zqh886
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-29 09:55:111楼 得分:2
    你也可以用Pop_menu

    CMenu menu; //menu要设置为成员变量,如果不是成员变量。要在pmenu->TrackPopupMenu之后调用menu.Detach();
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czcwzw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-29 10:00:332楼 得分:0
    "CMenu menu; //menu要设置为成员变量"

    为什么
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zqh886
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-29 10:13:093楼 得分:0
    如果是局部变量的话,一到函数的结束,该变量就销毁了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zaodt
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-29 10:17:064楼 得分:2
    还是一个变量作用域范围的问题。


    static CMenu menu;


    这个只在当前函数中有效。


    改为类的成员变量

    public:

      CMenu m_menu;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czcwzw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-29 11:39:015楼 得分:0
    to 4楼:
    "这个只在当前函数中有效"

    static不是静态的吗
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czcwzw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-29 11:39:326楼 得分:0
    static在程序结束时释放把
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fenge1981
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-30 13:21:407楼 得分:2
    如你的static CMenu menu; 放到函数里,它的作用域只是当前的函数,不要以为它是静态的,就是全局的
    只有把它放到全局比如类变量中时,它才有效
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czcwzw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-30 22:51:348楼 得分:0
    但我也做了一写改动如:

    static CMenu menu;

    CMfcView::CMfcView()
    {
    // TODO: add construction code here

    menu.LoadMenu(IDR_MENU1);
    pmenu=menu.GetSubMenu(0);

    }

    把CMenu menu定义成全局的,但是还是不行?????????????
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lang528
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-30 23:06:069楼 得分:2
    这个给你参考一下
    void CViewStockList::OnRclickListStocklist(NMHDR* pNMHDR, LRESULT* pResult)
    {
    // TODO: Add your control notification handler code here
    //CStuffManageDlg stuffManageDlg;
    CMenu menu;
    LPPOINT  point=new  tagPOINT; 
    ::GetCursorPos(point);//得到鼠标位置

    VERIFY( menu.LoadMenu(IDR_MENU2) );
    CMenu* popup = menu.GetSubMenu(0);
    ASSERT(popup != NULL );
     

    POSITION pos = m_myStockList.GetFirstSelectedItemPosition();
    if(pos != NULL)
    {
    SetEnableMenu(popup);
    popup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point->x, point->y, this );
    }

    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 7

      2

      17

    发表于:2008-10-30 23:21:1910楼 得分:0
    在视图类中响应WM_CONTEXTMENU消息来弹出菜单。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yuhudie203
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-30 23:26:4011楼 得分:0
    去掉定义CMenu 前面的static

    右键消息下代码为:
    // TODO: Add your message handler code here and/or call default
    CMenu menu;
    menu.LoadMenu(IDR_MENU1);
    ClientToScreen(&point);
    CMenu *pmenu;
    pmenu=menu.GetSubMenu(0);
    pmenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
    CView::OnRButtonDown(nFlags, point);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • whoo
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-30 23:29:4212楼 得分:2
    代码看不出问题,检查下IDR_MENU1菜单资源看看。 简单的测试:把IDR_MENU1换成IDR_MAINFRAME
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czcwzw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 08:34:5113楼 得分:0
    感谢9楼和11楼提供的代码,

    我只想知道我的程序错在哪里
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czcwzw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 08:50:5914楼 得分:0
    这样的:

    void CMfcView::OnContextMenu(CWnd* pWnd, CPoint point)
    {
    // TODO: Add your message handler code here
            CMenu menu;
    menu.LoadMenu(IDR_MENU1);
    pmenu=menu.GetSubMenu(0);
    pmenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);

    }

    或者

    void CMfcView::OnRButtonDown(UINT nFlags, CPoint point)
    {
    // TODO: Add your message handler code here and/or call default
            ClientToScreen(&point);
            CMenu menu;
    menu.LoadMenu(IDR_MENU1);
    pmenu=menu.GetSubMenu(0);
    pmenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
    CView::OnRButtonDown(nFlags, point);
    }
    都是没有问题的,我现在知道了怎么样来使用一个弹出式菜单,

    我原来那么写只是想试试,不过居然出了问题,那么现在我当然要把问题找出来,

    所以我还是继续等待,等待大家帮我把错误找出来,

    是不是作用域的问题,没错, CMenu menu;的作用域只限于CMfcView::CMfcView,但问题是,我在CMfcView::CMfcView内

    已经把CMenu menu的子菜单传给了一个视图类的数据成员pmenu.

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yjgx007
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 08:57:0015楼 得分:0

    C/C++ code
    pmenu->TrackPopupMenu(TPM_LEFTALIGN|[color=#FF0000]TPM_RETURNCMD[/color],point.x,point.y,this);

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yjgx007
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 08:57:2516楼 得分:0
    加上TPM_RETURNCMD试试...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lhdqj
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 09:32:4717楼 得分:0
    用pop menu很方便
    Project->Add to Project->Components and Controls添加pop menu即可
    然后在资源视图里会出现一个新的菜单,那就是右击快捷菜单,修改方法和一般的菜单一样修改
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gellf
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 09:46:0018楼 得分:20
    C/C++ code
    class CErro1View : public CView { public: CMenu *my_menu; int *my_id; …… } static CMenu myme; CErro1View::CErro1View() { // TODO: add construction code here myme.LoadMenu(IDR_MENU1); my_menu = myme.GetSubMenu(0); static int test_id; test_id = 5; my_id = &test_id; } void CErro1View::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default //my_menu->AssertValid(); //VERIFY( my_menu ); ASSERT( my_menu ); /* CMenu myme; myme.LoadMenu(IDR_MENU1); my_menu = myme.GetSubMenu(0);*/ //my_menu. // myme.LoadMenu(IDR_MENU1); //my_menu = myme.GetSubMenu(0); static int destiny_id = 0; if(destiny_id == 0) { destiny_id = *my_id;//这里destiny值为5 my_menu = myme.GetSubMenu(0); ClientToScreen(&point); my_menu->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this); CView::OnRButtonDown(nFlags, point); } else { ClientToScreen(&point); my_menu->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);//这里根本就没弹出菜单 CView::OnRButtonDown(nFlags, point); } }


    我的结论就是
    pmenu=menu.GetSubMenu(0);
    pmenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
    这两个不可以分开,menu只要是有效变量就OK;

    但更深的原因就只有等高手了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yuhudie203
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 10:01:5419楼 得分:10
    我刚试了也一下和楼上结论差不多

    其实CMenu menu;并不一定要定义成类成员变量,全局也可

    在构造函数里对pmenu进行赋值的话运行程序不会出现右键菜单

    把pmenu=menu.GetSubMenu(0);
    放在右键点击函数里方可

    打断点进行跟踪 发现在构造函数里pmenu的地址和OnRButtonDown里pmenu的地址是相同的

    但是里面是不一样的 在构造函数里的pmenu成员值还存在 当点击右键时pmenu虽然地址一样 但是成员值均为垃圾数据0xfeeefeee

    所以就如楼上所说 pemnu的得到和TrackPopupMenu在同一函数中实现
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • leon131421
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 10:22:0520楼 得分:0
    记号
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czcwzw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 10:26:5321楼 得分:0
    我也试了一下,确实,pmenu的值在构造函数中还好好的,

    但是一但到了OnRButtonDown就变了,说明他被修改了,

    但是谁修改的,为什么会修改呢??

    这让我想起了我的另外一篇帖子,问题类似.不知道大家愿意帮我去看一下另外一篇吗????

    http://topic.csdn.net/u/20081027/11/852e51f6-9053-4d84-823a-697b0f26e484.html
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czcwzw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 10:29:2522楼 得分:0
    to15楼的,不行啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czcwzw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 10:34:4623楼 得分:0
    to17楼的,谢谢你让我知道了另一种方法.


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cnzdgs
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 7

      2

      17

    发表于:2008-10-31 14:23:3724楼 得分:80
    问题的原因就是CMenu::GetSubMenu返回的是一个临时指针,过一段时间后MFC会自动释放,MFC类似这种情况还有很多,返回这种情况得到的指针都应该在每次使用前获取,不要保存,更不能自己delete。如果你保存的是HMENU就没问题了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • czcwzw
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-31 14:53:2725楼 得分:0
    确实,跟踪发现,在构造函数中的pmenu->m_hMenu

    和OnRButtonDown函数中的pmenu->m_hMenu的值不一样,

    而且调试的时候pmenu的旁边是这样写的{CTempMenu}.

    种种迹象表明,确实像24楼所说的.

    感谢大家的帮忙
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved