首页 > 其他 > 详细

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

时间:2015-03-28 23:18:31      阅读:1202      评论:0      收藏:0      [点我收藏+]

前言


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

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


实现方法



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

MessageHandler中修改原有代码

 bool bWasHandled = true;
    if( (uMsg >= WM_MOUSEFIRST && uMsg <= WM_MOUSELAST) || uMsg == WM_SETCURSOR ) {
        if( !m_pTwh->IsCaptured() ) {
            switch (uMsg) {
            case WM_LBUTTONDOWN:
            case WM_LBUTTONUP:
            case WM_LBUTTONDBLCLK:
            case WM_RBUTTONDOWN:
            case WM_RBUTTONUP:
                {
                    POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
                    CControlUI* pHover = GetManager()->FindControl(pt);
                    if(pHover != this) {
                        bWasHandled = false;
                        return 0;
                    }
					if ( uMsg == WM_RBUTTONUP )
					{
						GetManager()->SendNotify(this, DUI_MSGTYPE_RBTN_RICHEDIT);
					}
                }
                break;
            }
        }

#define DUI_MSGTYPE_RBTN_RICHEDIT   (_T("rbtn_richedit"))

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


第二步:添加右键菜单

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

void CMainWnd::Notify( TNotifyUI& msg )
{
	if ( _tcscmp(msg.sType, DUI_MSGTYPE_RBTN_RICHEDIT) == 0 )
	{
		CRichEditUI* pRichEdit = static_cast<CRichEditUI*>(msg.pSender);
		if ( NULL == pRichEdit )
			return ;
		CRichEditMenuWnd* pMenuWnd = new CRichEditMenuWnd(pRichEdit);
		pMenuWnd->Create(NULL, L"菜单", WS_POPUP, WS_EX_TOPMOST);
		POINT pt;
		GetCursorPos(&pt);
		pMenuWnd->MoveWindow(pt.x, pt.y, 104, 102, FALSE);
		pMenuWnd->ShowWindow();
		return ;
	}
	WindowImplBase::Notify(msg);
}

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


void CRichEditMenuWnd::OnClick( TNotifyUI& msg )
{
	if ( _tcscmp(msg.pSender->GetName(), _T("undo")) == 0 )
	{
		m_pRichEdit->Undo();
	}

	else if ( _tcscmp(msg.pSender->GetName(), _T("cut")) == 0 )
	{
		m_pRichEdit->Cut();
	}

	else if ( _tcscmp(msg.pSender->GetName(), _T("copy")) == 0 )
	{
		m_pRichEdit->Copy();
	}

	if ( _tcscmp(msg.pSender->GetName(), _T("paste")) == 0 )
	{
		m_pRichEdit->Paste();
	}
	Close();
}

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


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


技术分享



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

原文:http://blog.csdn.net/mfcing/article/details/44706829

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!