【问题标题】:How to change selection color in RichEdit control?如何更改 RichEdit 控件中的选择颜色?
【发布时间】:2011-08-19 05:48:57
【问题描述】:

基本上,我想在彩色文本上方的位置更改标准 RichEdit 选择颜色。

我正在 RichEdit 控件中实现“突出显示”功能(如黄色标记)。 现在,当我在所选文本上应用高亮显示时,视觉上没有任何变化,因为选择保持在原位并且它覆盖了字符颜色。这很糟糕,因为用户应该得到一些视觉反馈,表明已应用了突出显示。

现在我已经妥协了——在执行“高亮”命令后,我只是完全清除了选择。但是,当它在彩色文本上方时,选择颜色不同是理想的。

我该怎么做?提前致谢!

【问题讨论】:

  • 恐怕代码在这里帮不上忙,我想知道这是否可以做到,以及如何做到。
  • 循环类似于问题 Change highlight color of selected text in RichEdit stackoverflow.com/questions/1139234/…

标签: c++ winapi text richedit


【解决方案1】:

文本选择的颜色设置为hardwired to the system selection color in RichEdit 2.0 and higherIn RichEdit 1.0, the selection color is generated by inversing the background color,所以你有点控制权,但是如果你降级到 1.0,你会失去很多功能。

解决方法是在 GetSysColor API 上安装进程范围的 Detour hook

WPF4 版本的 RichTextBox 中有一个 SelectionBrush 属性,可以用来改变选择的外观。不确定您的项目要求是否允许您在对话框上托管 WPF 控件。

【讨论】:

    【解决方案2】:

    我认为这不能自动完成,因为 Windows 的富编辑控件不提供此类功能。你有两个选择:

    • 忽略问题。你想要的东西是不可能的,所以不要奢望它。
    • 制作您自己的富编辑控件(只是个玩笑,但可以做到)。或者使用其他的。也许scintilla控件有这个功能?

    【讨论】:

    • 不久前创建了我自己的彩色编码富文本编辑框,我可以保证它是可行的......但可能并不值得付出努力。现在,如果您使用 C#... :)
    • 是否可以通过发送 EM_HIDESELECTION 并使用字符格式手动模拟选择来做到这一点?
    • AFAIK EM_HIDESELECTION 将仅在控件失焦时隐藏选择。这意味着如果你想走这条路,你必须破解一些东西。最终结果可能会与现有用户的丰富编辑控件体验发生冲突。
    【解决方案3】:

    一个快速测试应用程序,我能够修改这些颜色,但是需要仔细考虑才能使其按预期工作。

    首先,您可能必须更改对话框资源以将控件标识为较旧的 RICHEDIT。在 Visual Studio 2010 中,在我的对话框中生成的 .rc 文件将控件标识为"RichEditCtrl20A,当控件被标识为这样时,我无法对选择颜色进行任何重大更改。将控件类型更改为"RICHEDIT" 允许我对选择颜色进行更改,而不会感觉到功能损失。您必须在文本编辑器中修改 .rc 文件,找到您的 RichEdit 控件实例并进行修改。

    完成后,您可以使用CRichEditCtrl::SetSelectionCharFormat 函数修改选择颜色(实际上,选择属性要多得多)。

    我所做的简单测试是创建一个新的基于对话框的 MFC 应用程序,向其添加富编辑控件,如上所述修改 RC 文件,并添加以下 OnOK() 处理程序:

    void CTestMFCDlg::OnBnClickedOk()
    {
       m_rec.SetWindowText("This is a test of stuff");
    
       m_rec.SetFocus();
    
       CHARRANGE cr;
       cr.cpMin = 0;
       cr.cpMax = 16;
    
       m_rec.SetSel(cr);
    
       CHARFORMAT2A cf;
       m_rec.GetSelectionCharFormat(cf);
    
       cf.dwEffects = 0;
       cf.dwMask = CFM_BACKCOLOR | CFM_COLOR | CFM_FACE;
       cf.crBackColor = 0;
       cf.crTextColor = RGB(15, 15, 255);
       strcpy(cf.szFaceName, "Times New Roman");
    
       m_rec.SetSelectionCharFormat(cf);
    }
    

    一旦这个处理程序就位,在对话框中按 OK 将填充富编辑控件,选择前 17 个字符并更改选择突出显示颜色。

    你可以找到关于这个函数on MSDN:的文档

    【讨论】:

      【解决方案4】:

      现在我已经妥协了——在执行“highlight”命令后,我只是清除 全选

      我只是想补充一点,当您突出显示某种颜色/颜色时,即使是 Microsoft Word 也会取消选择文本。从玩起来,这感觉是最直观的,因为通常你不想做任何其他事情,你会立即取消选择文本。

      【讨论】:

        【解决方案5】:

        虽然我无法正确理解您的问题,但我猜您想更改所选文本的颜色。以下链接位于 MFC 中,因此您需要将其更改为 Windows SDK 代码,但它会帮助您入门。

        http://social.msdn.microsoft.com/Forums/en-US/vcmfcatl/thread/860b0295-9144-4af6-9ffc-42c2b39a3f50/

        http://www.go4expert.com/forums/showthread.php?t=320

        如果我的回答对你有帮助,请告诉我。

        编辑

        Color change in Rich Edit Control

        【讨论】:

        • 不,这不是我真正想要的。很抱歉不清楚。我想在彩色文本上方的地方更改标准选择突出显示颜色。
        • Alex,您是说您想将蓝色(选择文本时的颜色)更改为您选择的颜色。我已经用链接编辑了我的答案,也许您可​​以通过那个。
        猜你喜欢
        • 1970-01-01
        • 2013-07-15
        • 1970-01-01
        • 1970-01-01
        • 2010-10-21
        • 1970-01-01
        • 2018-06-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多