Как изменить цвет подчеркивания в элементе управления Rich Edit (Win32 / C) - PullRequest
6 голосов
/ 18 ноября 2009

Я ищу способ сделать красное волнистое подчеркивание в элементе управления Rich Edit (я использую версию 4.1 с Msftedit.dll). Я могу создать волнистое подчеркивание с помощью этого кода:

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;

Но это не работает.

UPDATE

Я протестировал этот код с версией 3.0 (Riched20.dll), и он работает. Так что проблема заключается в 4.1. Была ли функция удалена или перемещена в другое место?

Также не работает в версии 6 (dll, используемая в Office 2007).

Ответы [ 3 ]

3 голосов
/ 17 декабря 2012

Я знаю, что это копает старую ветку, но я просто искал в сети несколько часов, чтобы найти ответ на этот вопрос, чтобы найти похожие ответы везде!

Это на самом деле задокументировано Microsoft (http://msdn.microsoft.com/en-gb/library/windows/desktop/bb787883(v=vs.85).aspx) и, как очень легко сделать, РАЗ, когда вы знаете, как! Мне только удалось заставить это работать на Windows7 и Windows8, которые используют элемент управления RichEdit50W от msftedit.dll.

Стоит отметить, что цветовые индексы в 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);
3 голосов
/ 23 марта 2014

Расширяя ответ 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;

enter image description here

Редактировать : изменено название цвета с Cyan на Aqua. Исправлено написание Fuchsia.

Примечание : любой код, опубликованный в открытом доступе. Указание авторства не требуется.

3 голосов
/ 28 ноября 2009

Мне очень жаль говорить об этом, но если изменение цвета подчеркивания не задокументировано Microsoft, вам не следует его использовать. Недокументированные материалы, подобные этой, могут быть удалены в более поздних версиях, что могло бы произойти здесь.

Лучше всего спросить у Microsoft.

...