基于.NET的自定义打印功能设计与实现

时间:2022-07-31 10:58:20

基于.NET的自定义打印功能设计与实现

摘要:打印功能是绝大部分软件项目中必不可以少的功能,该文从原理的角度介绍了通用打印模块的设计方法。如果读者能熟练地掌握这一设计原理,相信很快就可以设计出自已所需要的报表,用其它开发语言工具,也可以很快设计出自已所需要的打印模块。

关键词:打印模块;自定义;.NET

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2009)05-1093-03

Design and Implementation of Custom Printing Function Based on .NET

DU Cheng-long

(Hubei Professional College of Land Resource, Jingzhou 434002, China)

Abstract: Printing function is the vast majority of software projects will not be less functionality, this article from the principle point of view introduced the general printing module design. If the skilled reader can grasp the principles of design, will soon be able to have been designed from the required statements, with the development of other language tools, you can quickly design the printing module required.

Key words: printing function; custom; .NET

1 引言

随着软件技术的发展,越来越多的新的或更先进的开发工具出现,软件开发也越来越方便。但先进的工具出现也使得很多开发者疲于学习更多新的东西。实际上,我们更赞同使用通用性较好的原理性的开发方法,只要熟练掌握并熟练实现,就不至于因工具的变化而干扰我们的工作思路。

打印功能很长时间都一直困绕着笔者,以至于笔者做软件时总觉得不完美,要么是设计的功能不好用,要么就是设计得不合要求,总是感觉到欠缺什么,后来究其原因,原来这实际上是没有真正掌握一种通用的好的设计方法所至,市面上又很少看到有关书籍介绍一种能快速地掌握自定义打印功能的方法。看到有些功能强大的打印设计软件,真想自已能拥有一套,但第三方提供商又要收取昂贵的使用费,心里真的很烦躁,相信做过软件的人都有这个感觉。笔者经过一段时间的浅心学习和研究,终于掌握了自定义打印功能的设计与实现方法,在此与大家共享,相信很多有此需求的人会受益非浅。

下面以.NET平台下C#语言为例,提出具体的设计方案,并以具体的实例说明实现方法,相信大家一定能据此触类旁通,很轻松地设计出自已所需要的自定义打印功能。

2 设计思路及分析

下面以库存商品为例讲解自定义打印向导及打印预览的实现,因自定义打印功能设计是通用的,所以如果要用在其它地方,只需改动一下输入条件即可使用。

设计效果及思路如下:

1) 点击如图1下的打印按钮后显示如图2对话框,这是向导对话框的第一步。

2) 如图2点击下一步后,会显示如图3对话框,这是向导对话框的第二步。

3) 如图3点击下一步后,会显示如图4的对话框,这是向导对话框的第三步。

4) 如图4 点击上一步后,会显示如图3第二步的对话框,可以对前面设置的内容进行修改。

5) 如图4点击完成之后,会显示如图5打印预览效果。

下面对以上操作的设计流程进行一下分析和说明:

首先是进行打印前数据的输入,由于本功能做成了通用模式,所以只需重新设置输入条件即可,那么本模块可以直接用在其它类似的打印模块中。

其次是进行打印前的标题及数据显示设置,当设置好所有的条件及数据之后,就可以实现打印功能了。

最后是实现打印功能,只要掌握如何编写在指定的位置绘制表格和文字的方法,即可很容易实现打印功能了。

3 关键技术设计与实现

要完整实现自定义打印功能,根据上面的设计主要包括数据输入部分、显示设置部分和打印预览部分。下面按实现方案分别讨论关键技术。

3.1 建立数据输入程序

1) 首先在设计之前要定义一个专门用于存储向导设置时的打印设置类,定义cReportInfo.cs文件,参考代码如下:

class cReportInfo{

public static string PrimaryTitle;//主标题

public static string SecondaryTitle;//副标题

public static string StartDate;//起始时间

public static string EndDate;//结束时间

public static string Comments;//附注

public static string Author;//制表人

public static string Date;//制表日期

public static ArrayList ReportColumns = new ArrayList();//所有的供选择的列名称

public static ArrayList ReportSelectColumns=new ArrayList();//已选择的列名称

//对标题进行初始化

public static void ClearTitle(){……}

//清空列名称

public static void ClearColumns(){……}

}

2) 下面是定义打印前的数据输入设置方法,如果用在其它地方,只需在此修改输入数据即可,当点击打印按钮后,就会进入向导过程,设计算法描述如下:

private void tlBtnPrint_Click(object sender, EventArgs e)

{ 清空打印设置类;

从数据显示控件获取所有供选择的列名称;

将数据显示控件作参数传给向导窗体(1);

将向导窗体(1)显示出来;

}

3) 向导窗体(1)主要是为了显示一些提示信息及准备一些必需的数据,显示时需要进行一些初始化,即要传入需要的参数。当在向导窗体(1)中,点击下一步按钮时,要打开向导窗体(2),并传入需要的参数,算法描述如下:

private void BtnNext_Click(object sender, EventArgs e){ 定义向导窗体(2)对象并传入参数;

显示向导窗体(2);}

数据输入程序的功能主要是获取即将显示的数据源问题,但这只是完成了第一步,下面是完成打印的设置问题。

3.2 建立显示设置程序

建立显示设置程序主要是为了确定打印显示的内容,此处实际上是设置cReportInfo类型的对象中的所有数据成员。

由于在每一步向导窗口显示本窗体时要将前阶段有效的数据传入,故要重载构造函数用于设置传入的参数。同时为了保存前阶段传入的数据设置,需要实现Load方法;

打印向导(2)和打印向导(3)窗体是显示设置的主要窗口,操作方便是这两个窗口要解决的首要任务,此界面功能设计很简单,在此不再阐述。

3.3 建立打印预览程序

建立打印预览程序是本功能模块的核心,实现打印功能最主要是掌握打印过程实现的原理及绘图方法。

当打印文档对象PrintDocument被调用时,会激活PrintPage事件,在此方法中就可以实现绘制报表的任务。算法描述如下:

private void pd_PrintPage(object sender,

System.Drawing.Printing.PrintPageEventArgs e)

{初始化变量;

try{

绘制机密;

绘制标题;

绘制副标题;

//绘制矩形表格及数据

//1.绘制列名称;

for (int col = 0; col < 所选择的列数;col++ )

{ 画列标题;}

yPos += 50;

//2.绘制多行数据

while (rowindex < 行数-1)

{获取整行最大的行高;

for (int col = 0; col

{ 绘制该行每个单元格的数据; }

yPos += rowHeight;

rowindex++;

if(当前高度大于底边界值)

{e.HasMorePages = true;//分页打印

return;

}

}

绘制附注;

绘制制表人;

绘制制表日期;

e.HasMorePages = false;//结束打印

}catch (System.Exception ex)

{错误提示;}

}

绘制思路确定下来后,下面主要是掌握绘制单元格的方法。不管是文字部分还是矩形框部分,统一绘制矩形框,然后中间填写文字内容。如果只写文字画空边即可,如果只画矩形框写空文字即可。我们把整个页面分割成了一个个小单元格之后,就可以任意的根据需要画矩形框了。下面自定义绘单元格的参考代码如下:

private void DrawCell(Graphics g,Rectangle r,string s,string fontName,int fontSize,StringAlignment hAlign,StringAlignment vAlign,bool bold)

{ try

{Pen p=new Pen(Brushes.Gray);

g.DrawRectangle(p,r);

Font oldFont=new Font(fontName,fontSize);

Font newFont=new Font(oldFont,bold?oldFont.Style|FontStyle.Bold:oldFont.Style);

StringFormat sf=new StringFormat();

sf.Alignment=hAlign;

sf.LineAlignment=vAlign;

g.DrawString(s,newFont,Brushes.Black,r,sf);(下转第1099页)

(上接第1095页)

}catch(Exception ex){错误提示; }

}

此处定义的绘单元格的方法基本可以通用,只需传入合适的参数就可以绘出所需要的单元格。如果想要画出更复杂的单元格,在此基础上添加内容即可。

4 结束语

打印功能是绝大部分软件项目中必不可以少的功能,但是市面上绝大部分相关资料上都很少有设计通用性较强的打印模块的介绍,如果读者能熟练地掌握这一设计原理,相信很快就可以设计出其它的报表,即使用其它开发工具,也可以很快设计出自已所需要的打印模块。

参考文献:

[1] 张跃廷.C#数据库系统开发完全手册[M].北京:人民邮电出版社,2006.

[2] 李继武.VisualC#.NET项目开发实战[M].北京:清华大学出版社,2007.

上一篇:基于图像处理的智能建筑中火灾探测技术研究 下一篇:英特尔大学科研合作计划