/// <summary> /// Draws string with given character format and alignment at given <see cref="Point"/>. /// </summary> /// <param name="gr"><see cref="Graphics"/> object to draw into.</param> /// <param name="str"><see cref="string"/> to be drawn.</param> /// <param name="pnt"><see cref="Point"/> where the string will be drawn.</param> /// <param name="fmt"><see cref="CharacterFormat"/> used to draw the <see cref="string"/>. </param> /// <param name="align">Specifies whether the <paramref name="pnt"/> is at left, right /// or in the center of the string. (<see cref="ParagraphAlignment.Full"/> means the same /// as <see cref="ParagraphAlignment.Left"/>.)</param> public void DrawString(Graphics gr, string str, PointF pnt, CharacterFormat fmt, ParagraphAlignment align) { StringFormat sf = (StringFormat) StringFormat.GenericDefault.Clone(); sf.Alignment = ParAl2StrAl(align); sf.HotkeyPrefix = fmt.HotkeyPrefix; Matrix trOld = null; if (fmt.Angle != 0) { trOld = gr.Transform.Clone(); gr.TranslateTransform(pnt.X, pnt.Y); gr.RotateTransform(fmt.Angle); gr.TranslateTransform(-pnt.X, -pnt.Y); } if (fmt.Formatted) { CharacterFormat cf = fmt.ShallowCopy(); cf.Angle = 0; SDUFormattedString fs = new SDUFormattedString(str, cf); SizeF sz = fs.Measure(gr, true); sz.Height += GetMeasureStringVerticalGap(gr, cf.Font); PointF ofs = pnt; switch (align) { case ParagraphAlignment.Right: ofs.X -= sz.Width; break; case ParagraphAlignment.Center: ofs.X -= sz.Width/2; break; } ParagraphFormat pf = new ParagraphFormat(); pf.MultiLine = false; pf.Alignment = align; fs.DrawStringInRectangle(gr, new RectangleF(ofs, sz), pf); } else if (fmt.FilledBounds) { ParagraphFormat pf = new ParagraphFormat(); //pf.Alignment=align; SizeF sz = MeasureStringExactly(gr, str, fmt, pf, false); sz.Width += GetMeasureStringHorizontalGap(gr, fmt.Font); pnt.X += GetMeasureStringHorizontalGap(gr, fmt.Font)/2; pnt.Y += GetMeasureStringVerticalGap(gr, fmt.Font); gr.FillRectangle(fmt.Brush, new RectangleF(pnt, sz)); } else gr.DrawString(str, fmt.Font, fmt.Brush, pnt, sf); if (trOld != null) gr.Transform = trOld; }