7

我正在寻找一种在富编辑控件中制作红色波浪下划线的方法(我正在使用带有 Msftedit.dll 的 4.1 版)。我可以用这段代码产生波浪状的下划线:

CHARFORMAT2 format;
format.cbSize = sizeof(format);
format.dwMask = CFM_UNDERLINETYPE;
format.bUnderlineType = CFU_UNDERLINEWAVE;
SendMessage(hWndEdit,EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&format);

MSDN 文档没有指定如何更改下划线的颜色,只指定了文本(带下划线)和文本背景。我发现一些代码说使用下半字节作为下划线类型(CFU_UNDERLINEWAVE),使用高半字节作为颜色。所以我试过:

format.bUnderlineType = CFU_UNDERLINEWAVE | 0x50;

但这不起作用。

更新

我已经用版本 3.0 (Riched20.dll) 测试了这段代码,它正在工作。所以问题出在4.1。该功能是否被删除或移至其他地方?

它在版本 6(office 2007 使用的 dll)中也不起作用。

4

3 回答 3

4

扩展 DaveCamp 的答案,该CHARFORMAT2W结构包含一个bReserved1条目:

typedef struct _charformat2w
{
    UINT        cbSize;
    DWORD       dwMask;
    DWORD       dwEffects;
    ...
    BYTE        bReserved1;
} CHARFORMAT2W;

但是,如果您查看最新的 (8.0) SDK,该bReserved1条目现在已被赋予下划线颜色

typedef struct _charformat2w
{
    UINT        cbSize;
    DWORD       dwMask;
    DWORD       dwEffects;
    ...
#if (_RICHEDIT_VER >= 0x0800)
    BYTE        bUnderlineColor;    // Underline color
#endif
} CHARFORMAT2W;

这被定义为 Widows 8 功能 ( _RICHEDIT_VER >= 0x0800)。

设置下划线颜色的方法是戴夫的回答:

CHARFORMAT2 format;
format.cbSize = sizeof(format);

format.dwMask = CFM_UNDERLINETYPE | CFM_UNDERLINE;
format.dwEffects = CFE_UNDERLINE;
format.bUnderlineType = CFU_UNDERLINEWAVE;
format.bUnderlineColor = 0x05;

SendMessage(hWndEdit,EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &format);

剩下的技巧是颜色BYTE值。它们尚未记录在案,但有 16 种颜色:

UnderlineColor_Black =      0x00;
UnderlineColor_Blue =       0x01;
UnderlineColor_Aqua =       0x02;
UnderlineColor_Lime =       0x03;
UnderlineColor_Fuchsia =    0x04;
UnderlineColor_Red =        0x05;
UnderlineColor_Yellow =     0x06;
UnderlineColor_White =      0x07;
UnderlineColor_Navy =       0x08;
UnderlineColor_Teal =       0x09;
UnderlineColor_Green =      0x0A;
UnderlineColor_Purple =     0x0B;
UnderlineColor_Maroon =     0x0C;
UnderlineColor_Olive =      0x0D;
UnderlineColor_DkGray =     0x0E;
UnderlineColor_LtGray =     0x0F;

在此处输入图像描述

编辑:将颜色名称从 更改CyanAqua。固定拼写Fuchsia

注意:任何发布到公共领域的代码。无需归属。

于 2014-03-22T21:16:29.283 回答
3

我知道这是在挖掘一个旧线程,但我刚刚在网上搜索了几个小时来寻找答案,却发现到处都是类似的答案!

这实际上是由 Microsoft ( http://msdn.microsoft.com/en-gb/library/windows/desktop/bb787883(v=vs.85).aspx ) 记录的,而且很容易做到,一旦你知道如何!我刚刚设法让它在使用来自 msftedit.dll 的 RichEdit50W 控件的 Windows7 和 Windows8 上运行。

需要注意的一点是,Win8 中的颜色索引是不同的。对于 RED,我必须使用颜色 0x06 而不是 0x05。

好的,这是您需要做的:

CHARFORMAT2 format;
format.cbSize = sizeof(format);

format.dwMask = CFM_UNDERLINETYPE | CFM_UNDERLINE;
format.dwEffects = CFE_UNDERLINE;
format.bUnderlineType = CFU_UNDERLINEWAVE;
format.bUnderlineColor = 0x05;

SendMessage(hWndEdit,EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM) &format);
于 2012-12-17T19:41:13.327 回答
2

很抱歉这么说,但如果 Microsoft 没有记录更改下划线的颜色,则不应使用它。像这样的无证特征可能会在以后的版本中被删除,这可能在这里发生。

最好的办法是询问微软。

于 2009-11-28T12:14:06.993 回答