using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Text; using System.Windows.Forms; namespace NetLibrary.Drawing2D { #region 我的图片 public class MyBitmap { private Bitmap BackgroundImage = null; private Graphics MyGraphics = null; private string FilePath = ""; public MyBitmap(string FilePath) { BackgroundImage=CustomIO.GetBitmap(FilePath); MyGraphics = CreateGraphics(); } public MyBitmap(byte[] images) { BackgroundImage = CustomIO.GetPhoto(images); MyGraphics = CreateGraphics(); } #region 创建画布 private Graphics CreateGraphics() { Graphics gp = Graphics.FromImage(BackgroundImage); gp.PageUnit = GraphicsUnit.Pixel; gp.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; gp.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality; gp.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; gp.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver; gp.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality; gp.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; return gp; } #endregion #region 去除内存 public void Dispose() { MyGraphics.Dispose(); BackgroundImage = null; MyGraphics = null; } #endregion #region 画表格 public void DrawTable(MyTable tb) { FormatGroups(tb); int Left = tb.Left; int Top = tb.Top; Color TextColor = Color.FromName(tb.FontColor); string BackColor = ""; foreach (var row in tb.Rows) { BackColor = row.BackColor; for (int i = 0; i < tb.Columns.Count; i++) { MyCell cell = row.Cells[i]; if (cell.Visible == true) { if (string.IsNullOrEmpty(cell.FontColor) == false) { TextColor = Color.FromName(cell.FontColor); } else { TextColor = Color.FromName(tb.FontColor); } if (string.IsNullOrEmpty(cell.BackColor) == false) { BackColor = cell.BackColor; } else { BackColor = row.BackColor; } Rectangle rect = new Rectangle(Left, Top, tb.Columns[i].Width * cell.ColumnSpan, row.Height * cell.RowSpan); if (string.IsNullOrEmpty(BackColor) == false) { SolidBrush br = new SolidBrush(Color.FromName(BackColor)); MyGraphics.FillRectangle(br, rect); br.Dispose(); } if (tb.ShowLine == true) MyGraphics.DrawRectangle(new Pen(Color.Black, tb.BorderWidth), rect); if (cell.Img == null) { TextFormatFlags flags = TextFormatFlags.TextBoxControl | TextFormatFlags.WordBreak | TextFormatFlags.NoPadding; if (cell.TextAlign == "Center") flags = flags | TextFormatFlags.HorizontalCenter; if (cell.TextAlign == "Right") flags = flags | TextFormatFlags.Right; if (cell.VerticalAlign == "Center") flags = flags | TextFormatFlags.VerticalCenter; if (cell.VerticalAlign == "Bottom") flags = flags | TextFormatFlags.Bottom; TextRenderer.DrawText(MyGraphics, cell.Text, cell.font, rect, TextColor, flags); } else { Bitmap bmp = CustomIO.GetBitmap(cell.Img.FilePath); int TextTop = 0; int TextLeft = 0; int ImgTop = 0; int ImgLeft = 0; SizeF fs = GetFontSize(cell.font, cell.Text); int TextHeight = Convert.ToInt32(fs.Height); int TextWidth = Convert.ToInt32(fs.Width); if (cell.TextAlign == "Center") { TextLeft = Left + ((tb.Columns[i].Width * cell.ColumnSpan - TextWidth - cell.Img.Width) / 2); } if (cell.TextAlign == "Right") { TextLeft = Left + (tb.Columns[i].Width * cell.ColumnSpan - TextWidth - cell.Img.Width); } if (string.IsNullOrEmpty(cell.TextAlign) == true || cell.TextAlign == "Left") { TextLeft = Left; } if (cell.VerticalAlign == "Center") { TextTop = Top + ((row.Height * cell.RowSpan - TextHeight) / 2); ImgTop = Top + ((row.Height * cell.RowSpan - cell.Img.Height) / 2); } if (cell.VerticalAlign == "Bottom") { TextTop = Top + (row.Height * cell.RowSpan - TextHeight); ImgTop = Top + (row.Height * cell.RowSpan - cell.Img.Height); } if (string.IsNullOrEmpty(cell.VerticalAlign) == true || cell.VerticalAlign == "Top") { TextTop = Top; ImgTop = Top; } ImgLeft = TextLeft + TextWidth; MyGraphics.DrawString(cell.Text, cell.font, new SolidBrush(TextColor), TextLeft, TextTop); MyGraphics.DrawImage(bmp, ImgLeft, ImgTop, cell.Img.Width, cell.Img.Height); } } Left += tb.Columns[i].Width; } Left = tb.Left; Top += row.Height; } } #endregion #region 画文字 public void DrawString(MyString item) { FontStyle style = FontStyle.Regular; if (item.IsBold == true) style = style | FontStyle.Bold; if (item.IsItalic == true) style = style | FontStyle.Italic; Font f = new Font(item.FontName, item.FontSize, style); TextFormatFlags flags = TextFormatFlags.TextBoxControl | TextFormatFlags.WordBreak | TextFormatFlags.NoPadding; if (item.TextAlign == "Center") flags = flags | TextFormatFlags.HorizontalCenter; if (item.TextAlign == "Right") flags = flags | TextFormatFlags.Right; if (item.VerticalAlign == "Center") flags = flags | TextFormatFlags.VerticalCenter; if (item.VerticalAlign == "Bottom") flags = flags | TextFormatFlags.Bottom; Color TextColor = Color.FromName(item.FontColor); Rectangle rect = new Rectangle(item.Left, item.Top, item.Width, item.Height); TextRenderer.DrawText(MyGraphics, item.Text, f, rect, TextColor, flags); } #endregion #region 画图片 public void DrawImage(MyImage item) { Bitmap bmp = CustomIO.GetBitmap(item.FilePath); //第一个柜形为要画的图片大小和坐标,第二个为要截取的图片坐标和大小 MyGraphics.DrawImage(bmp, new Rectangle(0, 0, item.Width, item.Height), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel); } #endregion #region 保存图片 public void Save(ImageFormat imgFormat) { if (string.IsNullOrEmpty(this.FilePath) == false) throw new Exception("保存文件路径不存在"); BackgroundImage.Save(this.FilePath,imgFormat); } #endregion #region 另存为图片 public void SaveAs(string filePath, ImageFormat imgFormat) { if (File.Exists(filePath) == true) File.Delete(filePath); BackgroundImage.Save(filePath, imgFormat); } #endregion #region 返回行高 public int GetFontHeight(Font f) { return TextRenderer.MeasureText("测试", f).Height; } #endregion #region 返回字体大小 public SizeF GetFontSize(Font f,string Text) { // return TextRenderer.MeasureText(Text, f); return MyGraphics.MeasureString(Text, f); } #endregion #region 合并单元格 void FormatGroups(MyTable tb) { FontStyle style = FontStyle.Regular; if (tb.IsBold == true) style = style | FontStyle.Bold; if (tb.IsItalic == true) style = style | FontStyle.Italic; Font CurrentFont = new Font(tb.FontName, tb.FontSize * 72 / BackgroundImage.HorizontalResolution, style); foreach (MyRow row in tb.Rows) { int rowIndex = tb.Rows.IndexOf(row); for (int i = 0; i < tb.Columns.Count; i++) { MyCell cell = row.Cells[i]; if (string.IsNullOrEmpty(cell.FontName) == true) { cell.font = CurrentFont; } else { style = FontStyle.Regular; if (cell.IsBold == true) style = style | FontStyle.Bold; if (cell.IsItalic == true) style = style | FontStyle.Italic; cell.font = new Font(cell.FontName, cell.FontSize * 72 / BackgroundImage.HorizontalResolution, style); } if (cell.RowSpan > 1) { //如果跨行数等于>1,那么添加,计算本单元格所需高度 //cell.Height = cell.Height * cell.RowSpan; for (int ii = 1; ii < cell.RowSpan; ii++) { tb.Rows[rowIndex + ii].Cells[i].Visible = false; tb.Rows[rowIndex + ii].Cells[i].VisibleState = false; } } if (cell.ColumnSpan > 1) { //如果跨列数大于1,那么计算本单元格所需宽度 //cell.Width = cell.Width * cell.ColumnSpan; for (int ii = 1; ii < cell.ColumnSpan; ii++) { row.Cells[i + ii].Visible = false; row.Cells[i + ii].VisibleState = true; } } //如果不是第一行,并且左边与上边的单元格属性为隐藏,那么隐藏单元格 if (rowIndex != 0 && i > 0) { if (row.Cells[i - 1].Visible == false && row.Cells[i - 1].VisibleState == false && tb.Rows[rowIndex - 1].Cells[i].Visible == false && tb.Rows[rowIndex - 1].Cells[i].VisibleState == true) { cell.Visible = false; } } } } } #endregion } #endregion #region 表对象 public class MyTable { public int Top { get; set; } public int Left { get; set; } public int Width { get; set; } public int Height { get; set; } public bool ShowLine { get; set; } public string FontColor { get; set; } public string FontName { get; set; } public float FontSize { get; set; } public bool IsItalic { get; set; } //是否倾斜 public bool IsBold { get; set; } //是否加粗 public float BorderWidth { get; set; } public List Rows { get; set; } public List Columns { get; set; } public MyTable() { Rows = new List(); Columns = new List(); BorderWidth = 1; ShowLine = true; FontName = "宋体"; FontColor = "Black"; FontSize = 12; } } #endregion #region 表格中的行 public class MyRow { public List Cells { get; set; } public int Height { get; set; } public string BackColor { get; set; } public MyRow() { Cells = new List(); BackColor = ""; } } #endregion #region 表格中的单元格 public class MyCell { public int Width { get; set; } public int Height { get; set; } public string FontColor { get; set; } public string FontName { get; set; } public float FontSize { get; set; } public bool IsItalic { get; set; } //是否倾斜 public bool IsBold { get; set; } //是否加粗 public string Text { get; set; } public string TextAlign { get; set; } public string VerticalAlign { get; set; } public bool Visible { get; set; } public string BackColor { get; set; } public MyImage Img { get; set; } public int ColumnSpan { get; set; } public int RowSpan { get; set; } public Font font { get; set; } /// /// true为列隐藏,false为行隐藏 /// public bool VisibleState { get; set; } public MyCell() { FontColor = ""; BackColor = ""; FontName = ""; FontSize = 0; TextAlign = "Center"; //文本方向,Left,Right,Center VerticalAlign = "Center"; //Top,Center,Bottom Text = ""; Visible = true; ColumnSpan = 1; RowSpan = 1; } } #endregion #region 表格中的列 public class MyColumn { public int Width { get; set; } } #endregion #region 我的文字 public class MyString { public int Top { get; set; } public int Left { get; set; } public int Width { get; set; } public int Height { get; set; } public string FontColor { get; set; } public string FontName { get; set; } public float FontSize { get; set; } public bool IsItalic { get; set; } //是否倾斜 public bool IsBold { get; set; } //是否加粗 public string Text { get; set; } public string TextAlign { get; set; } public string VerticalAlign { get; set; } public MyString() { FontName = "宋体"; FontColor = "Black"; FontSize = 12; TextAlign = "Left"; //文本方向,Left,Right,Center VerticalAlign = "Top"; //Top,Center,Bottom } } #endregion #region 我的图片 public class MyImage { public int Top { get; set; } public int Left { get; set; } public int Width { get; set; } public int Height { get; set; } public string FilePath { get; set; } } #endregion }