主程序基于对话框,在主对话框上有按钮可以弹出子对话框,
右键菜单的问题出在子对话框上,我用
void CChildDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default
      CMenu menu;
      menu.LoadMenu(IDR_MENU1);
      CMenu *pMenu = menu.GetSubMenu(0);      pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON, 0, 0, this);
 CDialog::OnRButtonDown(nFlags, point);
}
菜单闪一下,就没了。上面的代码如果放在主对话框中,就能弹出菜单,没问题
子对话框属性是popup的,请教各位!谢谢!

解决方案 »

  1.   

    这个问题好办,你只要把menu声明成成员变量就可以了,原因是除了这个函数后CMenu对象自动析构,所以就不见了,所以需要声明成成员变量
      

  2.   

    那是因为你的point有问题,应该用ClientToScreen(&point);把客户端坐标转换成屏幕坐标就行了
    CMenu menu;
    menu.LoadMenu(IDR_MENU1);
    CMenu *pMenu = menu.GetSubMenu(0);
    ClientToScreen(&point);
    pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON, point.x, point.y, this);
    CDialog::OnRButtonDown(nFlags, point);
      

  3.   

    变量作用域问题,在出了这个函数后menu对象依然要保持有效,所以必须把它声明成成员变量
      

  4.   

    我就这么做的,没问题
    CMenu menu;
    menu.LoadMenu(IDR_MENU1);
    CMenu* pPopMenu2=menu.GetSubMenu(0);
            CPoint pos;
    GetCursorPos(&pos);
    //SetForegroundWindow();
    pPopMenu2->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,pos.x,pos.y,this);
      

  5.   

    CPoint p2;
    GetCursorPos( &p2 );
    CMenu menu;
    menu.LoadMenu(IDR_MENU1);
    CMenu *pMenu = menu.GetSubMenu(0);
    CWnd* pWnd = GetDlgItem( IDC_BUTTON1 );
      
    pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON, p2.x, p2.y, this);
      

  6.   

    bluebohe(不掠薄荷) 说的都是屁话,不要信他.
      

  7.   

    程序在
    pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON, p2.x, p2.y, this);
    就阻塞了,根本不关析构的事!
      

  8.   

    回复人: Meuck(如果你相信什么,你就应当有所了解) ( ) 信誉:96  2004-05-08 17:25:00  得分:0 
     
     
      bluebohe(不掠薄荷) 说的都是屁话,不要信他.
      
     
    __________________________________________________________________________
    请您放尊重些,我要求您向我道歉。否则,根据斑竹管理论坛暂行制度
    http://expert.csdn.net/Expert/Manage/managerule.asp?frame=true&csdnstyle=
    以及本版版规
    http://expert.csdn.net/Expert/topic/2872/2872564.xml?temp=.7080805
    我将向本版面版主投诉,请求他们处理您对我的伤害。
    ————————————————————————————————————
    以下言论可直接删除(无论是否已结帖):
    2.伤害他人的、故意挑起事端的话题:骚扰、中伤、污蔑他人,由受伤害者投诉或者网友评判;
      

  9.   

    对于一般情况,也可以这么写:
    CPoint p2;
    GetCursorPos( &p2 );
    CWnd* pWnd = GetDlgItem( IDC_BUTTON1 );
      
    CRect rect;
    CPoint p3 = p2;
    pWnd->ScreenToClient( &p3 );
    pWnd->GetClientRect( &rect );
    if( rect.PtInRect( p2 ) )
    {
    CMenu menu;
    menu.LoadMenu(IDR_MENU1);
    CMenu *pMenu = menu.GetSubMenu(0);

    pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON, p3.x, p2.y, this);
    }
      

  10.   

    我再说详细一些:
    CMenu menu;在类成员中声明menu.LoadMenu(IDR_MENU1);
    在对话框初始化时候加载
      

  11.   

    作用域的问题,"生命"提前结束了
    CMenu menu;
    定义成表态变量或类成员或全局变量.
    static CMenu menu ;---------------------------
    技术上可行
    符合你的要求吗?
    如果不明白
    请给我发短消息
    请附: 帖子的地址
    或在
    http://www.338888.com/VCShare/Default.asp
    上提问
      

  12.   

    这个跟生命周期确实是无关的.
    pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON, point.x, point.y, this);//这里是阻塞的,在菜单没消息前pMenu并不会被析构
      

  13.   

    这个跟生命周期确实是无关的.
    pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON, point.x, point.y, this);//这里是阻塞的,在菜单没消失前pMenu并不会被析构
    //打错了一个字,sorry
      

  14.   

    测试通过的来了,就是CMenu menu;
          menu.LoadMenu(IDR_MENU1);
          CMenu *pMenu = menu.GetSubMenu(0);
      ClientToScreen(&point);
          pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON, point.x, point.y, this);只是在该问题中没问题,:)
      

  15.   

    to bluebohe(不掠薄荷) :
    你说的是最好是这样做,但是你根本就没有解决原来的问题.
    你解决的就是别人想要的,我就是给你这种人害惨了,说两句你就不满意了?
    麻烦你在回答问题前想一想先,不要浪费别人时间,也不要浪费自己时间.
      

  16.   

    Meuck:
    我查过你的帖子,你压根就没有发过一个帖子提问,那么何来的给我这种人害惨了?仁者见仁,智者见智,有不同意见你自己提就是了,何必要攻击别人?我知道TrackPopupMenu是阻塞的,但是楼主的问题在于菜单的一闪而逝,并且在主对话框中是没问题的,所以当然问题应该怀疑在于Menu对象的生命周期。你的代码中仅仅加入了菜单弹出位置的更改,并没有什么新的内容,所以不可能解决楼主的一闪而逝的问题。楼主的代码一般情况下是会在屏幕的左上角显示出一个菜单的
      

  17.   

    bluebohe(不掠薄荷) :
    我没发过贴子?开玩笑!我之前就碰到这个问题
    http://expert.csdn.net/Expert/topic/3025/3025575.xml?temp=9.951419E-02
    你是怎么查的? 是不是search.csdn.net上查的?唉,我想我也是说得重了一点,我在这里向你道个歉。以后还要大家多多照顾呵~
    楼主,这个问题该结了吧.
      

  18.   

    不好意思,我也是见事说事,我比较注重网友对我的态度。
    刚才搞错查询了,应该是下面的方式就对了:(,我没加后面的state参数http://expert.csdn.net/List/TopicsList.aspx?PostUserName=Meuck&page=20&State=1
      

  19.   

    不要吵了,都是为了学习
     
     bluebohe(不掠薄荷 )是个好人,向他学习!
      

  20.   

    学习~!!
    up ~~!!!
    不过bluebohe(不掠薄荷 )回答问题的时候也该想一下~~!
    有一次我把所有原代码发给你,到现在还没有音信(如果很忙,没时间看,回个短消息就可以了,害我就像抓到救命稻草一样,苦等结果~~!!,后来还是自己动手解决了)不过算了,问题早解决了~~~~!!!!
      

  21.   

    不好意思~~!!!
    说错了,不是bluebohe(不掠薄荷 )~~!!!!
    道歉~~~!!!!!
      

  22.   

    countryboy:
    我从来没有收到过你的代码啊!前些天垃圾邮件太多我的邮箱爆了,有问题,只要是到我邮箱的问题,无论我是否能解决都会回复的
      

  23.   

    各位,我查出错误来了,高兴,散分!
    我给出的代码是正确的,没有问题,错误在前面,
    因原代码较长,我在原贴没给出OnRButtonDown函数前面部分的代码,
    让大家疑惑,在此向大家致歉。
    错误的原因是我在OnRButtonDown函数的前面部分,给另一个子窗口调用了SetActiveWindow,
    从而导致右键菜单一闪而过,改正就ok了:)
      

  24.   

    昨晚断网了,继续说明一下。
    因为在OnRButtonDown()函数前面部分给另一个子对话框发送了一个消息,在此消息处理中调用了SetActiveWindow(),实际上右键点下去这个SetActiveWindow无效,但却将右键弹出菜单迅速抹去了。
    好了,谢谢各位,给分了!