GDI+ Text



  • Tach auch. Ich hänge jetzt hier schon ewig dran und hoffe hier kennt sich wer eventuell mit meinem Problem aus.

    Habe eine Delphi Komponente für CBuilder die mit GDI+ arbeitet.
    Ich kann dort Smooth als Eigenschaft aktivieren, was dann grosse Auswirkungen auf die Darstellung hat.

    if FSmooth then
        begin
          Graphics.SetSmoothingMode(SmoothingModeAntiAlias);
          Graphics.SetPixelOffsetMode(PixelOffsetModeHighQuality);
        end
        else
        begin
          Graphics.SetPixelOffsetMode(PixelOffsetModeNone);
        end;
    

    Ohne Smooth: http://img120.imageshack.us/img120/5493/drawtexttl7.png

    Mit Smooth: http://img396.imageshack.us/img396/438/drawtext2eh6.png

    Man sieht das mit Smooth der Rahmen dicker wird. Bei Ellipsen sieht man durch diesen Effekt keine Pixelkanten mehr. Das grosse Problem das ich nun habe ist das ohne Smooth die Schrift garnicht/kaum lesbar ist und mit Smooth endlich lesbar wird, aber auch so hässlich fett. Ich möchte eigentlich immer egal welcher Mode düne gut lesbare Schrift.

    Nun habe ich unter obigen Codeschnippsel

    Graphics.SetTextRenderingHint(TextRenderingHintSystemDefault);
    

    gesetzt, aber auch

    Graphics.SetTextRenderingHint(TextRenderingHintAntiAlias);
    

    Dies hatte leider und seltsamerweise beides keinerlei Auswirkungen auf die Schrift. Nur Graphics.SetSmoothingMode(SmoothingModeAntiAlias); bewirkt bei Schrift änderungen.

    Hat eventuell irgendjemand einen Vorschlag warum die Schrift ohne Smooth unlesbar ist und wo mein Fehler liegt? Wäre echt bezaubert wenn da einer weiterhilft. 😞

    function TGPGraphics.SetSmoothingMode(smoothingMode: TSmoothingMode): TStatus;
      begin
        result := SetStatus(GdipSetSmoothingMode(nativeGraphics, smoothingMode));
      end;
    
      function TGPGraphics.SetPixelOffsetMode(pixelOffsetMode: TPixelOffsetMode): TStatus;
      begin
        result := SetStatus(GdipSetPixelOffsetMode(nativeGraphics, pixelOffsetMode));
      end;
    
      function TGPGraphics.SetTextRenderingHint(newMode: TTextRenderingHint): TStatus;
      begin
        result := SetStatus(GdipSetTextRenderingHint(nativeGraphics, newMode));
      end;
    
      TextRenderingHint = (
        TextRenderingHintSystemDefault,                // Glyph with system default rendering hint
        TextRenderingHintSingleBitPerPixelGridFit,     // Glyph bitmap with hinting
        TextRenderingHintSingleBitPerPixel,            // Glyph bitmap without hinting
        TextRenderingHintAntiAliasGridFit,             // Glyph anti-alias bitmap with hinting
        TextRenderingHintAntiAlias,                    // Glyph anti-alias bitmap without hinting
        TextRenderingHintClearTypeGridFit              // Glyph CT bitmap with hinting
      );
      TTextRenderingHint = TextRenderingHint;
    

    BTW Es handelt sich bei der Komponente um BlockEditor von KSDEV. (Leider kein Support mehr seit einem Jahr erreichbar 🙄)



  • Ach, ich habe den Aufruf ganz vergessen.

    FPath: TGPGraphicsPath;
    FPath.AddString(FText, Length(FText), Family, FS, Size, R, StringFormat);
    

    Hier wird nicht mit GdipDrawString, sondern GdipAddPathString gearbeitet.

    GdipDrawString: http://www.com.it-berater.org/gdiplus/noframes/text_functions.htm
    GdipAddPathString: http://com.it-berater.org/gdiplus/noframes/graphicspath_functions_A.htm

    function TGPGraphicsPath.AddString(
          string_: WideString;
          length : Integer;
          family : TGPFontFamily;
          style  : Integer;
          emSize : Single;  // World units
          layoutRect: TGPRectF;
          format : TGPStringFormat): TStatus;
      var
        gpff : GPFONTFAMILY;
        gpsf : GPSTRINGFORMAT;
      begin
        gpff := nil;
        gpsf := nil;
        if assigned(family) then gpff := family.nativeFamily;
        if assigned(format) then gpsf := format.nativeFormat;
        result := SetStatus(GdipAddPathString( nativePath, PWideChar(string_), length, gpff,
              style, emSize, @layoutRect, gpsf));
      end;
    

    Ich bin immernoch am Suchen das irgendwie hinzubekommen. 🙄


Anmelden zum Antworten