首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

【GDI+】关于GraphicsPath 追加字符串的有关问题

2013-06-25 
【GDI+求助】关于GraphicsPath 追加字符串的问题RT,我想在GraphicsPath追加一串字符串,但是包含GraphicsPath

【GDI+求助】关于GraphicsPath 追加字符串的问题
RT,我想在GraphicsPath追加一串字符串,但是包含GraphicsPath的矩形范围的宽度是固定的,如何能让追加的字符串在快要超出限制的宽度的时候自动换行呢???GDI+中的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);
                }



用Path是为了实现有描边的效果的.


[解决办法]
做不到,你自己控制画几行
[解决办法]
需要自己计算后再换行。如果仅是为了显示的话,还有一个办法变通,那就是借用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);

热点排行