问题描述
最近想用RichEdit控件模拟静态文本控件的效果,在把RichEdit控件设置为只读模式后,发现点击RichEdit控件的文本会出现光标,如下图所示。
解决方法
通过继承CRichEditCtrl来重写WM_LBUTTONDOWN和EN_MSGFILTER消息的处理函数可以解决这一问题,代码如下。
MyRichEditCtrl.h
#pragma once
// CMyRichEditCtrl
class CMyRichEditCtrl : public CRichEditCtrl
{
DECLARE_DYNAMIC(CMyRichEditCtrl)
public:
CMyRichEditCtrl();
virtual ~CMyRichEditCtrl();
protected:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnEnMsgfilter(NMHDR *pNMHDR, LRESULT *pResult);
DECLARE_MESSAGE_MAP()
};
MyRichEditCtrl.cpp
// MyRichEditCtrl.cpp : 实现文件
//
#include "stdafx.h"
#include "Test.h"
#include "MyRichEditCtrl.h"
// CMyRichEditCtrl
IMPLEMENT_DYNAMIC(CMyRichEditCtrl, CRichEditCtrl)
CMyRichEditCtrl::CMyRichEditCtrl()
{
}
CMyRichEditCtrl::~CMyRichEditCtrl()
{
}
BEGIN_MESSAGE_MAP(CMyRichEditCtrl, CRichEditCtrl)
ON_WM_LBUTTONDOWN()
ON_NOTIFY_REFLECT(EN_MSGFILTER, OnEnMsgfilter)
END_MESSAGE_MAP()
// CMyRichEditCtrl 消息处理程序
void CMyRichEditCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRichEditCtrl::OnLButtonDown(nFlags, point);
HideCaret();
}
void CMyRichEditCtrl::OnEnMsgfilter(NMHDR *pNMHDR, LRESULT *pResult)
{
MSGFILTER *pMsgFilter = reinterpret_cast<MSGFILTER *>(pNMHDR);
// TODO: 控件将不发送此通知,除非您重写
// CRichEditCtrl::OnInitDialog() 函数,以将 EM_SETEVENTMASK 消息发送
// 到该控件,同时将 ENM_KEYEVENTS 或 ENM_MOUSEEVENTS 标志
// “或”运算到 lParam 掩码中。
// TODO: 在此添加控件通知处理程序代码
HideCaret();
*pResult = 0;
}
主对话框中创建控件的代码如下。
// 初始化RichEdit控件
CRect rcRichEdit(20, 20, 200, 200);
DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_MULTILINE;
m_wndRichEdit.Create(dwStyle, rcRichEdit, this, IDC_MYRICHEDIT);
m_font.CreatePointFont(100, _T("Microsoft YaHei"));
m_wndRichEdit.SetFont(&m_font);
m_wndRichEdit.SetReadOnly(TRUE);
m_wndRichEdit.SetWindowText(_T("示例文本示例文本示例文本示例文本示例文本"));
long mask = m_wndRichEdit.GetEventMask();
mask |= ENM_KEYEVENTS | ENM_MOUSEEVENTS;
m_wndRichEdit.SetEventMask(mask);
重新执行程序,在控件文字上点击鼠标就不会出现光标了。