一、添加鼠标监听消息
1 在自定义的MyRichEditCtrl.cpp文件中添加ON_WM_LBUTTONDOWN()
2 如果资源视图中有的话也可以资源视图中点击添加消息,会自动在代码中添加消息映射、函数声明、函数定义基础,我的这个资源图中添加不了所以手动添加的监听消息。
二、在自定义的MyRichEditCtrl.h中添加鼠标点击的函数声明
class MyRichEditCtrl: public CRichEditCtrl{
public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
}
三、 添加函数定义
afx_msg void MyRichEditCtrl::OnLButtonDown(UINT nFlags, CPoint point) {
// 首先调用基类的处理函数
CRichEditCtrl::OnLButtonDown(nFlags, point);
// 获取点击位置的行索引
long nStart=-1, nEnd=-1; //要初始化,不然编译不过
CHARFORMAT cf;
ZeroMemory(&cf, sizeof(CHARFORMAT));
cf.cbSize = sizeof(CHARFORMAT);
GetSelectionCharFormat(cf); //获取当前的字符格式
// 获取当前行的开始和结束位置
int nLineIndex = LineFromChar(nStart); //从0开始,第一行为0,第二行为1...
nStart = LineIndex(nLineIndex); //当前行字符的其实位置,等于上一行的结束位置
nEnd = LineIndex(nLineIndex + 1);
// 设置选中当前行
SetSel(nStart, nEnd);
// 设置选中文本的颜色为高亮颜色
cf.dwEffects &= ~CFE_AUTOCOLOR; //不使用系统字体颜色
cf.dwMask = CFM_COLOR;
cf.crTextColor = RGB(147, 226, 217); //设置文字颜色
SetBackgroundColor(FALSE, RGB(197, 36, 36));//设置背景颜色
SetSelectionCharFormat(cf); //设置字符格式
}
属性值参考:http://www.cjjjs.com/article/626201524319945
四、 其它
4.1. 设置richedit控件框背景色
COLORREF SetBackgroundColor( BOOL bSysColor, COLORREF cr );
参数说明:
bSysColor: 背景色是否要设置为系统值,为TRUE时使用,此时cr设置的值不生效
cr: 背景色,只有在bSysColor是FALSE时才生效。
示例:
SetBackgroundColor(FALSE, RGB(155, 155, 155));//设置为灰色,可以在Initlize()中进行初始设置
4.2 关于SetSel的说明
https://learn.microsoft.com/zh-cn/windows/win32/controls/em-setsel?redirectedfrom=MSDN
如果编辑控件具有 ES_NOHIDESEL 样式,则无论控件是否具有焦点,所选文本都会突出显示。
如果没有 ES_NOHIDESEL 样式,仅当编辑控件具有焦点时,才会突出显示所选文本。
5 保存richEditCtrl控件的内容到txt文件中
void MyDlg::OnBnClickedBtnSave() //按钮控件
{
// TODO: 在此添加控件通知处理程序代码
// 创建一个文件对话框
CFileDialog fileDlg(FALSE, _T("txt), _T("*.txt"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("TXT Files (*.txt)|*.txt|All Files (*.*)|*.*||"), NULL);
if (fileDlg.DoModal() == IDOK)
{
CString filePath = fileDlg.GetPathName(); // 获取文件路径名
// 打开文件准备写入
CFile file;
long length = 0;
if (file.Open(filePath, CFile::modeCreate | CFile::modeWrite))
{
// 获取行数
int lineCount = MyRichEditCtrl.GetLineCount();
long nStart = -1, nEnd = -1;
for (int i = 0; i < lineCount; ++i)
{
// 获取当前行的开始和结束位置
nStart = MyRichEditCtrl.LineIndex(i);
nEnd = MyRichEditCtrl.LineIndex(i + 1);
//获取文本,把文本存放在line
CString line;
MyRichEditCtrl.GetText(nStart, nEnd, line);
if (line.GetLength() > 0)
{
// 检查是否包含指定内容,并保存
int index = line.Find('\t');
line = line.Mid(index + 1);
//将CString类型的命令转为string类型的命令,这一步很重要,不然打开文件显示的是宽字符
string strline = CT2A(line.GetString());
file.Write(strline.c_str(), strline.length());
file.Write("\r\n", 2); // 写入换行符
}
}
file.Close();
}
else
{
// 文件打开失败的处理
AfxMessageBox(_T("无法保存文件。"));
}
}
}
void MyDlg::GetText(int nBegin, int nEnd, CString& text)
{
CHARRANGE CharRange;
CharRange.cpMin = nBegin;
CharRange.cpMax = nEnd;
SetSel(CharRange);
CHAR szTmp[1024] = { 0 };
GetSelText(szTmp);
text.Format(_T("%s"), szTmp);
}