Duilib中为RichEdit\Edit控件添加自定义右键菜单

转自:http://blog.csdn.net/mfcing/article/details/44706829#  


前言


Duilib中的RichEdit控件在使用中发现,基本上对复制、粘贴、剪切等快捷方式都是支持的,不过唯一缺点是没有右键菜单,感觉不够好,于是就想着加上右键菜单。

右键菜单基本思路是,在RichEdit的消息处理函数中对鼠标的右键消息处理,发送一个自定义的Notify消息出来,主窗口中受到这个消息后弹出自己的右键菜单。


实现方法



第一步:把鼠标右键消息转发出来

MessageHandler中修改原有代码

[cpp]  view plain  copy
  1. bool bWasHandled = true;  
  2.    if( (uMsg >= WM_MOUSEFIRST && uMsg <= WM_MOUSELAST) || uMsg == WM_SETCURSOR ) {  
  3.        if( !m_pTwh->IsCaptured() ) {  
  4.            switch (uMsg) {  
  5.            case WM_LBUTTONDOWN:  
  6.            case WM_LBUTTONUP:  
  7.            case WM_LBUTTONDBLCLK:  
  8.            case WM_RBUTTONDOWN:  
  9.            case WM_RBUTTONUP:  
  10.                {  
  11.                    POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };  
  12.                    CControlUI* pHover = GetManager()->FindControl(pt);  
  13.                    if(pHover != this) {  
  14.                        bWasHandled = false;  
  15.                        return 0;  
  16.                    }  
  17.                 if ( uMsg == WM_RBUTTONUP )  
  18.                 {  
  19.                     GetManager()->SendNotify(this, DUI_MSGTYPE_RBTN_RICHEDIT);  
  20.                 }  
  21.                }  
  22.                break;  
  23.            }  
  24.        }  

#define DUI_MSGTYPE_RBTN_RICHEDIT   (_T("rbtn_richedit"))

这个Notify需要自己定义,消息一经发送出去了,初步处理那是客户端的事了。你需要自定义右键菜单就对这个消息处理。


第二步:添加右键菜单

在主窗口的Notify函数中,弹出右键菜单

[cpp]  view plain  copy
  1. void CMainWnd::Notify( TNotifyUI& msg )  
  2. {  
  3.     if ( _tcscmp(msg.sType, DUI_MSGTYPE_RBTN_RICHEDIT) == 0 )  
  4.     {  
  5.         CRichEditUI* pRichEdit = static_cast<CRichEditUI*>(msg.pSender);  
  6.         if ( NULL == pRichEdit )  
  7.             return ;  
  8.         CRichEditMenuWnd* pMenuWnd = new CRichEditMenuWnd(pRichEdit);  
  9.         pMenuWnd->Create(NULL, L"菜单", WS_POPUP, WS_EX_TOPMOST);  
  10.         POINT pt;  
  11.         GetCursorPos(&pt);  
  12.         pMenuWnd->MoveWindow(pt.x, pt.y, 104, 102, FALSE);  
  13.         pMenuWnd->ShowWindow();  
  14.         return ;  
  15.     }  
  16.     WindowImplBase::Notify(msg);  
  17. }  

第三步:对菜单的点击事件进行处理


[cpp]  view plain  copy
  1. void CRichEditMenuWnd::OnClick( TNotifyUI& msg )  
  2. {  
  3.     if ( _tcscmp(msg.pSender->GetName(), _T("undo")) == 0 )  
  4.     {  
  5.         m_pRichEdit->Undo();  
  6.     }  
  7.   
  8.     else if ( _tcscmp(msg.pSender->GetName(), _T("cut")) == 0 )  
  9.     {  
  10.         m_pRichEdit->Cut();  
  11.     }  
  12.   
  13.     else if ( _tcscmp(msg.pSender->GetName(), _T("copy")) == 0 )  
  14.     {  
  15.         m_pRichEdit->Copy();  
  16.     }  
  17.   
  18.     if ( _tcscmp(msg.pSender->GetName(), _T("paste")) == 0 )  
  19.     {  
  20.         m_pRichEdit->Paste();  
  21.     }  
  22.     Close();  
  23. }  

还好在SendNotify时我们发送了EichEdit控件的指针,在创建菜单时又把这个指针传给了菜单的构造函数,于是可以调用其成员函数实现复制、粘贴等功能了,多简单。


看看效果图,还是很满意的吧:




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值