/// <summary> /// 画网格线,标准备的横竖线交叉的线 /// </summary> /// <param name="g">绘图表面</param> /// <param name="p_rec">绘图区</param> /// <param name="p_pen">绘图线的笔,可以定义颜色与线宽</param> /// <param name="arrStrGrid">二维数组,对应了网格行、列数</param> /// <param name="p_rowHeight">行高</param> /// <param name="p_arrColsWidth">列宽</param> /// <param name="p_gridLineFlag">网格线类型</param> /// <param name="p_gridBorderFlag">边框类型</param> /// <param name="p_scaleXY">水平与垂直方向缩放量</param> /// <remarks> /// 作 者:周方勇 /// 修改日期:2004-08-07 /// </remarks> 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 lngRows = arrStrGrid.GetLength(0); //行数 int lngCols = arrStrGrid.GetLength(1); //列数 DrawGridLine(g, p_rec, p_pen, lngRows, lngCols, p_rowHeight, p_arrColsWidth, p_gridLineFlag, p_gridBorderFlag, p_scaleXY); }
private Top _top; //��һ�����д�ӡ��ʽ,��һ�о���,�����о���,�м��о��� #endregion Fields #region Constructors //�����Խ��˳�������,��һ���������,��̬���ش�ӡ����,�γ�����������������,��ӡ���⸴�ӵ����� public MisPrinter() { mCurrentPageIndex = 1; _rowsPerPage = 0; mCurrentRowIndex = 0; mCurrentRowIndexForFooter = 0; _isSewingLine = false; _isPrinterMargins = false; _isSubTotalPerPage = false; _subTotalCol = ""; _sewing = new Sewing(0,SewingDirectionFlag.Left); mPrintDocument = new PrintDocument(); _body = new Body(); //��Ҫ��������ʵ���� _gridBorder = GridBorderFlag.Double; }
} //End Function #endregion #region protected void DrawGridBorder(Graphics g,Rectangle rec,Pen p_pen,GridBorderFlag p_gridBorderFlag) /// <summary> /// 绘制网格边框 /// </summary> /// <param name="g"></param> /// <param name="rec"></param> /// <param name="p_gridBorderFlag"></param> protected void DrawGridBorder(Graphics g, Rectangle rec, Pen p_pen, GridBorderFlag p_gridBorderFlag) { //无边框就退出 if (p_gridBorderFlag == GridBorderFlag.None) { return; } float penwidth = 1F; //笔宽 int movXY = 0; //根据笔的粗细要相应的调整矩形 switch (p_gridBorderFlag) { case GridBorderFlag.Single: break; case GridBorderFlag.SingleBold: penwidth = 2F; break; case GridBorderFlag.Double: //双线内边框 g.DrawRectangle(p_pen, rec); movXY = 2; break; case GridBorderFlag.DoubleBold: //双线内边框 g.DrawRectangle(p_pen, rec); penwidth = 2F; movXY = 3; break; } Pen pen = (Pen) (p_pen.Clone()); pen.Width = penwidth; //g.DrawRectangle(pen,rec); Rectangle recBorder = rec; recBorder.X = rec.X - movXY; recBorder.Y = rec.Y - movXY; recBorder.Width = rec.Width + movXY*2; recBorder.Height = rec.Height + movXY*2; //外边框 g.DrawRectangle(pen, recBorder); pen.Dispose(); }
/// <summary> /// 画网格线,根据合并方式判断相邻单元格内容一格一格的画 /// </summary> /// <param name="g">绘图表面</param> /// <param name="p_rec">绘图区</param> /// <param name="p_pen">绘图线的笔,可以定义颜色与线宽</param> /// <param name="arrStrGrid">二维数组</param> /// <param name="p_rowHeight">行高</param> /// <param name="p_arrColsWidth">列宽</param> /// <param name="p_gridLineFlag">网格线类型</param> /// <param name="p_gridBorderFlag">边框类型</param> /// <param name="p_scaleXY">水平与垂直方向缩放量</param> /// <param name="gridMergeFlag">网格单元格合并方式</param> /// <remarks> /// 作 者:周方勇 /// 修改日期:2004-08-07 /// </remarks> 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 rec = new Rectangle(p_rec.X, p_rec.Y, p_rec.Width, p_rec.Height); int lngRows = arrStrGrid.GetLength(0); //行数 int lngCols = arrStrGrid.GetLength(1); //列数 //网格不合并直接画标准网格线,否则一个单元格一个单元格的画 if (gridMergeFlag == GridMergeFlag.None) { this.DrawGridLine(g, rec, p_pen, lngRows, lngCols, p_rowHeight, p_arrColsWidth, p_gridLineFlag, p_gridBorderFlag, p_scaleXY); return; } else { #region 有网格线才画 if (p_gridLineFlag != GridLineFlag.None) { //变换 this.TransGrid(g, rec, p_scaleXY); //起止坐标 int X1, X2, Y1, Y2; //列宽 int[] mArrColWidth = new int[lngCols]; mArrColWidth = p_arrColsWidth; #region 画单元格线 //边界不画 for (int i = 0; i < lngRows; i++) { X1 = rec.X; Y1 = rec.Y; for (int j = 0; j < lngCols; j++) { //-----水平线----- X2 = X1 + mArrColWidth[j]; Y1 = rec.Y + p_rowHeight*i; //****可用行高数组 Y2 = Y1; //画第二行开始及以下的横线,当前行与上一行文本不同 if (i > 0) { switch (gridMergeFlag) { case GridMergeFlag.None: //无合并,直接画线 g.DrawLine(p_pen, X1, Y1, X2, Y2); break; case GridMergeFlag.Row: //仅行上相邻列相同就合并,即合并列 //画线(条件:无条件,只要是行上进行列合并,水平线肯定画) g.DrawLine(p_pen, X1, Y1, X2, Y2); break; case GridMergeFlag.Col: //仅列上相邻行相同就合并,即合并列 //画线(条件:此列不合并 || 文本空 || 当前行与上一行文本不同) if (arrStrGrid[i, j] == "" || arrStrGrid[i, j] != arrStrGrid[i - 1, j]) { g.DrawLine(p_pen, X1, Y1, X2, Y2); } break; case GridMergeFlag.Any: //任意合并,只要相邻单元格内容不同就画线,即只要相邻单元格内容相同就合并 //画线(条件: 文本空 || 当前行与上一行文本不同) if (arrStrGrid[i, j] == "" || arrStrGrid[i, j] != arrStrGrid[i - 1, j]) { g.DrawLine(p_pen, X1, Y1, X2, Y2); } break; } } //-----'竖线----- //画第二列以后的竖线,当前列与上一列比较 if (j > 0) { Y2 = Y2 + p_rowHeight; //****可用行高数组 X2 = X1; switch (gridMergeFlag) { case GridMergeFlag.None: //无合并,直接画线 g.DrawLine(p_pen, X1, Y1, X2, Y2); break; case GridMergeFlag.Row: //仅行上相邻列相同就合并,即合并列 //画线(条件:此行不合并 || 文本空 || 当前列与上一列文本不同) if (arrStrGrid[i, j] == "" || arrStrGrid[i, j] != arrStrGrid[i, j - 1]) { g.DrawLine(p_pen, X1, Y1, X2, Y2); } break; case GridMergeFlag.Col: //仅列上相邻行相同就合并,即合并列 //画线(条件:无,列竖线要画) g.DrawLine(p_pen, X1, Y1, X2, Y2); break; case GridMergeFlag.Any: //任意合并,只要相邻单元格内容不同就画线,即只要相邻单元格内容相同就合并 //画线(条件: 文本空 || 当前行与上一行文本不同) if (arrStrGrid[i, j] == "" || arrStrGrid[i, j] != arrStrGrid[i, j - 1]) { g.DrawLine(p_pen, X1, Y1, X2, Y2); } break; } } //下一列,宽加上 X1 += mArrColWidth[j]; } //End For 列 } //End For 行 #endregion //******边框****** if (p_gridBorderFlag != GridBorderFlag.None) { this.DrawGridBorder(g, rec, p_pen, p_gridBorderFlag); } //重置,不再变换 this.ResetTransGrid(); } //End If #endregion } //End If } //End Function
/// <summary> /// 画网格线,标准备的横竖线交叉的线 /// </summary> /// <param name="g">绘图表面</param> /// <param name="p_rec">绘图区</param> /// <param name="p_pen">绘图线的笔,可以定义颜色与线宽</param> /// <param name="p_rows">行数</param> /// <param name="p_cols">列数</param> /// <param name="p_rowHeight">行高</param> /// <param name="p_arrColsWidth">列宽</param> /// <param name="p_gridLineFlag">网格线类型</param> /// <param name="p_gridBorderFlag">边框类型</param> /// <param name="p_scaleXY">水平与垂直方向缩放量</param> /// <remarks> /// 作 者:周方勇 /// 修改日期:2004-08-07 /// </remarks> 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 rec = new Rectangle(p_rec.X, p_rec.Y, p_rec.Width, p_rec.Height); //缩放程序 this.TransGrid(g, rec, p_scaleXY); #region 有网格线才画 if (p_gridLineFlag != GridLineFlag.None) { int lngRows = p_rows; //arrStrGrid.GetLength(0); //行数,也可由二维数组算出 int lngCols = p_cols; //arrStrGrid.GetLength(1); //列数 int lngRowIndex; //当前行 int lngColIndex; //当前列 //起止坐标 int X1, X2, Y1, Y2; int lngLineLen; //线长 int lngLineHei; //线高 //计算坐标、线长、线高 lngLineLen = rec.Width; lngLineHei = rec.Height; #region 包括横线就画 if (p_gridLineFlag == GridLineFlag.Horizontal || p_gridLineFlag == GridLineFlag.Both) { //******先画横线****** X1 = rec.X; Y1 = rec.Y; X2 = X1 + lngLineLen; //最上边与最下边的线不画 for (lngRowIndex = 1; lngRowIndex < lngRows; lngRowIndex++) { Y1 += p_rowHeight; //这里可以换成行高数组 //Y1 += p_arrRowsWidth[lngRowIndex - 1];//这里可以换成行高数组 Y2 = Y1; g.DrawLine(p_pen, X1, Y1, X2, Y2); } } #endregion #region 包括竖线就画 if (p_gridLineFlag == GridLineFlag.Vertical || p_gridLineFlag == GridLineFlag.Both) { //******再画竖线****** //列宽 int[] mArrColWidth = new int[lngCols]; mArrColWidth = p_arrColsWidth; //Y不变 X1 = rec.X; Y1 = rec.Y; Y2 = Y1 + lngLineHei; //最左边与右边的线不画 for (lngColIndex = 0; lngColIndex < lngCols - 1; lngColIndex++) { X1 += mArrColWidth[lngColIndex]; X2 = X1; g.DrawLine(p_pen, X1, Y1, X2, Y2); } } #endregion } //End If #endregion //******边框****** if (p_gridBorderFlag != GridBorderFlag.None) { this.DrawGridBorder(g, rec, p_pen, p_gridBorderFlag); } //重置,不再变换 this.ResetTransGrid(); }