580 lines
16 KiB
C#
580 lines
16 KiB
C#
using System;
|
|
using System.Drawing;
|
|
using System.Windows.Forms;
|
|
|
|
namespace GoldPrinter
|
|
{
|
|
public class DrawGrid : GoldGrid, IDraw, IDisposable
|
|
{
|
|
private Graphics _graphics;
|
|
|
|
private Rectangle _rectangle;
|
|
|
|
private Brush _brush;
|
|
|
|
private Pen _pen;
|
|
|
|
public Graphics Graphics
|
|
{
|
|
get
|
|
{
|
|
return this._graphics;
|
|
}
|
|
set
|
|
{
|
|
this._graphics = value;
|
|
}
|
|
}
|
|
|
|
public Rectangle Rectangle
|
|
{
|
|
get
|
|
{
|
|
return this._rectangle;
|
|
}
|
|
set
|
|
{
|
|
this._rectangle = value;
|
|
}
|
|
}
|
|
|
|
public Pen Pen
|
|
{
|
|
get
|
|
{
|
|
return this._pen;
|
|
}
|
|
set
|
|
{
|
|
if (value != null)
|
|
{
|
|
this._pen = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
public Brush Brush
|
|
{
|
|
get
|
|
{
|
|
return this._brush;
|
|
}
|
|
set
|
|
{
|
|
if (value != null)
|
|
{
|
|
this._brush = value;
|
|
}
|
|
}
|
|
}
|
|
|
|
public DrawGrid()
|
|
{
|
|
this._pen = new Pen(Color.Black);
|
|
this._brush = Brushes.Black;
|
|
}
|
|
|
|
public DrawGrid(int rows, int cols)
|
|
{
|
|
base.Initialize(rows, cols);
|
|
}
|
|
|
|
public override void Dispose()
|
|
{
|
|
base.Dispose();
|
|
this._graphics.Dispose();
|
|
}
|
|
|
|
public void DrawGridLine()
|
|
{
|
|
this.DrawGridLine(this._graphics, this._rectangle, this.Pen, base.GridText, base.PreferredRowHeight, base.ColsWidth, base.Line, base.Border, new PointF(1f, 1f), base.Merge);
|
|
}
|
|
|
|
public void DrawGridText()
|
|
{
|
|
this.DrawGridText(this._graphics, this._rectangle, this.Brush, base.GridText, base.PreferredRowHeight, base.ColsWidth, base.ColsAlignString, base.Font, new PointF(1f, 1f), base.Merge);
|
|
}
|
|
|
|
public void DrawGridBorder()
|
|
{
|
|
this.DrawGridBorder(this._graphics, this._rectangle, this.Pen, base.Border);
|
|
}
|
|
|
|
public void Draw()
|
|
{
|
|
this.DrawGridLine();
|
|
this.DrawGridText();
|
|
this.DrawGridBorder();
|
|
}
|
|
|
|
protected void DrawGridLine(Graphics g, Rectangle p_rec, Pen p_pen, int p_rows, int p_cols, int p_rowHeight, int[] p_arrColsWidth, GridLineFlag p_gridLineFlag, GridBorderFlag p_gridBorderFlag, PointF p_scaleXY)
|
|
{
|
|
Rectangle rectangle = new Rectangle(p_rec.X, p_rec.Y, p_rec.Width, p_rec.Height);
|
|
this.TransGrid(g, rectangle, p_scaleXY);
|
|
if (p_gridLineFlag != GridLineFlag.None)
|
|
{
|
|
int width = rectangle.Width;
|
|
int height = rectangle.Height;
|
|
if (p_gridLineFlag == GridLineFlag.Horizontal || p_gridLineFlag == GridLineFlag.Both)
|
|
{
|
|
int num = rectangle.X;
|
|
int num2 = rectangle.Y;
|
|
int x = num + width;
|
|
for (int i = 1; i < p_rows; i++)
|
|
{
|
|
num2 += p_rowHeight;
|
|
int y = num2;
|
|
g.DrawLine(p_pen, num, num2, x, y);
|
|
}
|
|
}
|
|
if (p_gridLineFlag == GridLineFlag.Vertical || p_gridLineFlag == GridLineFlag.Both)
|
|
{
|
|
int[] array = new int[p_cols];
|
|
int num = rectangle.X;
|
|
int num2 = rectangle.Y;
|
|
int y = num2 + height;
|
|
for (int j = 0; j < p_cols - 1; j++)
|
|
{
|
|
num += p_arrColsWidth[j];
|
|
int x = num;
|
|
g.DrawLine(p_pen, num, num2, x, y);
|
|
}
|
|
}
|
|
}
|
|
if (p_gridBorderFlag != GridBorderFlag.None)
|
|
{
|
|
this.DrawGridBorder(g, rectangle, p_pen, p_gridBorderFlag);
|
|
}
|
|
this.ResetTransGrid();
|
|
}
|
|
|
|
protected void DrawGridLine(Graphics g, Rectangle p_rec, Pen p_pen, string[,] arrStrGrid, int p_rowHeight, int[] p_arrColsWidth, GridLineFlag p_gridLineFlag, GridBorderFlag p_gridBorderFlag, PointF p_scaleXY)
|
|
{
|
|
int length = arrStrGrid.GetLength(0);
|
|
int length2 = arrStrGrid.GetLength(1);
|
|
this.DrawGridLine(g, p_rec, p_pen, length, length2, p_rowHeight, p_arrColsWidth, p_gridLineFlag, p_gridBorderFlag, p_scaleXY);
|
|
}
|
|
|
|
protected void DrawGridMergeLine(Graphics g, Rectangle p_rec, Pen p_pen, string[,] arrStrGrid, int p_rowHeight, int[] p_arrColsWidth, GridLineFlag p_gridLineFlag, GridBorderFlag p_gridBorderFlag, PointF p_scaleXY, GridMergeFlag gridMergeFlag)
|
|
{
|
|
Rectangle rectangle = new Rectangle(p_rec.X, p_rec.Y, p_rec.Width, p_rec.Height);
|
|
int length = arrStrGrid.GetLength(0);
|
|
int length2 = arrStrGrid.GetLength(1);
|
|
if (gridMergeFlag == GridMergeFlag.None)
|
|
{
|
|
this.DrawGridLine(g, rectangle, p_pen, length, length2, p_rowHeight, p_arrColsWidth, p_gridLineFlag, p_gridBorderFlag, p_scaleXY);
|
|
}
|
|
else if (p_gridLineFlag != GridLineFlag.None)
|
|
{
|
|
this.TransGrid(g, rectangle, p_scaleXY);
|
|
int[] array = new int[length2];
|
|
for (int i = 0; i < length; i++)
|
|
{
|
|
int num = rectangle.X;
|
|
int num2 = rectangle.Y;
|
|
for (int j = 0; j < length2; j++)
|
|
{
|
|
int x = num + p_arrColsWidth[j];
|
|
num2 = rectangle.Y + p_rowHeight * i;
|
|
int num3 = num2;
|
|
if (i > 0)
|
|
{
|
|
if (gridMergeFlag == GridMergeFlag.Any)
|
|
{
|
|
if (arrStrGrid[i, j] == "" || arrStrGrid[i, j] != arrStrGrid[i - 1, j])
|
|
{
|
|
g.DrawLine(p_pen, num, num2, x, num3);
|
|
}
|
|
}
|
|
}
|
|
if (j > 0)
|
|
{
|
|
num3 += p_rowHeight;
|
|
x = num;
|
|
if (gridMergeFlag == GridMergeFlag.Any)
|
|
{
|
|
if (arrStrGrid[i, j] == "" || arrStrGrid[i, j] != arrStrGrid[i, j - 1])
|
|
{
|
|
g.DrawLine(p_pen, num, num2, x, num3);
|
|
}
|
|
}
|
|
}
|
|
num += p_arrColsWidth[j];
|
|
}
|
|
}
|
|
if (p_gridBorderFlag != GridBorderFlag.None)
|
|
{
|
|
this.DrawGridBorder(g, rectangle, p_pen, p_gridBorderFlag);
|
|
}
|
|
this.ResetTransGrid();
|
|
}
|
|
}
|
|
|
|
protected void DrawGridText(Graphics g, Rectangle p_rec, Brush p_brush, string[,] arrStrGrid, int p_rowHeight, int[] p_arrColsWidth, string alignment, Font p_font, PointF p_scaleXY)
|
|
{
|
|
try
|
|
{
|
|
Rectangle p_rec2 = new Rectangle(p_rec.X, p_rec.Y, p_rec.Width, p_rec.Height);
|
|
Font font = p_font;
|
|
if (font == null)
|
|
{
|
|
font = new Font("宋体", 12f);
|
|
}
|
|
int length = arrStrGrid.GetLength(0);
|
|
int length2 = arrStrGrid.GetLength(1);
|
|
int[] array = new int[length2];
|
|
AlignFlag[] colsAlign = this.GetColsAlign(alignment);
|
|
this.TransGrid(g, p_rec2, p_scaleXY);
|
|
StringFormat stringFormat = new StringFormat();
|
|
stringFormat.LineAlignment = StringAlignment.Center;
|
|
stringFormat.FormatFlags = (StringFormatFlags.NoWrap | StringFormatFlags.LineLimit);
|
|
for (int i = 0; i < length; i++)
|
|
{
|
|
int num = p_rec2.X;
|
|
int y = p_rec2.Y + p_rowHeight * i;
|
|
for (int j = 0; j < length2; j++)
|
|
{
|
|
int num2 = p_arrColsWidth[j];
|
|
Rectangle r = new Rectangle(num, y, num2, p_rowHeight + 4);
|
|
stringFormat.Alignment = StringAlignment.Near;
|
|
if (colsAlign.Length > j)
|
|
{
|
|
if (colsAlign[j] == AlignFlag.Center)
|
|
{
|
|
stringFormat.Alignment = StringAlignment.Center;
|
|
}
|
|
else if (colsAlign[j] == AlignFlag.Right)
|
|
{
|
|
stringFormat.Alignment = StringAlignment.Far;
|
|
}
|
|
}
|
|
g.DrawString(arrStrGrid[i, j], font, p_brush, r, stringFormat);
|
|
num += num2;
|
|
}
|
|
}
|
|
this.ResetTransGrid();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message);
|
|
}
|
|
finally
|
|
{
|
|
}
|
|
}
|
|
|
|
protected void DrawGridMergeText(Graphics g, Rectangle p_rec, Brush p_brush, string[,] arrStrGrid, int p_rowHeight, int[] p_arrColsWidth, string alignment, Font p_font, PointF p_scaleXY, GridMergeFlag gridMergeFlag)
|
|
{
|
|
if (gridMergeFlag == GridMergeFlag.None)
|
|
{
|
|
this.DrawGridText(g, p_rec, p_brush, arrStrGrid, p_rowHeight, p_arrColsWidth, alignment, p_font, p_scaleXY);
|
|
}
|
|
else
|
|
{
|
|
try
|
|
{
|
|
Rectangle p_rec2 = new Rectangle(p_rec.X, p_rec.Y, p_rec.Width, p_rec.Height);
|
|
Font font = p_font;
|
|
if (font == null)
|
|
{
|
|
font = new Font("宋体", 12f);
|
|
}
|
|
int length = arrStrGrid.GetLength(0);
|
|
int length2 = arrStrGrid.GetLength(1);
|
|
int[] array = new int[length2];
|
|
AlignFlag[] colsAlign = this.GetColsAlign(alignment);
|
|
this.TransGrid(g, p_rec2, p_scaleXY);
|
|
StringFormat stringFormat = new StringFormat();
|
|
stringFormat.LineAlignment = StringAlignment.Center;
|
|
stringFormat.FormatFlags = (StringFormatFlags.NoWrap | StringFormatFlags.LineLimit);
|
|
CellRectangle mergeCell = new CellRectangle(p_rec2.X, p_rec2.Y, 0, p_rowHeight);
|
|
for (int i = 0; i < length; i++)
|
|
{
|
|
for (int j = 0; j < length2; j++)
|
|
{
|
|
mergeCell = this.GetMergeCell(new Point(p_rec2.X, p_rec2.Y), arrStrGrid, p_rowHeight, p_arrColsWidth, i, j);
|
|
Rectangle r = new Rectangle(mergeCell.Left, mergeCell.Top, mergeCell.Width, mergeCell.Height + 4);
|
|
stringFormat.Alignment = StringAlignment.Near;
|
|
if (colsAlign.Length > j)
|
|
{
|
|
if (colsAlign[j] == AlignFlag.Center)
|
|
{
|
|
stringFormat.Alignment = StringAlignment.Center;
|
|
}
|
|
else if (colsAlign[j] == AlignFlag.Right)
|
|
{
|
|
stringFormat.Alignment = StringAlignment.Far;
|
|
}
|
|
}
|
|
g.DrawString(arrStrGrid[i, j], font, p_brush, r, stringFormat);
|
|
}
|
|
}
|
|
this.ResetTransGrid();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message);
|
|
}
|
|
finally
|
|
{
|
|
}
|
|
}
|
|
}
|
|
|
|
protected void DrawGridBorder(Graphics g, Rectangle rec, Pen p_pen, GridBorderFlag p_gridBorderFlag)
|
|
{
|
|
if (p_gridBorderFlag != GridBorderFlag.None)
|
|
{
|
|
float width = 1f;
|
|
int num = 0;
|
|
switch (p_gridBorderFlag)
|
|
{
|
|
case GridBorderFlag.SingleBold:
|
|
width = 2f;
|
|
break;
|
|
case GridBorderFlag.Double:
|
|
g.DrawRectangle(p_pen, rec);
|
|
num = 2;
|
|
break;
|
|
case GridBorderFlag.DoubleBold:
|
|
g.DrawRectangle(p_pen, rec);
|
|
width = 2f;
|
|
num = 3;
|
|
break;
|
|
}
|
|
Pen pen = (Pen)p_pen.Clone();
|
|
pen.Width = width;
|
|
Rectangle rect = rec;
|
|
rect.X = rec.X - num;
|
|
rect.Y = rec.Y - num;
|
|
rect.Width = rec.Width + num * 2;
|
|
rect.Height = rec.Height + num * 2;
|
|
g.DrawRectangle(pen, rect);
|
|
pen.Dispose();
|
|
}
|
|
}
|
|
|
|
private void TransGrid(Graphics g, Rectangle p_rec, PointF p_scaleXY)
|
|
{
|
|
if (!p_scaleXY.IsEmpty)
|
|
{
|
|
g.ScaleTransform(p_scaleXY.X, p_scaleXY.Y);
|
|
}
|
|
}
|
|
|
|
private void ResetTransGrid()
|
|
{
|
|
}
|
|
|
|
protected void DrawGridLine(Graphics g, Rectangle p_rec, Pen p_pen, string[,] arrStrGrid, int p_rowHeight, int[] p_arrColsWidth, GridLineFlag p_gridLineFlag, GridBorderFlag p_gridBorderFlag, PointF p_scaleXY, GridMergeFlag gridMergeFlag)
|
|
{
|
|
Rectangle rectangle = new Rectangle(p_rec.X, p_rec.Y, p_rec.Width, p_rec.Height);
|
|
int length = arrStrGrid.GetLength(0);
|
|
int length2 = arrStrGrid.GetLength(1);
|
|
if (gridMergeFlag == GridMergeFlag.None)
|
|
{
|
|
this.DrawGridLine(g, rectangle, p_pen, length, length2, p_rowHeight, p_arrColsWidth, p_gridLineFlag, p_gridBorderFlag, p_scaleXY);
|
|
}
|
|
else if (p_gridLineFlag != GridLineFlag.None)
|
|
{
|
|
this.TransGrid(g, rectangle, p_scaleXY);
|
|
int[] array = new int[length2];
|
|
for (int i = 0; i < length; i++)
|
|
{
|
|
int num = rectangle.X;
|
|
int num2 = rectangle.Y;
|
|
for (int j = 0; j < length2; j++)
|
|
{
|
|
int x = num + p_arrColsWidth[j];
|
|
num2 = rectangle.Y + p_rowHeight * i;
|
|
int num3 = num2;
|
|
if (i > 0)
|
|
{
|
|
switch (gridMergeFlag)
|
|
{
|
|
case GridMergeFlag.None:
|
|
g.DrawLine(p_pen, num, num2, x, num3);
|
|
break;
|
|
case GridMergeFlag.Row:
|
|
g.DrawLine(p_pen, num, num2, x, num3);
|
|
break;
|
|
case GridMergeFlag.Col:
|
|
if (arrStrGrid[i, j] == "" || arrStrGrid[i, j] != arrStrGrid[i - 1, j])
|
|
{
|
|
g.DrawLine(p_pen, num, num2, x, num3);
|
|
}
|
|
break;
|
|
case GridMergeFlag.Any:
|
|
if (arrStrGrid[i, j] == "" || arrStrGrid[i, j] != arrStrGrid[i - 1, j])
|
|
{
|
|
g.DrawLine(p_pen, num, num2, x, num3);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
if (j > 0)
|
|
{
|
|
num3 += p_rowHeight;
|
|
x = num;
|
|
switch (gridMergeFlag)
|
|
{
|
|
case GridMergeFlag.None:
|
|
g.DrawLine(p_pen, num, num2, x, num3);
|
|
break;
|
|
case GridMergeFlag.Row:
|
|
if (arrStrGrid[i, j] == "" || arrStrGrid[i, j] != arrStrGrid[i, j - 1])
|
|
{
|
|
g.DrawLine(p_pen, num, num2, x, num3);
|
|
}
|
|
break;
|
|
case GridMergeFlag.Col:
|
|
g.DrawLine(p_pen, num, num2, x, num3);
|
|
break;
|
|
case GridMergeFlag.Any:
|
|
if (arrStrGrid[i, j] == "" || arrStrGrid[i, j] != arrStrGrid[i, j - 1])
|
|
{
|
|
g.DrawLine(p_pen, num, num2, x, num3);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
num += p_arrColsWidth[j];
|
|
}
|
|
}
|
|
if (p_gridBorderFlag != GridBorderFlag.None)
|
|
{
|
|
this.DrawGridBorder(g, rectangle, p_pen, p_gridBorderFlag);
|
|
}
|
|
this.ResetTransGrid();
|
|
}
|
|
}
|
|
|
|
protected void DrawGridText(Graphics g, Rectangle p_rec, Brush p_brush, string[,] arrStrGrid, int p_rowHeight, int[] p_arrColsWidth, string alignment, Font p_font, PointF p_scaleXY, GridMergeFlag gridMergeFlag)
|
|
{
|
|
if (gridMergeFlag == GridMergeFlag.None)
|
|
{
|
|
this.DrawGridText(g, p_rec, p_brush, arrStrGrid, p_rowHeight, p_arrColsWidth, alignment, p_font, p_scaleXY);
|
|
}
|
|
else
|
|
{
|
|
try
|
|
{
|
|
Rectangle p_rec2 = new Rectangle(p_rec.X, p_rec.Y, p_rec.Width, p_rec.Height);
|
|
Font font = p_font;
|
|
if (font == null)
|
|
{
|
|
font = new Font("宋体", 12f);
|
|
}
|
|
int length = arrStrGrid.GetLength(0);
|
|
int length2 = arrStrGrid.GetLength(1);
|
|
int[] array = new int[length2];
|
|
AlignFlag[] colsAlign = this.GetColsAlign(alignment);
|
|
this.TransGrid(g, p_rec2, p_scaleXY);
|
|
StringFormat stringFormat = new StringFormat();
|
|
stringFormat.LineAlignment = StringAlignment.Center;
|
|
stringFormat.FormatFlags = StringFormatFlags.LineLimit;
|
|
CellRectangle mergeCell = new CellRectangle(p_rec2.X, p_rec2.Y, 0, p_rowHeight);
|
|
for (int i = 0; i < length; i++)
|
|
{
|
|
for (int j = 0; j < length2; j++)
|
|
{
|
|
mergeCell = this.GetMergeCell(new Point(p_rec2.X, p_rec2.Y), arrStrGrid, p_rowHeight, p_arrColsWidth, i, j, gridMergeFlag);
|
|
Rectangle r = new Rectangle(mergeCell.Left, mergeCell.Top, mergeCell.Width, mergeCell.Height + 4);
|
|
stringFormat.Alignment = StringAlignment.Near;
|
|
if (colsAlign.Length > j)
|
|
{
|
|
if (colsAlign[j] == AlignFlag.Center)
|
|
{
|
|
stringFormat.Alignment = StringAlignment.Center;
|
|
}
|
|
else if (colsAlign[j] == AlignFlag.Right)
|
|
{
|
|
stringFormat.Alignment = StringAlignment.Far;
|
|
}
|
|
}
|
|
g.DrawString(arrStrGrid[i, j], font, p_brush, r, stringFormat);
|
|
}
|
|
}
|
|
this.ResetTransGrid();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message);
|
|
}
|
|
finally
|
|
{
|
|
}
|
|
}
|
|
}
|
|
|
|
protected virtual CellRectangle GetMergeCell(Point GridLocation, string[,] arrStrGrid, int rowHeight, int[] ArrColWidth, int rowSel, int colSel, GridMergeFlag gridMergeFlag)
|
|
{
|
|
CellRectangle result = new CellRectangle(0, 0, 0, 0);
|
|
int length = arrStrGrid.GetLength(0);
|
|
int length2 = arrStrGrid.GetLength(1);
|
|
int num = 1;
|
|
int num2 = 1;
|
|
int num3 = rowSel;
|
|
int num4 = rowSel;
|
|
int num5 = colSel;
|
|
int num6 = colSel;
|
|
if (gridMergeFlag == GridMergeFlag.Any || gridMergeFlag == GridMergeFlag.Col || gridMergeFlag == GridMergeFlag.ColDependOnBeforeGroup)
|
|
{
|
|
for (int i = rowSel - 1; i >= 0; i--)
|
|
{
|
|
if (!(arrStrGrid[rowSel, colSel] == arrStrGrid[i, colSel]))
|
|
{
|
|
break;
|
|
}
|
|
num++;
|
|
num3--;
|
|
}
|
|
for (int i = rowSel + 1; i < length; i++)
|
|
{
|
|
if (!(arrStrGrid[rowSel, colSel] == arrStrGrid[i, colSel]))
|
|
{
|
|
break;
|
|
}
|
|
num++;
|
|
num4++;
|
|
}
|
|
}
|
|
if (gridMergeFlag == GridMergeFlag.Any || gridMergeFlag == GridMergeFlag.Row)
|
|
{
|
|
for (int j = colSel - 1; j >= 0; j--)
|
|
{
|
|
if (!(arrStrGrid[rowSel, colSel] == arrStrGrid[rowSel, j]))
|
|
{
|
|
break;
|
|
}
|
|
num2++;
|
|
num5--;
|
|
}
|
|
for (int j = colSel + 1; j < length2; j++)
|
|
{
|
|
if (!(arrStrGrid[rowSel, colSel] == arrStrGrid[rowSel, j]))
|
|
{
|
|
break;
|
|
}
|
|
num2++;
|
|
num6++;
|
|
}
|
|
}
|
|
int num7 = GridLocation.X;
|
|
int cellTop = GridLocation.Y + num3 * rowHeight;
|
|
int num8 = 0;
|
|
for (int k = num5 - 1; k >= 0; k--)
|
|
{
|
|
num7 += ArrColWidth[k];
|
|
}
|
|
for (int k = num5; k <= num6; k++)
|
|
{
|
|
num8 += ArrColWidth[k];
|
|
}
|
|
int cellHeight = num * rowHeight;
|
|
result = new CellRectangle(num7, cellTop, num8, cellHeight);
|
|
return result;
|
|
}
|
|
}
|
|
}
|