专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »C语言教程 » 行式打印机:Windows下实时行式打印系统设计(3) »正文

行式打印机:Windows下实时行式打印系统设计(3)

来源: 发布时间:星期四, 2008年9月25日 浏览:31次 评论:0
统的打印驱动,必须遵守本系统的规范,就是新的打印机驱动必须从基类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 =“\\x1b\\x5b\\x4d\\x01\\x00\\x30”;

//打印控制代码

i++;

//其他的颜色控制代码和其他打印机行为的控制代码

m_pResetPrintStream.cs=“\\x1b\\x43\\x1\\x1b\\x41\\x1”;

//初始化打印机的控制代码

m_pResetPrintStream.len=6;

//设置图形模式等其他功能的打印机控制代码

}

如果该打印机的某些打印行为比较特殊,在此只需要重载相应的虚函数,比如BJC5500的打印图形的点阵信息比较特殊,在此重载了PrintGraphDotArray,限于篇幅,不再给出其实现。

通过以上代码,可以完成打印机驱动程序,同时又保证了程序接口的一致,实现了实时打印操作的设备无关性。

加入新的打印驱动程序

在系统的打印统一驱动层部分,有一个与该部分相关的配置文件PrinterDrive.ini,当安装一个打印驱动时,将会增加一个“Printer*Cfg”设置项,“*”表示1,2……相关设置项如下:

[SystemCfg]

DefalutPrinter=Canon_Bjc5500

;缺省打印机

[Printer1Cfg]

Name=Canon_Bjc5500

DriveFile=c:\\RealPrt\\Drive\\Bjc5500.dll

;打印机的设备驱动程序

[Printer2Cfg]

;其他打印驱动的设置

打印统一驱动层将读取该配置并分析内容,然后使用LoadLibray和GetProcAddress动态创建该打印驱动引擎(即一个指向GeneralPrinter 的类指针),加载安装的驱动程序。

部分代码如下(其中g_pUnionPrintSystemEng是打印统一驱动引擎的指针):

typedef void* (*GetGeneralPrinterenginer_Func)(void);

GeneralPrinter *pPrtEng;

GetGeneralPrinterenginer_Func pFunc;

hHandle=LoadLibrary(“c:\\RealPrt\\Drive\\Bjc5500.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上的实现等等。这些都是可行的,最终以求得实现一个完美的实时行式打印系统。

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: