怎样在CRichEditCtrl控件中加入自己的右键菜单?

主  题:  
怎样在CRichEditCtrl控件中加入自己的右键菜单?
 
     
我想在自己编的程序中,当鼠标右击RichEdit控件时,能在该控件中在鼠标的当前位置弹出右键菜单。可是对该控件进行消息映射时发现没有像视图类那样的WM_RBUTTONDOWN消息,仅有一个NM_RCLICK消息,映射后,发现生成的消息映射函数的参数中根本没有当前鼠标的坐标,该怎么在该控件中实现右键菜单呢?
  回复人: ahao(天·狼·星星) ( ) 信誉:97 2003-03-07 21:03:37Z 得分:100
 
 
?
先
BOOL CPopupDemoDlg::OnInitDialog() 
{ 
   m_RichEdit.SetEventMask(ENM_MOUSEEVENTS);
...

再
//
BOOL CPopupDemoDlg::PreTranslateMessage(MSG* pMsg)
{ 
    if (pMsg->message ==WM_RBUTTONDOWN)
    {
        CWnd * pWnd = (CWnd*) GetDlgItem(IDC_RICHEDIT); 
        if (pWnd ==GetFocus())
        {
              CMenu menu;
              DWORD dwSelectionMade; VERIFY(menu.LoadMenu(IDR_MENU1));
              CMenu *pmenuPopup = menu.GetSubMenu(0);
              ASSERT(pmenuPopup != NULL);                                    
              dwSelectionMade = pmenuPopup->TrackPopupMenu( (TPM_LEFTALIGN|
                                                                TPM_LEFTBUTTON|
                                                                TPM_NONOTIFY|
                                                                TPM_RETURNCMD),
                                                                 pMsg->pt.x, 
                                                                 pMsg->pt.y, this
                                                          );  
              pmenuPopup->DestroyMenu();
             //excercise for the reader...deal with the selection the user has made here
             return TRUE;
               }
    }
    return CDialog::PreTranslateMessage(pMsg);
}
//

Top
 
  回复人: dacaifu(dacai) ( ) 信誉:105 2003-03-07 21:05:52Z 得分:0
 
 
?
ON_WM_CONTEXTMENU
Top
 
  回复人: thebesghost(底比斯幽灵) ( ) 信誉:100 2003-03-07 22:13:21Z 得分:0
 
 
?
ahao(天·狼·星星)您好!
我查了msdn关于SetEventMask()的内容:DWORD SetEventMask( DWORD dwEventMask );
其中的dwEventMask风格参数却没有查到,只是找到了这么一句话:The default event mask (before any is set) is ENM_NONE.

您能告诉我您用的"ENM_MOUSEEVENTS"是系统定义的还是您自定义的呢?如果是自定义的,能告诉我该如何定义吗?像自定义消息一样用#define吗?
还有就是PreTranslateMessage()是重载的虚函数吗?我没用过这个函数,能给我讲讲这个函数的作用吗?我还想知道它的参数“MSG* pMsg”是从哪来的?
能给我讲讲吗?多谢!!

Top
 
  回复人: ahao(天·狼·星星) ( ) 信誉:97 2003-03-07 22:44:48Z 得分:0
 
 
?
ENM_MOUSEEVENTS 这个是系统定义的,直接可以用了
MSDN里应该有的,你的MSDN估计不是很新

PreTanslateMessage是虚函数,
CWinApp在把消息分发给windows窗口函数之前会调用这个虚函数

MSG就是一个结构,里面有消息相关的一些数据

你按我上面说的做,一定可以成功的
Top
 
  回复人: demetry(智者橡木) ( ) 信誉:131 2003-03-08 01:48:08Z 得分:0
 
 
?
CWinApp::PreMessageTranslate和CWnd::PreMessageTranslate相当有用,它可以在应用程序的主窗口中接受各类消息
Top
 
  回复人: thebesghost(底比斯幽灵) ( ) 信誉:100 2003-03-08 09:30:41Z 得分:0
 
 
?
ahao(天·狼·星星)您好!
我按您的做了,能实现右键菜单!可是却又冒出了个没想到的问题:原来在菜单中第一的功能京都没有了。我是首先在工程中定义了一个主菜单,将它的第二栏子菜单作为弹出的菜单:CMenu *pmenuPopup = menu.GetSubMenu(1);   在运行后窗口的主菜单中,这个菜单中的每个菜单项的功能都执行得很好,(我本来已经对他们都消息映射过了,而且消息映射函数都写了);可是,在RichEditCtrl中弹出的菜单,明明是一样的,但功能却没有,这是怎么回事啊??怎么会出现这种情况呢?

Top
 
  回复人: thebesghost(底比斯幽灵) ( ) 信誉:100 2003-03-08 09:33:31Z 得分:0
 
 
?
:)第二行“第一”打错了,是“定义”。“京”是“竟”。

Top
 
  回复人: thebesghost(底比斯幽灵) ( ) 信誉:100 2003-03-08 10:36:04Z 得分:0
 
 
?
我的程序是一个子对话框的程序。先建立了一个主对话框,然后建立了两个子对话框,并将这两个子对话框作为主对话框类的对象成员。在主对话框的OnInitDialog()函数中,生成两个非模态的子对话框,一个显示,一个隐藏,并同时加载一个菜单。在该菜单中有一项,当点击时便使当前显示的子对话框隐藏,而隐藏的子对话框显示,同时改变主对话框加载的菜单,我也正是想让弹出式菜单对应这个菜单的第二个子菜单(里面有5个菜单项)。
我在第二个子对话框中加入了一个CRichEditCtrl控件。用您给我的方法,成功地加载了弹出式菜单,但是菜单的功能却没有了。点击每个弹出式菜单的菜单项,丝毫没有响应。而我明明已经在主对话框类中对它进行了消息映射。在主菜单中点击时功能是正常的。
这是怎么回事呢?
点击菜单时发出的WM_COMMAND消息难道没被发到主对话框的消息循环中吗?(我前面说了,是在主对话框类中对菜单进行的消息映射。)是被PreTranslateMessage(MSG* pMsg)函数给提前截获了吗??
我对菜单重新在第二个子对话框类中进行了消息映射,可是还是没有结果。
能告诉我原因吗?该怎样解决???

急!!!



Top
 
  回复人: ahao(天·狼·星星) ( ) 信誉:97 2003-03-08 12:48:21Z 得分:0
 
 
?
:)这个问题很容易解决
在TrackPopupMenu中有个参数TPM_RETURNCMD看到了吗?
把它去掉就可以了。
有这个参数的话,直接返回你选中的菜单ID,消息不进主循环了。
Top
 
  回复人: thebesghost(底比斯幽灵) ( ) 信誉:100 2003-03-08 17:59:19Z 得分:0
 
 
?
ahao,您好!!真是太感谢您了!!!
我照你的方法,马上就实现了。

你真是太厉害了!我简直佩服得五体投地。。。    :)

请你吃饭吧,呵呵。
我学vc已经半年多了,可实践的经验却非常少,做过的东西很少,对vc理解的也很浅薄。同样一个问题,您能手到病除,而我却郁闷了一天了。唉,我真的好佩服你啊。能收我做徒弟吗?我的e-mail是[email protected],能否把您的信箱告诉我,我会有许多问题问您。
承蒙帮助,感恩之至!


Top
 
  回复人: ahao(天·狼·星星) ( ) 信誉:97 2003-03-08 18:10:04Z 得分:0
 
 
?
:)解决了就好,我的email,[email protected],有问题可以问我,我知道的话会帮你的,做师傅就不敢了,我的水平还很一般。
Top
 
  回复人: thebesghost(底比斯幽灵) ( ) 信誉:100 2003-03-08 19:43:09Z 得分:0
 
 
?
谦虚!
:)谢谢你!我把你的地址记下了,但愿我们能成为好朋友。
 

你可能感兴趣的:(MFC,menu,command,windows,null,user)