Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to change underlining color in a Rich Edit control (Win32/C)

I’m looking for a way to make red squiggly underlining in a Rich Edit control (I’m using version 4.1 with Msftedit.dll). I’m able to produce squiggly underlining with this code :

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

The MSDN documentation doesn’t specify how to change the color of underlines, just the text (with underlines) and the text background. I’ve found some code that says to use the lower nibble for the underline type (CFU_UNDERLINEWAVE) and the upper one for color. So I’ve tried :

format.bUnderlineType = CFU_UNDERLINEWAVE | 0x50;

But that doesn't work.

UPDATE

I've tested this code with version 3.0 (Riched20.dll) and it's working. So the problem lies in 4.1. Was the feature removed or moved elsewhere ?

It's not working in version 6 (the dll used by office 2007) also.

like image 995
anno Avatar asked Nov 18 '09 14:11

anno


2 Answers

Expanding on DaveCamp's answer, the CHARFORMAT2W structure contained a bReserved1 entry:

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

But if you look at the latest (8.0) SDK, the bReserved1 entry has now been given to underline color:

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

This is defined as a Widows 8 feature (_RICHEDIT_VER >= 0x0800).

The way to set the underline color is as Dave's answer:

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);

The remaining trick is the color BYTE values. They're not yet documented, but there are 16 colors:

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

Edit: Changed the name of the color from Cyan to Aqua. Fixed spelling of Fuchsia.

Note: Any code released into public domain. No attribution required.

like image 187
Ian Boyd Avatar answered Nov 14 '22 22:11

Ian Boyd


I know this is digging up an old thread, but I've just searched the 'net for several hours looking for an answer to this only to find similar answers everywhere!

This is in fact documented by Microsoft ( http://msdn.microsoft.com/en-gb/library/windows/desktop/bb787883(v=vs.85).aspx ) and as is very easy to do, ONCE you know how! I've just managed to get it working on Windows7 and Windows8 that use the RichEdit50W control from the msftedit.dll.

One thing to note is that the colour indexes are different in Win8. For RED I have to use color 0x06 as opposed to 0x05.

Ok here's what you need to do:

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);
like image 28
Dave Camp Avatar answered Nov 14 '22 20:11

Dave Camp