2010-11-17 4 views
12

Ich habe den folgenden Code. Gibt es eine einfache Möglichkeit, den Text, den ich schreibe, zu umreißen?Gliederungstext mit System.Drawing?

var imageEncoder = Encoder.Quality; 
var imageEncoderParameters = new EncoderParameters(1); 
imageEncoderParameters.Param[0] = new EncoderParameter(imageEncoder, 100L); 

var productImage = GetImageFromByteArray(myViewModel.ProductImage.DatabaseFile.FileContents); 
var graphics = Graphics.FromImage(productImage); 

var font = new Font("Segoe Script", 24); 
var brush = Brushes.Orange; 

var container = new Rectangle(myViewModel.ContainerX, myViewModel.ContainerY,          myViewModel.ContainerWidth,            myViewModel.ContainerHeight); 

var stringFormat = new StringFormat {Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center}; 

graphics.DrawString(customizationText, font, brush, container, stringFormat); 

Antwort

23

Ja. Statt DrawString, verwenden Sie die folgende Reihenfolge der Anrufe:

Wenn Sie GraphicsPath.AddString neben Graphics.DrawString verwenden müssen, die Sie benötigen, um die Schriftgrößen zu konvertieren becau se Graphics.DrawString erwartet "Punktgröße", während GraphicsPath.AddString "em size" erwartet. Die Umrechnungsformel lautet einfach emSize = g.DpiY * pointSize/72.

Hier ist ein Codebeispiel:

// assuming g is the Graphics object on which you want to draw the text 
GraphicsPath p = new GraphicsPath(); 
p.AddString(
    "My Text String",    // text to draw 
    FontFamily.GenericSansSerif, // or any other font family 
    (int) FontStyle.Regular,  // font style (bold, italic, etc.) 
    g.DpiY * fontSize/72,  // em size 
    new Point(0, 0),    // location where to draw text 
    new StringFormat());   // set options here (e.g. center alignment) 
g.DrawPath(Pens.Black, p); 
// + g.FillPath if you want it filled as well 
+0

Vielen Dank für die Antwort so viel, aber ich kann nicht scheinen, diese Arbeit zu bekommen. Ich bin mir nicht sicher, welche Überladung (en) für diese Methoden zu verwenden sind. Würde die einzige Zeile, die ich aus meinem aktuellen Programm nehme, die graphics.DrawString() Zeile sein? –

+0

[Ja.] (Http://meta.stackexchange.com/questions/700/) – Timwi

+0

Danke für diese Info, ich habe genau das getan, was Sie gesagt haben ... Aber natürlich habe ich festgestellt, dass es kein Anti-Aliasing gibt Text sieht ziemlich schrecklich aus. :(Ich bin mir nicht sicher, was ich noch machen soll. –