如何在Rich Edit控件(Win32 / C)中更改下划线颜色

时间:2009-11-18 14:11:16

标签: c winapi spell-checking richedit

我正在寻找一种在Rich Edit控件中使用red squiggly下划线的方法(我使用的是带有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)中也不起作用。

3 个答案:

答案 0 :(得分:3)

我很遗憾地说这个,但是如果Microsoft没有记录更改下划线的颜色,则不应该使用它。像这样的未记录的特征可能会在以后的版本中删除,这可能发生在这里。

你最好的办法是问微软。

答案 1 :(得分:3)

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

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

需要注意的一点是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);

答案 2 :(得分:3)

扩展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;

这被定义为寡妇8特征(_RICHEDIT_VER >= 0x0800)。

设置下划线颜色的方法是Dave的答案:

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;

enter image description here

修改:将颜色名称从Cyan更改为Aqua。修正了Fuchsia的拼写。

  

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