Csharp: 打印設置字符之間的間距
2013-01-30 13:00
232 查看
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Drawing.Imaging; using System.Drawing.Printing; using System.Drawing.Drawing2D; using System.Drawing.Text; using System.Diagnostics; using System.Runtime.InteropServices; using System.Drawing; namespace Geovin.Du.ControlLibrary { /// <summary> /// 設置字符之間的間距 /// /// </summary> 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 /// <summary> /// /// </summary> private GdiPlusMethods() { } #endregion GdiPlusMethods #region DriverStringOptions /// <summary> /// /// </summary> private enum DriverStringOptions { CmapLookup = 1, Vertical = 2, Advance = 4, LimitSubpixel = 8, } #endregion DriverStringOptions #region DrawDriverString /// <summary> /// 字符間距 /// </summary> /// <param name="g"></param> /// <param name="pText"></param> /// <param name="pFont"></param> /// <param name="pBrush"></param> /// <param name="pPositions"></param> private 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 /// <summary> /// /// </summary> /// <param name="g"></param> /// <param name="pText"></param> /// <param name="pFont"></param> /// <param name="pBrush"></param> /// <param name="pRect"></param> /// <param name="pHeight"></param> private 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 /// <summary> /// /// </summary> /// <param name="g"></param> /// <param name="pText"></param> /// <param name="pFont"></param> /// <param name="pBrush"></param> /// <param name="pPositions"></param> /// <param name="pMatrix"></param> private 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; } } /// <summary> /// 設置字符間距 /// 塗聚文 /// </summary> /// <param name="g">Drawing.Graphics</param> /// <param name="pText">字符</param> /// <param name="x">X坐標</param> /// <param name="y">Y坐標</param> /// <param name="width">字符寬度</param> /// <param name="pFont">字體</param> /// <param name="pBrush"></param> public static void DrawStringCharacterSpacing(System.Drawing.Graphics g, string pText, float x, float y, float width, System.Drawing.Font pFont, System.Drawing.Brush pBrush) { //Get the height of myFont. float height = pFont.GetHeight(g); //當大於兩個字符時進行設置 if (pText.Length >= 2) { g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; SizeF size = g.MeasureString(pText, pFont, int.MaxValue);//int.MaxValue float h = size.Height; float w = size.Width; PointF[] positions = new PointF[pText.Length]; for (int i = 0; i < pText.Length; i++) { positions[i] = new PointF(i * width + x, y); //20 為字間距離 } DrawDriverString(g, pText, pFont, pBrush, positions); } } #endregion DrawDriverString } }
相关文章推荐
- Csharp: 打印設置字符之間的間距
- Csharp: 打印設置字符之間的間距
- map容器的使用以及打印Unicode宽字符到文本
- 根据字符串中出现的字符逐个打印各字符出现次数
- 简单的程序日志打印函数WriteLog,适用于vc等,含宽字符。
- java 输入一个字符串,打印出该字符串中字符的所有排列
- 打印一个N*N的方阵,N为每边字符的个数( 3〈N〈20 )
- BarTender打印额外字符的方法
- ASCII 非打印字符
- Csharp: 拼音转汉字字符搜索字符串
- 按要求打印字符数组中所有可能的字符组合
- java wait()方法notifyAll()方法实现三个线程打印A,B,C字符
- erlang原子、元组、列表、可打印字符总结
- Python: 打印出大写字符C
- 终端对非打印字符的显示方式的有趣例子
- 产生XML文件的时候,过滤低位非打印字符
- WEB Service 暴露的XML文档中存在低序位非打印 ASCII 字符
- 编写一个程序读入一行输入,然后反向打印该行,您可以把输入存储在一个char数组中: 假定该行不超过255个字符。回忆一下,您可以使用具有%c说明符的scanf()从输入中一次 读入一个字符,而且当您按下回车键时会产生换行符(/n)
- 打印字符频度直方图--C语言实现