Richedit更改选择的颜色

Posted

技术标签:

【中文标题】Richedit更改选择的颜色【英文标题】:Richedit change color of selection 【发布时间】:2013-10-15 10:27:21 【问题描述】:

我想向 RichEdit 控件添加彩色文本行。但我面临的问题是颜色变化不仅限于我选择的文本。我所做的是:获取当前光标位置-> 插入文本-> 获取光标位置-> 选择范围-> 为其着色-> 取消选择 出于某种原因,它似乎也更改了默认颜色。我尝试保存旧的CHARFORMAT 并在我为线着色后恢复它(SCF_DEFAULTSCF_SELECTION 带有最后一个字符),但这不起作用。我错过了什么吗?

我有一个 RichEdit 2.0 和以下功能:

hEdit_Console = CreateWindow(RICHEDIT_CLASS, "", 
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOVSCROLL | ES_MULTILINE | ES_READONLY | WS_VSCROLL, 
10, 100, 260, 120, hWnd, NULL, ((LPCREATESTRUCT) lParam)->hInstance, NULL);
SendMessage(hEdit_Console, WM_SETFONT, (LPARAM)GetStockObject(DEFAULT_GUI_FONT), TRUE);

void AddInfo2(HWND con, char* text)

  CHARFORMAT cf;
  int start, stop;

  memset( &cf, 0, sizeof cf );
  cf.cbSize = sizeof cf;
  cf.dwMask = CFM_COLOR;
  cf.crTextColor = RGB(51, 204, 51);

  SendMessage(con, EM_SETSEL, -1, -1);
  start = SendMessage(con, WM_GETTEXTLENGTH, 0, 0);
  SendMessage(con, EM_REPLACESEL, FALSE, (LPARAM)text);
  stop = SendMessage(con, WM_GETTEXTLENGTH, 0, 0);
  SendMessage(con, EM_SETSEL, start, stop);
  SendMessage(con, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf);
  SendMessage(con, EM_SETSEL, -1, -1);

【问题讨论】:

【参考方案1】:

据我所知,documentation dwEffects 必须设置为 CFE_AUTOCOLOR 或其他有效值。

【讨论】:

crTextColor 上的文档(同一页):文本颜色。如果指定了 CFE_AUTOCOLOR 字符效果,则忽略此成员。要生成 COLORREF,请使用 RGB 宏。 - 由于 dwEffects 为 0,文本不会应用其他样式。 还是谢谢你。您为我指明了解决方案/解决方法的正确方向。【参考方案2】:

我找到了一个解决方法,至少对我有用。当我第一次尝试保存/备份和恢复旧的CHARFORMAT 时,我没有为CHARFORMAT cf_old 指定CFM_COLOR。现在我使用:

SendMessage(con, EM_GETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf_old);
cf_old.dwMask = CFM_COLOR;
SendMessage(con, EM_SETSEL, -1, -1);
SendMessage(con, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf);
SendMessage(con, EM_REPLACESEL, FALSE, (LPARAM)text);
SendMessage(con, EM_SETSEL, -1, -1);
SendMessage(con, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &cf_old);

它以某种方式解释了为什么我的第一次尝试没有奏效。似乎每次您向 RichEdit 添加内容时,第一个字符的 CHARFORMAT before 都会使用插入符号。

【讨论】:

在我看来,你没有改变任何东西,只是你现在有一个很好的初始化结构。

以上是关于Richedit更改选择的颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何在MFC中使用richedit控件_RICHEDIT_VER over 2.1

RichEdit控件中的字符间距

语法高亮 Richedit 控件无法正常工作

将光标定位在 RichEdit 控件中文本的末尾

在没有焦点的情况下滚动RichEdit

RichEdit 各个版本介绍