分享
 
 
 

.Net环境下有关打印页面设置、打印机设置、打印预览对话框的实现

王朝c#·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

我个人认为,开发MIS,首先就得解决网格的问题,而开发工具为我们提供了如DataGrid、MSHFlexGrid的控件。其次,是打印的问题,将业务单据与数据报表打印出来。可想而知,即使一个业务功能非常完美齐全的管理软件,没有打印的支持,也一定不算是一个完整的软件。

对于打印,我们总是在用户打印之前可以看看打印的效果,这时,一般的软件都提供了打印预览;如果需要调整打印的效果如纸张的大小、边距的设置,又提供了页面设置对话框让用户选择和调整;如果系统有多个打印机,当用户单击打印按钮时还可以选择输出的对象。

总之,对于打印,我们至少要提供打印页面设置、打印机设置、打印预览对话框,让用户有更多的机会参与交互。这一些,是一个打印模块比较重要也比较基本的东西,让我们一起来实现它们吧。

进入Vs2003 IDE,从文件菜单上单击新建项目,项目类型为C#,在模板中选择类库,名称估且叫GoldPrinter,确定即可。在打开的开发环境中,删除解决方案资源管理器中默认生成的Class1.cs。

现在,我们要考虑一下,对于打印,可能是在Windows下,也可能是Web下。如果将两者的方法统一起来,让调用者不用操心是什么方式下那该多好啊。因此,我们首先设计一个接口,提供两者共用的方法。

在项目上鼠标右键单击后添加一个新类,名称为:IPrinterPageSetting,由于是接口,将class改为interface,并去掉构造函数。看上去应类似如下:

using System;

namespace GoldPrinter

{

/// <summary>

/// IPrinterPageSetting 的摘要说明。

/// </summary>

public class IPrinterPageSetting

{

}

}

方法中至少包含三个声明即ShowPageSetupDialog()、ShowPrintSetupDialog()、ShowPrintPreviewDialog(),也就是打开打印页面设置、打印机设置、打印预览对话框。

Vs2003为我们提供了一个PrintDocument,名字空间是System.Drawing.Printing。PrintDocument是为打印而提供的一个类,它的概述(summary)是这样的:定义一个可再次使用的对象,该对象将输出发送到打印机。

PrintDocument为我们封装了很多复杂的细节,它有一个至关重要的事件叫PrintPage,PrintPage的概述是:当需要为当前页打的输出时发生。因此,我们只要引发了打印事件,把打印的具体输出的对象交给PrintPage,别的我们就不用操心了。

那么,我们怎么实现具体输出的过程呢?由于是封装,我们也不可能知道最终用户具体怎么去实现,这时,委托(Delegate)为我们起了大的作用。大家都知道一个函数实现某个功能的时候往往需要一些输入的数据,但是函数本身并不知道这些数据到底是哪个具体的值,只知道这个值的数据类型,这时引入了参数,调用者调用函数据的时候传入相应类型的具体值就行了。大家应该意识到了我的用意,与函数类似,我们为打印提供了关联打印机的方法,但是具体的实现只有由调用者去实现,不同之处是函数传递的是参数,而我们要做的委托传递的是方法。这时,我们只要为两者建立对应关系就可以了,这就是委托。我们需要定义一个委托,参数类型与PrintPage的一致就可以了,即(Object obj,System.Drawing.Printing.PrintPageEventArgs ev)。

由此可见,我们需要做下面的一些事情:

1、在项目的引用处添加引用,在弹出的对话框的.NET标签中选择System.Drawing.dll,

原因是PrintDocument的名字空间是System.Drawing.Printing,在System.Drawing.dll实现;

2、在IPrinterPageSetting接口中增加PrintDocument属性的声明;

3、定义委托

4、在IPrinterPageSetting接口中增加PrintPage属性的声明,类型为定义的委托;

以下是IPrinterPageSetting接口文件内容:

using System;

using System.Drawing;

using System.Drawing.Printing;

namespace GoldPrinter

{

/// <summary>

/// PrintDocument.PrintPage的委托定义

/// </summary>

public delegate void PrintPageDelegate(Object obj,System.Drawing.Printing.PrintPageEventArgs ev) ;

/// <summary>

/// IPrinterPageSetting 的接口,显示打印纸张设置、打印机设置、打印预览对话框。

/// 程序提供:周方勇;Email:flygoldfish@sina.com

/// </summary>

public interface IPrinterPageSetting

{

/// <summary>

/// 获取或设置打印文档

/// </summary>

System.Drawing.Printing.PrintDocument PrintDocument

{

get;

set;

}

/// <summary>

/// 关联一个方法,目的是让具体的打印由实例化者来操作

/// 如PrinterPageSetting1.PrintPage += new PrintPageDelegate(this.PrintPageEventHandler);

/// </summary>

PrintPageDelegate PrintPage

{

get;

set;

}

/// <summary>

/// 显示页面设置对话框,并返回PageSettings

/// </summary>

/// <returns></returns>

System.Drawing.Printing.PageSettings ShowPageSetupDialog();

/// <summary>

/// 显示打印机设置对话框,并返回PrinterSettings

/// </summary>

/// <returns></returns>

System.Drawing.Printing.PrinterSettings ShowPrintSetupDialog();

/// <summary>

/// 显示打印预览对话框

/// </summary>

void ShowPrintPreviewDialog();

}//End Interface

}//End NameSpace

下面,我们以Windows下的编程方式实现,同时也列Web编程下的框架。由于是Windows下的编程,我们可能用到对话框什么的作为错误提示,因此,我们同理要加入System.Windows.Forms.dll引用。再建立一个类文件,名称为WinPrinterPageSetting。进入文件后,在类声明后面加上:IPrinterPageSetting,实现接口功能。程序清单如下,程序中有很多注释,这里不再多说。

using System;

using System.Drawing;

using System.Drawing.Printing;

using System.Windows.Forms;

namespace GoldPrinter

{

/// <summary>

/// WinForm下的打印纸张设置、打印机设置、打印预览对话框。

/// </summary>

public class WinPrinterPageSetting:IPrinterPageSetting

{

//把PrintPage委托声明为类的一个成员变量

private PrintPageDelegate _printPage;

// 打印文档

private PrintDocument _printDocument;

#region 构造函数

public WinPrinterPageSetting():this(null)

{

}

/// <summary>

/// 使用printDocument来初始化类的新实例,当printDocument为null时自动创建一个printDocument的实例

/// </summary>

/// <param name="printDocument"></param>

public WinPrinterPageSetting(PrintDocument printDocument)

{

if (printDocument != null)

{

_printDocument = printDocument;

}

else

{

_printDocument = new PrintDocument();

}

}

#endregion

#region IPrinterPageSetting 成员

/// <summary>

/// 获取或设置打印文档

/// </summary>

public PrintDocument PrintDocument

{

get

{

return this._printDocument;

}

set

{

this._printDocument = value;

}

}

/// <summary>

/// 一定要实例化此类后在调用打印/预览之前设置此属性,使之关联一个方法,目的是让具体的打印由实例化者来操作

/// 如PrinterPageSetting1.PrintPage += new PrintPageDelegate(this.PrintPageEventHandler);

/// </summary>

public PrintPageDelegate PrintPage

{

set

{

//初始委托变量,关联方法

_printPage = value;

if (_printDocument==null)

{

throw new Exception("关联的打印文档不能为空!");

}

_printDocument.PrintPage +=new System.Drawing.Printing.PrintPageEventHandler(this._printPage);

}

get

{

return _printPage;

}

}

/// <summary>

/// 显示页面设置对话框,并返回PageSettings

/// </summary>

/// <returns></returns>

public PageSettings ShowPageSetupDialog()

{

return ShowPageSetupDialog(this._printDocument);

}

/// <summary>

/// 显示打印机设置对话框,并返回PrinterSettings

/// </summary>

/// <returns></returns>

public PrinterSettings ShowPrintSetupDialog()

{

return ShowPrintSetupDialog(this._printDocument);

}

/// <summary>

/// 显示打印预览对话框

/// </summary>

public void ShowPrintPreviewDialog()

{

ShowPrintPreviewDialog(this._printDocument);

}

#endregion

//***************注意:以下几个对话框方法可以独立使用***************

#region 页面设置对话框 protected virtual PageSettings ShowPageSetupDialog(PrintDocument printDocument)

/// <summary>

/// 页面设置对话框,可以独立使用

/// </summary>

/// <param name="printDocument"></param>

/// <returns></returns>

/// <remarks>

/// 作 者:周方勇

/// 修改日期:2004-08-07

/// </remarks>

protected virtual PageSettings ShowPageSetupD

[1] [2] [3] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有