DrawString如何对字符的行高和字符间距进行控制?我是指在Paint事件中,DrawString时跨行的情况下,控制行高和字符间距等的做法
System.Drawing.Graphics g = e.Graphics;
g.DrawString("测试字符测试字符测试字符测试字符测试字符测试字符测试字符测试字符", mFont, mBrush, mRect);多谢
System.Drawing.Graphics g = e.Graphics;
g.DrawString("测试字符测试字符测试字符测试字符测试字符测试字符测试字符测试字符", mFont, mBrush, mRect);多谢
解决方案 »
- 【调试到蛋碎】vs打包时Installer类中进行窗体创建,showdialog卡死
- 求100位小数除以100位小数的算法
- 一个关于SQL2005 时间的问题!!!!!!
- Solution大了,发现原来的一些文件结构很乱,想整理一下
- 问答题机器评分有什么好的算法?
- 文本框问题
- 请高手帮忙回答:将二进制文件读取到数据库中?
- 又多了一件新短裤,高兴,散分!
- 請問使用C#,怎樣把PC端的文件copy進手機端?手機端的平臺是Windows Mobile
- C#中如何调用自己原来写的纯C的API(DLL动态链接库的形式的)啊?
- 如何在Panel上画出直线?
- 有关IL语言的简单语法问题,谁知道告知一下,不胜感激
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等方法会有帮助。
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);
这里的参数名都很容易理解了,不再说明