Bonjour,
Voici mon problème :
Je dois écrire (entre autres) un texte dans la méthode OnPaint(PaintEventArgs e)
Jusque là, pas de problème avec e.Graphics.DrawString que j'utilise souvent.
Ensuite, je dois sélectionner une partie du texte, et donc entourer cette partie d'un rectangle bleu. Ici non plus, pas de problème, j'utilise les régions, comme ceci dans cet extrait que j'ai simplifié pour mes tests :
Là où ça se gâte, c'est lorsque je dois réécrire la partie masquée de la chaîne avec une couleur contrastante avec ce rectangle, et là, mission impossible avec :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 gfx.DrawString(text, Font, brushFore, posX, posY); var charRanges = new CharacterRange[] // créer un tableau de Zones de texte { new CharacterRange(selectionStart, 1) }; // une seule zone, la zone sélectionnée sf.SetMeasurableCharacterRanges(charRanges); // lie le stringFormat aux zones de texte var regions = gfx.MeasureCharacterRanges(text, Font, ClientRectangle, sf); // obtient toutes les régions des zones textes (1 seule ici) gfx.FillRegion(brushbackselect, regions[0]); // colorie le fond du texte sélectionné var rec = regions[0].GetBounds(gfx); // récupère le rectangle de la région
Parce qu'avec un seul caractère sélectionné (ici, selectionLenght est forcé partout à 1) ce caractère s'affiche bien, mais par à l'exacte position correcte, il est décalé d'un ou deux pixels (souvent vers le bas et la droite) en fonction de la fonte utilisée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part gfx.DrawString(text.Substring(selectionStart, 1), Font, brushforeselect, rec, sf);
De plus, si je sélectionne 2 caractères ou plus, alors 1 seul s'affiche car il manque quelques pixels pour afficher le second, bien que le rectangle bleu recouvre correctement les 2 caractères à remplacer. Je suis contraint d'élargir le rectangle d'une taille dépendant de la largeur de la fonte, et donc non reproductible, et évidemment mes caractères réaffichés souffrent du même problème de non alignement.
J'ai évidemment cherché dans la MSDN, mais justement ils fournissent des exemples qui opèrent avec la première partie du code que j'affiche, mais en utilisant une couleur semi-transparence, ce qui leur évite de devoir réécrire la portion de texte masquée, et donc de dévoiler ce problème. Comme quoi ils ont forcément remarqué le dit problème.
Bref, quelqu'un a-t-il un moyen pour réécrire une portion de chaine sur un texte avec une autre couleur en superposant exactement cette portion à son emplacement d'origine?
Ou, autre solution, comment écrire un texte de 2 couleurs différentes?
J'ai bien pensé à transformer le rectangle concerné en bitmap et changer la couleur de chaque pixel trouvé, mais ça me semble excessivement lourd.
Merci d'avance,
Claude
Partager