using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text.RegularExpressions; namespace LYFZ.Software.MainBusiness.ReportPrint { /// /// <类名> PrinterDrawMethod /// <描述> 用于打印的绘图函数 /// <作者> 藏锋 /// <日期> 2017年11月23日 /// public static class PrinterDrawMethod { #region 静态变量; // 画刷; public static SolidBrush _drawBrush = new SolidBrush( Color.Black ); // 自动缩放是否使用页边距; public static bool AutoScaleNotMargion = true; #endregion /// /// 文本填充类型 /// public enum TextPaddingType { // 正常模式; TP_Normal = 0X00001, // 自动换行; TP_AutoLine = 0X00002, // 自动缩放; TP_AutoScale = 0X00004, // cell自动 TP_AutoCell = 0X00008 } #region 打印绘图函数 /// /// 绘制文本框;(换行的字符未处理!!!!) /// /// 绘图对象 /// 要绘制的文本 /// 文本要显示的区域 /// 文本字号 /// 文本字体 /// 是否自动换行,如果使用自动换行,则自动缩放不处理 /// 字号是否自动缩放,如果自动缩放,则自动换行不处理 /// 是否显示边框 /// 换行时的行间距 public static int DrawCellTextAutroWrap( Graphics grahpics, string strText, Rectangle rcDisplay, Font textFont, bool autoWrap = true, int nWrapLineSpace = 3, bool showFrame = true ) { // 文本索引; int nIndex = 0; // 行数; int nRowsCount = 0; // 所有行总高; int nRowsHeight = 0; // 显示区域结果; Rectangle rcResult = rcDisplay; // 获取指定的 Font 绘制的指定字符串大小; SizeF textfontSize = grahpics.MeasureString( strText, textFont ); // 换行的文本; List listText = new List(); // 画刷; SolidBrush drawBrush = new SolidBrush( Color.Black ); if ( autoWrap ) { // 自动换行; // 换行符字符串数组; List listWrapText = Regex.Split( strText, "\r\n", RegexOptions.IgnoreCase ).ToList(); foreach ( string text in listWrapText ) { strText = text; nIndex = strText.Length; textfontSize = grahpics.MeasureString( strText, textFont ); while ( textfontSize.Width > rcDisplay.Width ) { textfontSize = grahpics.MeasureString( strText.Substring( 0, --nIndex ), textFont ); if ( textfontSize.Width < rcDisplay.Width ) { // 行数自增; nRowsCount++; // 添加新行文本; listText.Add( strText.Substring( 0, nIndex ) ); // 剩余文本; strText = strText.Substring( nIndex ); // 重置索引; nIndex = strText.Length; // 重新获取剩余行字体宽高; textfontSize = grahpics.MeasureString( strText, textFont ); } } // 是否有剩余文本; if ( !string.IsNullOrEmpty( strText ) ) { listText.Add( strText ); nRowsCount++; } } // 计算行总高; nRowsHeight = (int)Math.Ceiling( nRowsCount * ( textfontSize.Height + nWrapLineSpace ) ); // 设置显示结果区域; rcResult.Height = nRowsHeight; //向上取整; // 重新输出所有文本; for ( int i = 0; i < listText.Count; i++ ) { grahpics.DrawString( listText[i], textFont, drawBrush, new RectangleF( rcDisplay.Left, rcDisplay.Top + i * textfontSize.Height + ( i + 1 ) * nWrapLineSpace, rcDisplay.Width, textfontSize.Height ) ); } } else { // 不换行,则可能显示不完全; grahpics.DrawString( strText, textFont, drawBrush, new RectangleF( rcDisplay.Left, rcDisplay.Top + nWrapLineSpace, rcDisplay.Width, textfontSize.Height ) ); } // 是否画边框; if ( showFrame ) grahpics.DrawRectangle( new Pen( drawBrush ), rcResult ); // 返回所有行总高; return nRowsHeight; } /// /// 绘制文本框; /// /// 绘图对象 /// 要绘制的文本 /// 文本要显示的区域 /// 文本字号 /// 文本字体 /// 是否自动换行,如果使用自动换行,则自动缩放不处理 /// 字号是否自动缩放,如果自动缩放,则自动换行不处理 /// 是否显示边框 /// 换行时的行间距 public static int DrawCellTextAutroWrap( Graphics grahpics, string strText, Rectangle rcDisplay, Single fontSize, string fontName, bool autoWrap = true, int nWrapLineSpace = 3, bool showFrame = true ) { // 文本索引; int nIndex = 0; // 行数; int nRowsCount = 0; // 所有行总高; int nRowsHeight = 0; // 显示区域结果; Rectangle rcResult = rcDisplay; // 创建字体; Font textFont = new Font( fontName, fontSize ); // 获取指定的 Font 绘制的指定字符串大小; SizeF textfontSize = grahpics.MeasureString( strText, textFont ); // 换行的文本; List listText = new List(); // 画刷; SolidBrush drawBrush = new SolidBrush( Color.Black ); if ( autoWrap ) { // 自动换行; // 换行符字符串数组; List listWrapText = Regex.Split( strText, "\r\n", RegexOptions.IgnoreCase ).ToList(); foreach ( string text in listWrapText ) { strText = text; nIndex = strText.Length; textfontSize = grahpics.MeasureString( strText, textFont ); while ( textfontSize.Width > rcDisplay.Width ) { textfontSize = grahpics.MeasureString( strText.Substring( 0, --nIndex ), textFont ); if ( textfontSize.Width < rcDisplay.Width ) { // 行数自增; nRowsCount++; // 添加新行文本; listText.Add( strText.Substring( 0, nIndex ) ); // 剩余文本; strText = strText.Substring( nIndex ); // 重置索引; nIndex = strText.Length; // 重新获取剩余行字体宽高; textfontSize = grahpics.MeasureString( strText, textFont ); } } // 是否有剩余文本; if ( !string.IsNullOrEmpty( strText ) ) { listText.Add( strText ); nRowsCount++; } } // 计算行总高; nRowsHeight = (int)Math.Ceiling( nRowsCount * ( textfontSize.Height + nWrapLineSpace ) ); // 设置显示结果区域; rcResult.Height = nRowsHeight; //向上取整; // 重新输出所有文本; for ( int i = 0; i < listText.Count; i++ ) { grahpics.DrawString( listText[i], textFont, drawBrush, new RectangleF( rcDisplay.Left, rcDisplay.Top + i * textfontSize.Height + ( i + 1 ) * nWrapLineSpace, rcDisplay.Width, textfontSize.Height ) ); } } else { // 不换行,则可能显示不完全; grahpics.DrawString( strText, textFont, drawBrush, new RectangleF( rcDisplay.Left, rcDisplay.Top + nWrapLineSpace, rcDisplay.Width, textfontSize.Height ) ); } // 是否画边框; if ( showFrame ) grahpics.DrawRectangle( new Pen( drawBrush ), rcResult ); // 返回所有行总高; return nRowsHeight; } /// /// 计算缩放字体; /// /// /// /// /// /// /// public static Font ComputeAutoScaleFont( Graphics grahpics, string strText, Rectangle rcDisplay, Font textFont, Single minFontSize = 6 ) { // 字符索引; int nIndex = 0; // 行数; int nRowsCount = 0; // 所有行总高; int nRowsHeight = 0; // 缩放字体; Font scaleFont = textFont; // 字体名称; string fontName = textFont.Name; // 字体大小; Single fontSize = textFont.Size; // 获取指定的 Font 绘制的指定字符串大小; SizeF textfontSize = grahpics.MeasureString( strText, scaleFont ); // 换行符字符串数组; List listWrapText = Regex.Split( strText, "\r\n", RegexOptions.IgnoreCase ).ToList(); again: foreach ( string text in listWrapText ) { strText = text; nIndex = strText.Length; textfontSize = grahpics.MeasureString( strText, scaleFont ); while ( textfontSize.Width > rcDisplay.Width ) { textfontSize = grahpics.MeasureString( strText.Substring( 0, --nIndex ), scaleFont ); if ( textfontSize.Width < rcDisplay.Width ) { // 行数自增; nRowsCount++; // 剩余文本; strText = strText.Substring( nIndex ); // 重置字符索引; nIndex = strText.Length; // 重新计算剩余文本大小; textfontSize = grahpics.MeasureString( strText, scaleFont ); } } // 是否有剩余文本; if ( !string.IsNullOrEmpty( strText ) ) { nRowsCount++; } } // 计算行总高; nRowsHeight = (int)Math.Ceiling( nRowsCount * textfontSize.Height ); if ( rcDisplay.Height < nRowsHeight && fontSize > minFontSize ) { // 字号递减; fontSize--; // 新建缩放字体; scaleFont = new Font( fontName, fontSize ); // 重置行数; nRowsCount = 0; // 回执goto; goto again; } // 返回缩放字体; return scaleFont; } public static Font ComputeAutoScaleFontEx( Graphics grahpics, string strText, Rectangle rcDisplay, Font textFont, Single minFontSize = 6 ) { Font scaleFont = textFont; string fontName = textFont.Name; Single fontSize = textFont.Size; Rectangle rcResult = ComputeTextCell( grahpics, strText, rcDisplay, scaleFont ); while ( rcResult.Height > rcDisplay.Height && fontSize > minFontSize ) rcResult = ComputeTextCell( grahpics, strText, rcDisplay, scaleFont = new Font( fontName, --fontSize ) ); // 返回缩放字体; return scaleFont; } /// /// 绘制文本框; /// /// 绘图对象 /// 要绘制的文本 /// 文本要显示的区域 /// 文本字号 /// 文本字体 /// 是否自动换行,如果使用自动换行,则自动缩放不处理 /// 字号是否自动缩放,如果自动缩放,则自动换行不处理 /// 是否显示边框 /// 换行时的行间距 /// public static int DrawCellTextAutroScale( Graphics grahpics, string strText, Rectangle rcDisplay, Font textFont, bool autoScale = true, bool showFrame = true, Single minFontSize = 6 ) { // 新建缩放字体 ; Font scaleFont = textFont; // 字体名称; string fontName = textFont.Name; // 字号; Single fontSize = textFont.Size; // 获取指定的 Font 绘制的指定字符串大小; SizeF textfontSize = grahpics.MeasureString( strText, textFont ); // 画刷; SolidBrush drawBrush = new SolidBrush( Color.Black ); // 字体递减; if ( autoScale ) { while ( textfontSize.Width > rcDisplay.Width && fontSize > minFontSize ) { fontSize--; textfontSize = grahpics.MeasureString( strText, scaleFont = new Font( fontName, fontSize ) ); } } // 上边空白区域值; int nTopMargin = ( rcDisplay.Height - (int)Math.Ceiling( textfontSize.Height ) ) <= 0 ? 0 : (int)Math.Ceiling( ( rcDisplay.Height - textfontSize.Height ) / 2 ); // 垂直居中显示; grahpics.DrawString( strText, scaleFont, drawBrush, new RectangleF( rcDisplay.Left, rcDisplay.Top + ( AutoScaleNotMargion ? nTopMargin : 0 ), rcDisplay.Width, textfontSize.Height ) ); // 是否显示边框; if ( showFrame ) grahpics.DrawRectangle( new Pen( drawBrush ), rcDisplay ); // 返回新高; return (int)Math.Ceiling( textfontSize.Height ) + ( AutoScaleNotMargion ? nTopMargin : 0 ); } /// /// 绘制文本框; /// /// 绘图对象 /// 要绘制的文本 /// 文本要显示的区域 /// 文本字号 /// 文本字体 /// 是否自动换行,如果使用自动换行,则自动缩放不处理 /// 字号是否自动缩放,如果自动缩放,则自动换行不处理 /// 是否显示边框 /// 换行时的行间距 /// public static int DrawCellTextAutroScale( Graphics grahpics, string strText, Rectangle rcDisplay, Single fontSize, string fontName, bool autoScale = true, bool showFrame = true, Single minFontSize = 6 ) { Font textFont = new Font( fontName, fontSize ); // 获取指定的 Font 绘制的指定字符串大小; SizeF textfontSize = grahpics.MeasureString( strText, textFont ); // 画刷; SolidBrush drawBrush = new SolidBrush( Color.Black ); if ( autoScale ) { while ( textfontSize.Width > rcDisplay.Width && fontSize > minFontSize ) { fontSize--; textfontSize = grahpics.MeasureString( strText, textFont = new Font( fontName, fontSize ) ); } } // 上边空白区域值; int nTopMargin = ( rcDisplay.Height - (int)Math.Ceiling( textfontSize.Height ) ) <= 0 ? 0 : (int)Math.Ceiling( ( rcDisplay.Height - textfontSize.Height ) / 2 ); // 垂直居中显示; grahpics.DrawString( strText, textFont, drawBrush, new RectangleF( rcDisplay.Left, rcDisplay.Top + ( AutoScaleNotMargion ? nTopMargin : 0 ), rcDisplay.Width, textfontSize.Height ) ); // 是否显示边框; if ( showFrame ) grahpics.DrawRectangle( new Pen( drawBrush ), rcDisplay ); // 返回新高; return (int)Math.Ceiling( textfontSize.Height ) + ( AutoScaleNotMargion ? nTopMargin : 0 ); } /// /// /// /// /// /// /// /// /// public static Rectangle ComputeTextCell( Graphics grahpics, string strText, Rectangle rcDisplay, Font textFont ) { // 字符索引; int nIndex = 0; // 换行行数; int nRowsCount = 0; // 获取文本宽高; SizeF textfontSize = grahpics.MeasureString( strText, textFont ); // 换行符字符集; List listText = Regex.Split( strText, "\r\n", RegexOptions.IgnoreCase ).ToList(); foreach ( string text in listText ) { strText = text; nIndex = strText.Length; textfontSize = grahpics.MeasureString( strText, textFont ); while ( textfontSize.Width > rcDisplay.Width ) { textfontSize = grahpics.MeasureString( strText.Substring( 0, --nIndex ), textFont ); if ( textfontSize.Width < rcDisplay.Width ) { // 行数自增; nRowsCount++; // 剩余文本; strText = strText.Substring( nIndex ); // 重置索引; nIndex = strText.Length; // 重新获取剩余行字体宽高; textfontSize = grahpics.MeasureString( strText, textFont ); } } // 是否有剩余文本; if ( !string.IsNullOrEmpty( strText ) ) { nRowsCount++; } } // 返回新区域; return new Rectangle( rcDisplay.X, rcDisplay.Y, rcDisplay.Width, (int)Math.Ceiling( textfontSize.Height * nRowsCount ) ); } /// /// /// /// /// /// /// /// /// /// public static void DrawCell( Graphics grahpics, string strText, Rectangle rcDisplay, Font textFont, Color colorBackground, TextPaddingType paddingType, bool showFrame = true ) { } #endregion } }