DrawString如何对字符的行高和字符间距进行控制?我是指在Paint事件中,DrawString时跨行的情况下,控制行高和字符间距等的做法
System.Drawing.Graphics g = e.Graphics;
g.DrawString("测试字符测试字符测试字符测试字符测试字符测试字符测试字符测试字符", mFont, mBrush, mRect);多谢

解决方案 »

  1.   

    http://hi.baidu.com/helmsman88/blog/item/0b8ffbcdf8a70f1801e928be.html
      

  2.   

    按照微软构造函数 
    Graphics.DrawString ( System.String s , System.Drawing.Font font , System.Drawing.Brush brush , System.Drawing.RectangleF layoutRectangle , System.Drawing.StringFormat format ) 
    中的System.Drawing.StringFormat format是可以设置行距的,Font font1=new font(...); 
    如果这个里边都没有就用GDI+的高级功能 
    DrawText 据我所知,好像没有关于行距的属性。一种方法是通过Font的Height等属性,以及行高的要求,改变文字输出的坐标Y值。即System.Drawing.RectangleF layoutRectangle。 
    Graphics.MeasureCharacterRanges测试字符范围,StringFormat.SetMeasurableCharacterRanges等方法会有帮助。
      

  3.   

    http://zzk.cnblogs.com/s?w=DrawString++&t=
      

  4.   

    通过GdipMeasureDriverString我之前改造的GdiPlusMethods
    using System;
    using System.Collections.Generic;
    using System.Text;namespace XXXXXXX
    {
        public class GdiPlusMethods
        {
            #region Declare        [System.Runtime.InteropServices.DllImport("Gdiplus.dll", CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
            internal extern static int GdipMeasureDriverString(IntPtr g, string pText, int pLength, IntPtr pFont, System.Drawing.PointF[] pPositions, int pFlags, IntPtr pMatrix, ref System.Drawing.RectangleF pBounds);        [System.Runtime.InteropServices.DllImport("Gdiplus.dll", CharSet = System.Runtime.InteropServices.CharSet.Unicode)]
            internal extern static int GdipDrawDriverString(IntPtr g, string pText, int pLength, IntPtr pFont, IntPtr pBrush, System.Drawing.PointF[] pPositions, int pFlags, IntPtr pMatrix);        #endregion Declare        #region GdiPlusMethods        private GdiPlusMethods() 
            {
            }
            #endregion GdiPlusMethods        #region DriverStringOptions        private enum DriverStringOptions
            {
                CmapLookup = 1,
                Vertical = 2,
                Advance = 4,
                LimitSubpixel = 8,
            }
            #endregion DriverStringOptions        #region DrawDriverString        public static void DrawDriverString(System.Drawing.Graphics g, string pText, System.Drawing.Font pFont, System.Drawing.Brush pBrush, System.Drawing.PointF[] pPositions)
            {
                try
                {
                    DrawDriverString(g, pText, pFont, pBrush, pPositions, null);            }
                catch (NullReferenceException NullEx)
                {
                    throw NullEx;
                }
                catch (Exception Ex)
                {
                    throw Ex;
                }
            }
            #endregion DrawDriverString        #region DrawDriverString        public static void DrawDriverString(System.Drawing.Graphics g, string pText, System.Drawing.Font pFont, System.Drawing.Brush pBrush, System.Drawing.Rectangle pRect, int pHeight)
            {
                try
                {
                    System.Drawing.PointF[] mPositions = new System.Drawing.PointF[pText.Length];
                    System.Drawing.Size mSize = g.MeasureString(pText, pFont).ToSize();                //int mTextHeight = mSize.Height;
                    int mRow = 1;
                    int mPosX = 0;                for (int i = 0; i < pText.Length; i++)
                    {
                        mSize = g.MeasureString(pText.Substring(i, 1), pFont).ToSize();                    if ((mPosX + mSize.Width) > pRect.Width)
                        {
                            mPosX = 0;
                            mRow = mRow + 1;
                        }                    mPositions[i] = new System.Drawing.PointF(pRect.Left + mPosX, pRect.Top + mRow * pHeight);                    mPosX = mPosX + mSize.Width;                }                DrawDriverString(g, pText, pFont, pBrush, mPositions, null);            }
                catch (NullReferenceException NullEx)
                {
                    throw NullEx;
                }
                catch (Exception Ex)
                {
                    throw Ex;
                }
            }
            #endregion DrawDriverString        #region DrawDriverString        public static void DrawDriverString(System.Drawing.Graphics g, string pText, System.Drawing.Font pFont, System.Drawing.Brush pBrush, System.Drawing.PointF[] pPositions, System.Drawing.Drawing2D.Matrix pMatrix)
            {
                try
                {                if (g == null)
                        throw new ArgumentNullException("graphics");
                    if (pText == null)
                        throw new ArgumentNullException("text");
                    if (pFont == null)
                        throw new ArgumentNullException("font");
                    if (pBrush == null)
                        throw new ArgumentNullException("brush");
                    if (pPositions == null)
                        throw new ArgumentNullException("positions");                // Get hGraphics
                    System.Reflection.FieldInfo field = typeof(System.Drawing.Graphics).GetField("nativeGraphics", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
                    IntPtr hGraphics = (IntPtr)field.GetValue(g);                // Get hFont
                    field = typeof(System.Drawing.Font).GetField("nativeFont", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
                    IntPtr hFont = (IntPtr)field.GetValue(pFont);                // Get hBrush
                    field = typeof(System.Drawing.Brush).GetField("nativeBrush", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
                    IntPtr hBrush = (IntPtr)field.GetValue(pBrush);                // Get hMatrix
                    IntPtr hMatrix = IntPtr.Zero;
                    if (pMatrix != null)
                    {
                        field = typeof(System.Drawing.Drawing2D.Matrix).GetField("nativeMatrix", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
                        hMatrix = (IntPtr)field.GetValue(pMatrix);
                    }                int result = GdipDrawDriverString(hGraphics, pText, pText.Length, hFont, hBrush, pPositions, (int)DriverStringOptions.CmapLookup, hMatrix);
                }
                catch (NullReferenceException NullEx)
                {
                    throw NullEx;
                }
                catch (Exception Ex)
                {
                    throw Ex;
                }
            }
            #endregion DrawDriverString    }
    }我比较喜欢调用这个方法
    DrawDriverString(g, "我比较喜欢调用这个方法", mFont, mBrush, mRect, 20);
    这里的参数名都很容易理解了,不再说明
      

  5.   

    1楼7楼都对。DrawString是不可能指定行间距的。