MFC中RichEdit2.0控件,实现鼠标选中行高亮显示

一、添加鼠标监听消息

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);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC的LISTCTRL控件默认情况下是无法自动改变高的,需要通过代码实现。以下是实现自动改变高的方法: 1. 首先需要在列表控件的创建过程设置风格为LVS_REPORT,这可以在属性窗口设置或者在代码使用ModifyStyle函数设置。 2. 在列表控件的初始化过程,需要设置高为所需的高度,可以使用SetItemHeight函数设置。 3. 在列表控件的绘制过程,需要计算每个单元格的文本高度,并将高设置为最高的文本高度。可以使用GetDC函数获取设备上下文,然后使用GetTextExtent函数计算文本高度。 4. 在列表控件的大小改变事件,需要重新计算每个单元格的文本高度,并将高设置为最高的文本高度。可以使用GetClientRect函数获取列表控件的客户端区域,然后根据客户端区域大小计算每个单元格的大小。 以下是示例代码: ```cpp // 设置列表控件风格为LVS_REPORT m_listCtrl.ModifyStyle(0, LVS_REPORT); // 设置高为20 m_listCtrl.SetItemHeight(-1, 20); // 在绘制过程计算文本高度并设置高 void CMyDlg::OnCustomDrawList(NMHDR* pNMHDR, LRESULT* pResult) { LPNMLVCUSTOMDRAW lpLVCustomDraw = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR); // 判断绘制状态 switch (lpLVCustomDraw->nmcd.dwDrawStage) { case CDDS_PREPAINT: *pResult = CDRF_NOTIFYITEMDRAW; break; case CDDS_ITEMPREPAINT: { // 计算文本高度 CString strText = m_listCtrl.GetItemText(lpLVCustomDraw->nmcd.dwItemSpec, lpLVCustomDraw->iSubItem); CRect rectText(lpLVCustomDraw->nmcd.rc); CDC* pDC = CDC::FromHandle(lpLVCustomDraw->nmcd.hdc); pDC->DrawText(strText, rectText, DT_CALCRECT); // 设置高为文本高度 int nHeight = rectText.Height() + 4; m_listCtrl.SetItemHeight(lpLVCustomDraw->nmcd.dwItemSpec, nHeight); *pResult = CDRF_DODEFAULT; } break; default: *pResult = CDRF_DODEFAULT; break; } } // 在大小改变事件重新计算文本高度并设置高 void CMyDlg::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); // 计算单元格大小 CRect rectClient; m_listCtrl.GetClientRect(rectClient); int nWidth = rectClient.Width() / m_listCtrl.GetHeaderCtrl()->GetItemCount(); int nHeight = 20; // 设置列宽和高 for (int i = 0; i < m_listCtrl.GetHeaderCtrl()->GetItemCount(); i++) { m_listCtrl.SetColumnWidth(i, nWidth); } m_listCtrl.SetItemHeight(-1, nHeight); } ``` 以上代码,OnCustomDrawList函数处理列表控件的绘制过程,通过计算文本高度并设置实现自动改变高。OnSize函数处理列表控件的大小改变事件,重新计算文本高度并设置高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值