2010-09-21 4 views
6

J'utilise gdiplus pour "masquer" un textout. Dans certaines circonstances, nous voyons un "pic" apparaissant en haut ou en bas du graphique, et je ne suis pas sûr de savoir pourquoi. Nous pouvons minimiser cela en ajustant la largeur de la course et la taille de la police, mais ce n'est pas une bonne solution. J'espère que quelqu'un peut m'expliquer le problème.FileModeWinding et DrawPath provoquent l'apparition de pics impairs

Spikey Bug

Et l'exemple de code générant ce 4, son contour, et la pointe (involontaire)

GraphicsPath path(FillModeWinding); 

     path.AddString(text,wcslen(text),&fontFamily,StateInfo.TheFont.TheWeight,(REAL)minSize,PointF((REAL)ptStart.x, (REAL)ptStart.y),&sf); 
     // Draw the outline first 
     if (StateInfo.StrokeWidth > 0) { 
     Gdiplus::Color strokecolor(GetRValue(StateInfo.StrokeColor), GetGValue(StateInfo.StrokeColor), GetBValue(StateInfo.StrokeColor)); 
     Pen pen(strokecolor,(REAL)StateInfo.StrokeWidth);  
     graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias); 
     graphics.SetPixelOffsetMode(Gdiplus::PixelOffsetModeHighQuality); 
     graphics.DrawPath(&pen, &path); 
     } 
     // Draw the text by filling the path   
     graphics.FillPath(&solidBrush, &path); 
+1

Je suis convaincu que le Spike sur le dessus de la 4 est en raison de la région de forme similaire à l'intérieur des quatre. La documentation sur fillmodewinding semble pointer vers ceci. J'ai également essayé FillModeAlternate, sans changement. Je ne suis pas sûr de savoir comment récupérer de ce problème. Aucune suggestion? – reuscam

+0

Je doute que le mode de remplissage soit le problème. Avez-vous essayé de l'exécuter sur une machine avec un pilote vidéo différent? –

+0

Oui, j'ai les mêmes problèmes. La police ci-dessus est Impact. Arial n'a pas de problème avec la même taille de police, la même largeur de trait. – reuscam

Répondre

3

Je suis d'accord que le mode de remplissage n'est pas la question, je pense qu'il est juste la largeur du stylo utilisée pour dessiner le contour. Pour les caractères qui ont des espaces fermés avec des coins pointus (comme 4 et 'A'), comme la largeur du stylo utilisée pour dessiner le contour devient plus grande, la taille de la forme interne (le petit triangle dans le cas des quatre) devient plus grande . Finalement, la forme interne deviendra trop grande pour être contenue par la forme extérieure, et commencera à percer, résultant en l'artefact que vous voyez.

Voici une illustration d'une taille de police fixe (la police Impact à nouveau) lorsque la largeur du contour augmente. Il n'y a pas de remplissage ici, juste un appel à Graphics.drawPath():

alt text

L'opération de remplissage ne se soucie pas de la largeur du contour, et utilise la forme originale de la lettre.

Ceci masque partiellement le problème en couvrant certains des contours désordonnés. Voici le remplissage activé:

alt text

Quelque chose de semblable se passera avec le caractère 'A':

alt text alt text

EDIT: appeler SetLineJoin, comme il est indiqué dans l'autre réponse , est le moyen d'arrêter cela.

+0

+1 pour expliquer clairement quelle est la cause. C'est comme utiliser un énorme stylo pour dessiner quelque chose. Parfois, le stylo peut être plus gros que ce que vous dessinez. –

Questions connexes