当前位置: 首页 > wzjs >正文

品划网络做营销型网站网站开发的体会

品划网络做营销型网站,网站开发的体会,哪个网站可以做计算机二级的题,学网络营销有用吗CRichEditCtrl 控件实现日志输出 富文本编辑控件(CRichEditCtrl)是 MFC 应用中实现彩色日志、文本高亮和多格式输出的利器。本文结合项目实战,分享如何用 CRichEditCtrl 高效实现彩色日志输出与行数自动裁剪,附完整代码&#xff0…

CRichEditCtrl 控件实现日志输出

富文本编辑控件(CRichEditCtrl)是 MFC 应用中实现彩色日志、文本高亮和多格式输出的利器。本文结合项目实战,分享如何用 CRichEditCtrl 高效实现彩色日志输出与行数自动裁剪,附完整代码,适合新手和有经验的开发者查阅。


一、CRichEditCtrl 简介

CRichEditCtrl 是 MFC 封装的 Windows 富文本编辑控件,支持多种字体、颜色、段落格式。相比 CEdit,功能更丰富,特别适合做日志、终端窗口、聊天界面等需要高亮、排版的场景。


二、控件初始化——必须在窗口创建前初始化!

注意:CRichEditCtrl 控件初始化顺序

必须在控件创建之前调用 AfxInitRichEdit2(),推荐在应用程序的 InitInstance() 最前面调用。千万不要在 OnInitDialog 里调用,否则控件无法正常显示!

正确写法:

// 在你的 CWinApp 子类的 InitInstance() 开头
BOOL CYourApp::InitInstance()
{// RichEdit 控件初始化(必须最早,否则控件无效)AfxInitRichEdit2();// 下面才是界面窗口的创建流程CYourDlg dlg;m_pMainWnd = &dlg;dlg.DoModal();return FALSE;
}

三、控件布局与变量关联

在对话框资源中添加一个 Rich Edit 控件(控件类选择 Rich Edit Control,控件 ID 可设为 IDC_EDIT_LOG),并用 ClassWizard 关联成员变量:

CRichEditCtrl m_editLog;

四、核心功能代码

1. 日志颜色宏定义

#define LOG_COLOR_NORMAL   RGB(0, 0, 0)         // 普通:黑色
#define LOG_COLOR_SUCCESS  RGB(0, 128, 0)       // 成功:绿色
#define LOG_COLOR_ERROR    RGB(255, 0, 0)       // 错误:红色
#define LOG_COLOR_WARNING  RGB(255, 165, 0)     // 警告:橙色
#define LOG_COLOR_TIME     RGB(0, 0, 255)       // 时间戳:蓝色

2. 限制最大行数

void CRobotCmdTestDlg::TrimRichEditLineLimit(int maxLines)
{int lineCount = m_editLog.GetLineCount();if (lineCount <= maxLines) {return;}// 获取多余行的字符数范围int charIndex = m_editLog.LineIndex(maxLines);m_editLog.SetSel(0, charIndex); // 选中多余内容m_editLog.ReplaceSel(_T(""));   // 删除
}
  • 作用:只保留最近 maxLines 行日志,防止控件内容无限增长。
  • 注意:调用 LineIndex 后需判断返回值大于0,避免异常。

3. 彩色追加日志(含时间戳)

void CRobotCmdTestDlg::AppendLogLineRichStyled(const CString& content, COLORREF color /*= RGB(0, 0, 0)*/)
{// 时间戳CString timestamp;CTime now = CTime::GetCurrentTime();timestamp.Format(_T("[%02d:%02d:%02d] "), now.GetHour(), now.GetMinute(), now.GetSecond());// 插入点移到最后(也可以设为 0 表示顶部)m_editLog.SetSel(-1, -1);// 插入时间(蓝色)CHARFORMAT2 cfTime = {};cfTime.cbSize = sizeof(cfTime);cfTime.dwMask = CFM_COLOR;cfTime.crTextColor = LOG_COLOR_TIME;m_editLog.SetSelectionCharFormat(cfTime);m_editLog.ReplaceSel(timestamp);// 插入日志正文(传入颜色)CHARFORMAT2 cfMsg = {};cfMsg.cbSize = sizeof(cfMsg);cfMsg.dwMask = CFM_COLOR;cfMsg.crTextColor = color;m_editLog.SetSelectionCharFormat(cfMsg);m_editLog.ReplaceSel(content + _T("\r\n"));// 限制最大行数TrimRichEditLineLimit(100);
}
  • 优点:支持彩色时间戳和内容分色,并自动裁剪行数。

4. 查找并高亮所有匹配文本

void CRobotCmdTestDlg::HighlightAllMatches(const CString& strSearch, COLORREF clrHighlight /*= RGB(255, 165, 0)*/)
{if (strSearch.IsEmpty()) {return;}long nStart = 0;long nEnd = m_editLog.GetTextLength();CHARRANGE cr;FINDTEXTEX ft = { 0 };ft.chrg.cpMin = 0;ft.chrg.cpMax = nEnd;ft.lpstrText = strSearch.GetString();// 高亮前不清除全文颜色,避免历史多色混淆while (m_editLog.FindText(FR_DOWN, &ft) != -1) {m_editLog.SetSel(ft.chrgText.cpMin, ft.chrgText.cpMax);CHARFORMAT2 cf = {};cf.cbSize = sizeof(cf);cf.dwMask = CFM_COLOR;cf.crTextColor = clrHighlight;m_editLog.SetSelectionCharFormat(cf);// 下次搜索从后面开始ft.chrg.cpMin = ft.chrgText.cpMax;}m_editLog.SetSel(-1, 0);
}
  • 优点:用 FindText 确保高亮区间精确无偏差,推荐用橙色高亮(RGB(255, 165, 0))。

5. 函数声明(推荐 .h 文件里这样写)

void TrimRichEditLineLimit(int maxLines = 100);
void AppendLogLineRichStyled(const CString& content, COLORREF color = RGB(0, 0, 0));
void HighlightAllMatches(const CString& strSearch, COLORREF clrHighlight = RGB(255, 165, 0));

五、遇到的问题和解决方法

1. 颜色太亮导致观感不佳

  • 问题RGB(255,255,0) 黄色高亮在白底界面太刺眼。
  • 解决:改为 RGB(255,165,0) 橙色、RGB(200,140,0) 深黄,或选择其它深色。

2. 高亮区间与实际文本不对应

  • 问题:用 CString::Find 得到的字符位置与 CRichEditCtrl 实际位置不一致(可能因编码、换行符、隐藏字符等原因),高亮出现错位。
  • 解决:使用 FindText 接口,确保在 RichEdit 控件真实字符序号下查找和高亮,无论文本内容如何变化都能精确定位。

3. 字符串类型不兼容编译错误

  • 问题ft.lpstrText = strSearch.GetBuffer(); 导致 E1087 错误(类型不兼容)。
  • 解决:改为 ft.lpstrText = strSearch.GetString();(LPCTSTR)strSearch,与 MFC/ATL 兼容。

4. 恢复/清空高亮颜色

  • 问题:如果想让所有内容恢复为普通色,不应每次高亮前都全量重置,否则会清掉原有多色日志。

  • 建议:只在用户点“清除高亮”时调用以下代码:

    int nTextLen = m_editLog.GetTextLength();
    m_editLog.SetSel(0, nTextLen);
    CHARFORMAT2 cfReset = {};
    cfReset.cbSize = sizeof(cfReset);
    cfReset.dwMask = CFM_COLOR;
    cfReset.crTextColor = LOG_COLOR_NORMAL;
    m_editLog.SetSelectionCharFormat(cfReset);
    m_editLog.SetSel(-1, 0);
    
  • 日志多色与高亮可共存,互不影响。

5. 必须使用 AfxInitRichEdit2 初始化

  • 问题AfxInitRichEdit2() 必须在窗口创建前调用,不能OnInitDialog 里调用,否则控件显示异常或失效。
  • 解决:在 CWinApp::InitInstance 最前调用。

六、代码调用示例

AppendLogLineRichStyled(_T("准备就绪..."), LOG_COLOR_SUCCESS);
AppendLogLineRichStyled(_T("切换当前命令类型: SendHome"), LOG_COLOR_NORMAL);// 高亮全部出现“SendHome”的日志
HighlightAllMatches(_T("SendHome"));

七、效果图参考

  • 彩色时间戳与内容分色
  • 精准关键词高亮,不影响原有多色日志

在这里插入图片描述


八、总结

通过 CRichEditCtrl 的灵活运用,可以轻松实现 MFC 应用中的彩色日志输出、分级高亮、自动行数裁剪和关键词搜索高亮等常见需求。

  • 本文介绍了高亮显示、彩色分段日志、精准匹配搜索和常见坑点规避等实用技巧,解决了日志显示不美观、关键内容难定位、功能易出错等开发痛点。
  • 实践证明,合理利用 RichEdit 控件的分段样式、查找接口及裁剪机制,能极大提升运维、调试和最终用户体验。

希望本篇总结能为 MFC 日志界面的开发提供可靠的范本和思路。

http://www.dtcms.com/wzjs/804564.html

相关文章:

  • 三门峡市湖滨区建设局网站平面设计主要做什么
  • 做网站和做app哪个更难杭州网站设计工作室
  • 网站免费开发公司代收业主契税如何记账
  • jsp做网站都可以做什么做搜狗手机网站优
  • 嘉兴网站建设搭建免费行情软件app网站大全
  • 招商门户网站建设方案中国建网站报价
  • 湖北网站建设哪家好网站开发科技公司
  • 怎么在自己的网站加关键词wordpress网站做app
  • 网站建设和管理情况企业网站建设费属于办公费吗
  • 江阴网站网站建设网站制作 沈阳
  • 网站免费正能量直接进入app商城网站开发制作
  • 网站建设js网站免费建站
  • 西安装修公司网站制作巨量关键词搜索查询
  • 虚拟主机搭建网站网站建设价格专注制作网站设计
  • 内蒙古做网站的公司广东建设局网站
  • 网站运营是做什么的wordpress后台登陆美化
  • 网站开发软件开发怎么样图案设计网站有哪些
  • 苏州网络营销推广软件运营淄博优化网站排名
  • 做自适应网站对设计稿的要求wordpress远程安装教程视频
  • 中国石油工程建设有限公司网站北京网站设计首选 新鸿儒
  • 江苏手机网站建设公司有限责任公司的优缺点
  • 学做网站理财网站方案建设
  • 建站服务搭建的页面时专门做资产负债表结构分析的网站
  • 工作网站建设平面设计的创意手法有哪些
  • dw制作简单网站模板下载地址如何创建一个网页
  • 有没有兼职做设计的网站吗wordpress文章站
  • 阜宁做网站价格高端网站建设制作
  • h5网站做微信公众号广州哪个网站建设公司好
  • 响应式网站开发教程pdf家具定制
  • 网站运营和维护网页设计需要学什么代码