2009-11-18 9 views
6

Sto cercando un modo per eseguire la sottolineatura ondulata rossa in un controllo Rich Edit (sto usando la versione 4.1 con Msftedit.dll). Sono in grado di produrre ondulata sottolineando con questo codice:Come modificare la sottolineatura del colore in un controllo Rich Edit (Win32/C)

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

La documentazione MSDN non specifica come cambiare il colore delle sottolineature, solo il testo (con sottolineature) e lo sfondo del testo. Ho trovato un codice che dice di usare il nibble inferiore per il tipo di sottolineatura (CFU_UNDERLINEWAVE) e quello superiore per il colore. Quindi ho provato:

format.bUnderlineType = CFU_UNDERLINEWAVE | 0x50; 

Ma questo non funziona.

UPDATE

Ho provato questo codice con la versione 3.0 (Riched20.dll) e sta funzionando. Quindi il problema sta nel 4.1. La funzione è stata rimossa o spostata altrove?

Non funziona anche nella versione 6 (la DLL utilizzata da Office 2007).

+0

La soluzione originale ha funzionato per me (testata su Windows XP, 7, 8, 8.1, 10). L'unico svantaggio è che devi usare un'implementazione piuttosto vecchia di RichEdit (vale a dire 'RICHEDIT20W' o una versione simile), che potrebbe non essere un problema per la maggior parte degli utenti. –

risposta

3

Mi dispiace dirlo, ma se la modifica del colore della sottolineatura non è documentata da Microsoft, non dovresti usarla. Le presentazioni non documentate come questa sono soggette a essere rimosse nelle versioni successive, cosa che potrebbe essere accaduta qui.

La soluzione migliore è chiedere a Microsoft.

3

So che questo sta scavando un vecchio thread, ma ho cercato la rete per molte ore cercando una risposta a questo solo per trovare risposte simili ovunque!

Questo è infatti documentato da Microsoft (http://msdn.microsoft.com/en-gb/library/windows/desktop/bb787883(v=vs.85).aspx) e come è molto facile da fare, UNA VOLTA che sai come! Sono appena riuscito a farlo funzionare su Windows7 e Windows8 che utilizzano il controllo RichEdit50W da msftedit.dll.

Una cosa da notare è che gli indici di colore sono diversi in Win8. Per RED devo usare il colore 0x06 invece di 0x05.

Ok ecco cosa devi fare:

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

Questa soluzione è adatta per una versione abbastanza nuova della libreria RichEdit. Comunque non funzionerà con i precedenti (2, 3 o (forse) 4. Anche il commento dato da "Honza R" non funziona - l'ho appena provato con MSVC 2010 e Win 8.1. – Igor

3

Ampliando la risposta di DaveCamp, la struttura CHARFORMAT2W conteneva un bReserved1 ingresso:

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

Ma se si guarda al più tardi (8.0) SDK , la voce bReserved1 è stata assegnata a colore sottolineato:

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

Questo è definito come una funzione di vedove 8 (_RICHEDIT_VER >= 0x0800).

Il modo di impostare il colore della sottolineatura è come la risposta di 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); 

Il trucco rimanente è il colore BYTE valori.Non sono ancora documentate, ma ci sono 16 colori:

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: Cambiato il nome del colore Cyan-Aqua. Corretto l'ortografia di Fuchsia.

Nota: Qualsiasi codice rilasciata nel pubblico dominio. Nessuna attribuzione richiesta.

Problemi correlati