AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > VC编程

Windows下实时行式打印系统设计

51自学网 2015-08-30 http://www.wanshiok.com

 

首先,定义统一驱动部分,该部分主要完成以下功能:加载相应的具体打印机驱动程序,并负责将请求打印的字符信息翻译成不同打印机需要的打印点阵信息。

class UnionPrintSystem

{public:

GeneralPrinter *m_pPrinter;

//当前使用的打印机

GeneralPrinter *m_pDefaultPrinter;

//系统默认的打印机

GeneralPrinter *m_pPrinterSet[MAX_PRINTER_DRV_NUM];

//安装的所有打印机

HZDotArrayFont *m_pHzDAF;

//汉字字符的打印点阵信息提取器,可以提取多种打印字体的点阵信息,如24点阵楷体,48点阵宋体等

public:

//加载一个打印机驱动程序

void LoadPrinterDriver(GeneralPrinter *p);

//加载一个获取汉字打印点阵信息的驱动器

void LoadHzDAFDriver(HZDotArrayFont *p); //选择一个工作打印机

void SelectWorkPrinter(char *szPrinterName); //打印机控制

void SetColor(int id) {m_pPrinter->SetColor(id);};

//其他打印机控制函数

/*打印一个字符串,可以包括汉字字符,只要调用该函数就可以将信息打印出来*/

int PrintString(char *str,int len,char * ColorName=“黑色”);

};

最后是打印机驱动程序的设计,这里是设备无关性设计的关键所在。为满足系统设备无关性的要求,设计了一个包含各种基本打印动作的打印机基类,所有的打印机都从该基类派生出来。在打印机的基类中定义了打印机的各种控制代码、打印机的种种操作方法,在具体的打印机类中将它们实例化。代码如下:

class GeneralPrinter

{public :

/*PRINTCOLOR是事先定义好的打印机颜色结构,用来定义打印机每一种颜色的控制代码*/

PRINTCOLOR *m_pColor;

/*本打印机支持颜色的数量*/

int m_iPrtColorNum;

/*打印机是否支持汉字的直接打印,即该打印机本身是否带有汉字的打印字库,如果打印机不支持汉字的直接打印,汉字的打印点阵信息将由字库点阵信息提取器类负责获取。*/

BOOL m_bDirectPrintHz;

/*HPRINTHANDLE 是本系统事先定义好的打印机句柄结构,用来标识打印机的硬件端口,是数据输出到打印机的通道。*/

PRINTHANDLE m_hPrinter;

char m_szPrinterName[PRINTR_PORTNAME_MAX_LEN];

/*打印机名字,用来区别打印机的惟一标志*/

PRINTERCONTROLCODE ...;

/*PRINTERCONTROLCODE 是本系统事先定义好的打印机控制代码结构,用来控制打印机行为,如打印机初始化控制代码,打印机设置页长控制代码等打印机支持的方法。*/

public:

/*szPort是打印机所接端口的端口名字,如‘com1’,‘/dev/bbp0’等*/

GeneralPrinter(char *szPort);

~GeneralPrinter();

virtual void ResetPrinter();

/*打印机初始化的方法*/

virtual void SetAutoCRLF(int iAuto); /*设置打印机是否自动换行的方法,iAuto为1表示自动换行,为0则不自动换行*/

/*如果是彩色打印机的话,下面两个函数用来设置字符的打印颜色,szColorName是颜色的名字,如“黑色”,“红色”等,但必须是打印机支持的颜色。iColorId 颜色的Id值一般为0~7之间的值。*/

virtual void SetColor(char *szColorName);

virtual void SetColor(int iColorId);

/*将打印机设置为图形模式下的操作,iMode 表示不同的图形模式,如180×180等*/

virtual void SetGraphMode(int iMode);

/*用来打印字符串(包括汉字字符)的方法,iStrLen 表示字符串长度*/

virtual int PrintString(char * szStr,int iStrLen);

/*用来打印图形的点阵信息,pData存放图形的点阵信息,比如汉字的打印点阵等*/

virtual int PrintGraphDotArray(char * pData,int iDataLen);

/*其他方法的声明*/

};

驱动程序的编写实例

要实现本系统的打印驱动,必须遵守本系统的规范,就是新的打印机驱动必须从基类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上的实现等等。这些都是可行的,最终以求得实现一个完美的实时行式打印系统。

 
 
说明
:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。

上一篇:利用WebBrowser控件创建自己的浏览器  下一篇:VC下打印机的使用