【GDI+求助】关于GraphicsPath 追加字符串的问题
RT,我想在GraphicsPath追加一串字符串,但是包含GraphicsPath的矩形范围的宽度是固定的,如何能让追加的字符串在快要超出限制的宽度的时候自动换行呢???GDI+中的GraphicsPath中有这样的属性或者方法吗?
我截个图给你们看:
你看 现在不会自动换行.
贴代码:
if (textHasFrame)
{
stringFormat = StringFormat.GenericDefault;
Brush brush = new SolidBrush(Color.FromArgb(this.dColor));
SizeF sf = Paint.MeasureText("测", this.fTextSize);
// 设置创建的路径对象
myPath.AddString(this.text,
new FontFamily(/*StaticField.DrawText_FONT_FORMAT*/"宋体"),
(int)this.textStyle,
/*StaticField.DrawText_TextRectHeight*/
sf.Height,
/*new RectangleF((float)this.MinX, (float)this.MinY, (float)this.widthEx, (float)this.heightEx)*/
new PointF((float)this.MinX, (float)this.MinY),
stringFormat);
//Draw the path to the screen.
g.FillPath(brush, myPath);
g.DrawPath(new Pen(this.textFrameColor, this.textFrameWidth), myPath);
}
[解决办法]
做不到,你自己控制画几行
[解决办法]
需要自己计算后再换行。如果仅是为了显示的话,还有一个办法变通,那就是借用RichTextBox进行“假显示”。
[解决办法]
中英文混排时,限定好行宽,把中文作两个英文宽度去计算
public struct DrawingLine
{
private static FontFamily _fontFamily;
public static readonly FontStyle DefaultFontStyle = FontStyle.Bold;
public static readonly Brush DefaultBrush = new SolidBrush(Color.Black);
public string DrawingString;
public Font Font;
public Brush Brush;
public PointF Location;
public DrawingLine(string drawingStr, Font font, Brush brush, PointF location)
{
this.DrawingString = drawingStr;
this.Font = font;
this.Brush = brush;
this.Location = location;
}
/// <summary>
/// 将当前行截断为若干行(汉字按两个字符计算)
/// </summary>
/// <param name="maxCNLength">每行允许的最大的汉字个数,若超过则截成若干行</param>
/// <param name="leftIndent">左缩进</param>
/// <param name="lineHeight">行高</param>
/// <param name="maxReturnLines">截断后返回的行数,若为空,则返回所有行</param>
/// <returns>截断后的行</returns>
public IEnumerable<DrawingLine> TruncateToLines(int maxCNLength, int leftIndent, int lineHeight, int? maxReturnLines)
{
int startIndex = 0, //该行在原字符串中的开始位置
CNCount = 0, //该行当前的汉字数(两个英文作一个汉字计算)
line = 0, //行号
length = this.DrawingString.Length;
DrawingLine prevLine = this;
int maxLength = maxCNLength * 2;
for (int i = 0; i < length; i++)
{
CNCount += (int)this.DrawingString[i] > 127 ? 2 : 1;
if (CNCount > maxLength)
{
if (line == 0)
{
//首行不缩进
prevLine = new DrawingLine(this.DrawingString.Substring(startIndex, i), this.Font, this.Location);
}
else if (!maxReturnLines.HasValue
[解决办法]
line < maxReturnLines.Value)
{
//后续行左缩进70,换行下移一个lineHeight
var drwaingStr = this.DrawingString.Substring(startIndex, i - startIndex);
prevLine = new DrawingLine(drwaingStr, this.Font.Size, prevLine.Location.X + leftIndent, prevLine.Location.Y + lineHeight);
}
else
{
yield break;
}
yield return prevLine;
line++;
CNCount = 0;
startIndex = i;
}
else
{
yield return prevLine;
yield break;
}
}
}
}
/// <summary>
/// 在图片上增加文字水印
/// </summary>
/// <param name="Path">原服务器图片路径</param>
/// <param name="Path_sy">生成的带文字水印的图片路径</param>
/// <param name="FontToWater">要合成的水印文字字典数组对象</param>
public static Image MakeWaterFont(IList<DrawingLine> drawingLines, string originalPath)
{
System.Drawing.Image image = System.Drawing.Image.FromFile(originalPath);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image);
g.DrawImage(image, 0, 0, image.Width, image.Height);
//消除锯齿
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
foreach (var line in drawingLines)
{
g.DrawString(line.DrawingString, line.Font, line.Brush, line.Location);
}
g.Dispose();
return image;
}
/// <summary>
/// 在图片上增加文字水印
/// </summary>
/// <param name="Path">原服务器图片路径</param>
/// <param name="Path_sy">生成的带文字水印的图片路径</param>
/// <param name="FontToWater">要合成的水印文字字典数组对象</param>
public static void MakeWaterFont(IList<DrawingLine> drawingLines, string originalPath, string savePath)
{
using(var img = MakeWaterFont(drawingLines, originalPath))
{
if (savePath.IndexOf(Path.VolumeSeparatorChar.ToString()) == -1) savePath = System.Web.HttpContext.Current.Server.MapPath(savePath);
img.Save(System.Web.HttpContext.Current.Server.MapPath(savePath));
}
}
var line = new DrawingLine(string drawingStr, Font font, Brush brush, PointF location); //第四个参数为起始坐标
var lines = line.DrawingLine(22, 60, 18); //第一个参数为每行的汉字数,左缩进60,行高18
MakeWaterFont(lines, originalPath, savePath);