2010-09-21 6 views
6

Używam programu gdiplus do "przesuwania" wiadomości tekstowej. W pewnych okolicznościach widzimy "kolec" pojawiający się u góry lub u dołu grafiki i nie jestem do końca pewien, dlaczego. Możemy to zminimalizować, dostosowując szerokość obrysu i rozmiar czcionki, ale to nie jest dobre rozwiązanie. Mam nadzieję, że ktoś może mi wyjaśnić ten problem.FileModeWinding i DrawPath powodują pojawianie się dziwnych skoków.

Spikey Bug

A przykładowy kod generowania tego 4, jego zarys, a kolec (niezamierzone)

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

Jestem przekonany, że Spike na wierzchu 4 jest ze względu na podobnie ukształtowany region wewnątrz czwórki. Wydaje się, że wskazuje na to dokumentacja na temat sposobu zapełniania. Próbowałem również FillModeAlternate, bez zmian. Nie wiem, jak odzyskać ten problem. Jakieś sugestie? – reuscam

+0

Wątpię, że problem stanowi tryb wypełniania. Czy próbowałeś go uruchomić na komputerze z innym sterownikiem wideo? –

+0

Tak, mam, te same problemy. Powyższa czcionka to Impact. Problem nie występuje w przypadku Arial przy tym samym rozmiarze czcionki, szerokości obrysu. – reuscam

Odpowiedz

3

zgadzam się, że tryb wypełnienia nie jest problem, myślę, że to jest po prostu szerokość pisaka używanego do rysowania obrysu. Dla postaci, które mają zamknięte przestrzenie ze spiczastymi rogami (jak 4 i "A"), ponieważ szerokość pisaka używana do rysowania konturu staje się większa, rozmiar wewnętrznego kształtu (mały trójkąt w przypadku czwórki) również się zwiększa .

Ostatecznie wewnętrzny kształt będzie zbyt duży, aby mógł zostać zawarty w zewnętrznym kształcie, i zacznie się przebijać, powodując artefakt, który widzisz.

Oto ilustracja ustalonej wielkości czcionki (ponownie czcionka Impact), gdy szerokość obrysu staje się większa. Nie ma wypełnienia, po prostu wywołanie Graphics.drawPath():

alt text

Operacja napełniania nie dba o szerokości zarysu i używa oryginalnego kształtu litery.

To częściowo maskuje problem, zakrywając niektóre niechlujne obrysy. Tutaj jest z wypełnienia włączone:

alt text

coś podobnego zdarzy się znak 'a':

alt text alt text

EDIT: wywołanie SetLineJoin, jak wskazano w drugiej odpowiedzi , jest sposobem, aby temu zapobiec.

+0

+1 za dokładne wyjaśnienie przyczyny. To tak, jakby za pomocą dużego długopisu narysować coś. Czasami pióro może być większe niż to, które rysujesz. –

Powiązane problemy