2009-11-18 3 views
6

Je suis à la recherche d'un moyen de rendre le soulignement rouge squiggly dans un contrôle Rich Edit (j'utilise la version 4.1 avec Msftedit.dll). Je suis en mesure de produire en soulignant squiggly avec ce code:Comment changer la couleur de soulignement dans un contrôle 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 documentation MSDN ne précise pas comment changer la couleur de soulignements, tout le texte (avec soulignements) et l'arrière-plan du texte. J'ai trouvé du code qui dit d'utiliser le quartet inférieur pour le type souligné (CFU_UNDERLINEWAVE) et le supérieur pour la couleur. Donc, j'ai essayé:

format.bUnderlineType = CFU_UNDERLINEWAVE | 0x50; 

Mais cela ne fonctionne pas.

MISE À JOUR

Je l'ai testé ce code avec la version 3.0 (Riched20.dll) et il fonctionne. Donc, le problème réside dans 4.1. La fonctionnalité a-t-elle été supprimée ou déplacée ailleurs?

Il ne fonctionne pas dans la version 6 (la DLL utilisée par le bureau 2007) également.

+0

Votre solution originale a fonctionné pour moi (testé sur Windows XP, 7, 8, 8.1, 10). Le seul inconvénient est que vous devez utiliser une implémentation assez ancienne de richedit (à savoir 'RICHEDIT20W' ou une version similaire), ce qui peut ne pas être un problème pour la plupart des utilisateurs. –

Répondre

3

Je suis désolé de le dire, mais si Microsoft ne modifie pas la couleur du soulignement, vous ne devriez pas l'utiliser. Les documents non documentés comme ceux-ci sont susceptibles d'être supprimés dans les versions ultérieures, ce qui aurait pu se produire ici.

Votre meilleur pari est de demander à Microsoft.

3

Je sais que c'est de creuser un vieux fil, mais je viens de chercher sur le net pendant plusieurs heures à la recherche d'une réponse à cela seulement pour trouver des réponses similaires partout!

Ceci est en fait documenté par Microsoft (http://msdn.microsoft.com/en-gb/library/windows/desktop/bb787883(v=vs.85).aspx) et comme c'est très facile à faire, UNE FOIS vous savez comment! Je viens de réussir à le faire fonctionner sur Windows7 et Windows8 qui utilisent le contrôle RichEdit50W du fichier msftedit.dll. Une chose à noter est que les index de couleur sont différents dans Win8. Pour RED, je dois utiliser la couleur 0x06 par opposition à 0x05.

Ok voici ce que vous devez faire:

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

Cette solution est bonne pour une version assez récente de la bibliothèque RichEdit. Cependant, cela ne fonctionnera pas pour les précédents (2, 3 ou (peut-être) 4. Le commentaire donné par "Honza R" ne fonctionne pas non plus - je l'ai juste essayé avec MSVC 2010 et Win 8.1. – Igor

3

L'expansion sur la réponse de DaveCamp, la structure CHARFORMAT2W contenait une entrée bReserved1:

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

Mais si vous regardez la dernière (8.0) SDK , l'entrée bReserved1 est maintenant attribuée à souligné couleur:

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

Ceci est défini comme une fonctionnalité Widows 8 (_RICHEDIT_VER >= 0x0800).

La façon de définir la couleur de soulignement est que la réponse de 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); 

L'astuce restante est la couleur des valeurs BYTE.Ils ne sont pas encore documentés, mais il y a 16 couleurs:

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

Modifier: a changé le nom de la couleur Cyan-Aqua. Orthographe fixe de Fuchsia.

Remarque: tout code publié dans le domaine public. Aucune attribution requise.

Questions connexes