Windows下实时行式打印系统设计
2010-05-25 20:36:34 来源:WEB开发网驱动程序的编写实例
要实现本系统的打印驱动,必须遵守本系统的规范,就是新的打印机驱动必须从基类GeneralPrinter派生出来,然后再将各种数据实例化,这样才能保证设备的无关性。下面以佳能的BJC5500彩色喷墨打印机为例说明驱动程序的编写方法。
class Printer_BJC5500 : public GeneralPrinter {
public:
PRINTCOLOR m_AllColor[BJC5500_PRT_
COLOR_NUM];
public:
Printer_BJC5500 (char *szPort);
~Printer_BJC5500 ();
virtual int PrintGraphDotArray(char * pData,int iDataLen);
};
//只需要在构造函数中将各种数据实例化即可
Printer_BJC5500 ::Printer_BJC5500 (char *szPort){
strcpy(szPrinterName,“BJC5500”);
//赋予该打印机的惟一标志名字
m_iPrtColorNum = 7;
//BJC5500能够支持7种颜色
m_pColor = &m_AllColor[0];
//获得BJC5500打印机颜色控制代码的首地址
m_bDirectPrintHz=FALSE;
//BJC5500不带汉字的硬字库,因而不支持汉字的直接打印,需要提取汉字的打印点阵信息,然后在打印机的图形模式下进行汉字的打印
int i=0;
int cslen = 6;
//黑颜色的打印控制代码
m_AllColor[i].szColorName =“黑色”;
//颜色的名字
m_AllColor[i].iControlStrLen =cslen;
//打印控制代码的长度
m_AllColor[i].szControlStr =“x1bx5bx4dx01x00x30”;
//打印控制代码
i++;
//其他的颜色控制代码和其他打印机行为的控制代码
m_pResetPrintStream.cs=“x1bx43x1x1bx41x1”;
//初始化打印机的控制代码
m_pResetPrintStream.len=6;
//设置图形模式等其他功能的打印机控制代码
}
如果该打印机的某些打印行为比较特殊,在此只需要重载相应的虚函数,比如BJC5500的打印图形的点阵信息比较特殊,在此重载了PrintGraphDotArray,限于篇幅,不再给出其实现。
通过以上代码,可以完成打印机驱动程序,同时又保证了程序接口的一致,实现了实时打印操作的设备无关性。
加入新的打印驱动程序
在系统的打印统一驱动层部分,有一个与该部分相关的配置文件PrinterDrive.ini,当安装一个打印驱动时,将会增加一个“Printer*Cfg”设置项,“*”表示1,2……相关设置项如下:
[SystemCfg]
DefalutPrinter=Canon_Bjc5500
;缺省打印机
[Printer1Cfg]
Name=Canon_Bjc5500
DriveFile=c:RealPrtDriveBjc5500.dll
;打印机的设备驱动程序
[Printer2Cfg]
;其他打印驱动的设置
打印统一驱动层将读取该配置并分析内容,然后使用LoadLibray和GetProcAddress动态创建该打印驱动引擎(即一个指向GeneralPrinter 的类指针),加载安装的驱动程序。
部分代码如下(其中g_pUnionPrintSystemEng是打印统一驱动引擎的指针):
typedef void* (*GetGeneralPrinterenginer_Func)(void);
GeneralPrinter *pPrtEng;
GetGeneralPrinterenginer_Func pFunc;
hHandle=LoadLibrary(“c:RealPrtDriveBjc5500.dll”);
if(hHandle ) {
pFunc=(GetGeneralPrinterenginer_Func )GetProcAddress(hHandle,“GetGeneralPrinterEnginer”);
if(pFunc)
V pPrtEng =(GeneralPrinter *)(*pFunc)();
if(pPrtEng)
g_pUnionPrintSystemEng->LoadPrinterDriver(pPrtEng);
/*在此将打印驱动程序装入系统中*/
}
通过这种方法,我们可以将新的打印驱动装入实时打印系统,实现设备无关性。
总 结
本打印系统主要设计了以下几个类:
● RealTimePrintSystemClnt: 提交打印操作请求,供打印实时信息的应用程序调用的封装类。
● RealTimePrintSystemServ: 响应打印操作请求,供实时打印系统进程使用的封装类。
● UnionPrintSystem: 打印统一驱动层的封装类。
● GeneralPrinter: 打印机驱动的基类。
● Printer_BJC5500: 佳能BJC5500彩色喷墨打印机驱动的封装类。
● HZDotArrayFont: 汉字字符的打印点阵信息提取器的封装类。
通过以上几个类,我们成功地建立了一个实时行式打印系统,同时又实现了打印设备的无关性,使应用不需随打印机的更改而改变。其中有许多技术细节,限于篇幅,在此没有提供完整的实现方法,但是基本的技术框架和重要的技术细节完全具备,读者可以在此基础上进行详细编码以实现系统。
读者也可以在此基础之上进行扩展,构建一个客户/服务器模式的分布式实时打印系统,因为该系统架构就是一个Client/Server 模式。还可以考虑规定打印优先级,将不同的打印信息送到不同的打印机上,也可以考虑Unix上的实现等等。这些都是可行的,最终以求得实现一个完美的实时行式打印系统。
更多精彩
赞助商链接