Windows下实时行式打印系统设计
2010-05-25 20:36:34 来源:WEB开发网在获得了共享内存的地址后,任何调用进程都可以将要打印的信息写到该共享内存中,供打印服务进程打印输出。基于系统实时性和效率方面的考虑,使用环形先入先出队列(FIFO),在此不再详述。
通常情况下,将上述功能封装成两个类,生成动态连接库供程序调用。一个类提供给需要提交打印信息请求的应用程序使用; 另一个类提供给响应打印请求的实时打印服务进程使用。在类中屏蔽以上算法细节和数据细节。
供提交打印信息请求的应用程序调用的类至少要提供如下接口操作:
class RealTimePrintSystemClnt
{//其他的数据和方法声明
public:
BOOL IsWorking();
//打印机是否正在工作?
/*实时打印系统的FIFO队列是否已满?如果返回为TRUE,表示实时打印系统已经没有空闲响应程序的打印请求,应用程序要等到该返回值为FALSE时,重发打印请求。*/
BOOL IsFull();
/*程序请求实时打印操作。pData 表示要打印的实时信息,由ASCII字符或者汉字字符组成的字符串。dwDataLen 是要打印的实时信息的字符长度。crColor 表示使用什么颜色打印,如果使用彩色喷墨打印机将可以打印彩色,默认值为0,表示黑色。pPrinterName 表示该打印请求将在哪一个打印机上打印输出,默认值为NULL,表示实时打印系统的默认打印机。返回值是实际提交给实时打印系统的信息长度,该值如果等于dwDataLen 则表示该请求已经完全提交成功,如果等于零值则表示该请求没有被完整提交,应用程序要再次提交该请求。*/
DWORD Request(LPCSTR pData,DWORD dwDataLen,COLORREF crColor=0,LPCSTR pPrinterName=NULL);
//其他的数据和方法声明
};
供响应打印请求的服务进程使用的类至少要提供如下操作:
class RealTimePrintSystemServ
{//其他的数据和方法声明
//UnionPrintSystem是打印驱动层的封装类,实时打印系统使用它来打印实时信息
UnionPrintSystem *m_pUnionPrintSystem;
public:
/*获得当前FIFO队列中的打印请求个数*/
DWORD GetRequstNum();
/*获得一个打印请求的数据,pData得到数据的首地址,dwDataLen得到数据的长度,crColor 得到打印颜色,pPrinterName 得到执行请求打印机的名字。返回值为TRUE,表示成功,为FALSE表示失败。*/
BOOL GetRequest(unsigned char ** pData,DWORD &dwDataLen,COLORREF &crColor,LPSTR pPrinterName);
/*实时打印系统的打印线程。在该打印线程中,要不断检测是否有打印请求,如果有打印请求,则取出打印请求,提交给打印驱动层,然后由打印驱动层驱动不同的打印机将请求在纸上打印出来。关于打印驱动层下面讲述。*/
static DWORD WINAPI rtPrintThread(LPVOID lpParameter);
};
打印驱动部分
为了实现系统设备无关性的要求,设计了打印统一驱动层部分。这样一旦打印机设备更改,应用程序只需加载新的打印机设备驱动即可,不会导致打印机系统程序和用户程序的修改,使系统具有较好的稳定性、兼容性和可扩充性。
首先,定义统一驱动部分,该部分主要完成以下功能:加载相应的具体打印机驱动程序,并负责将请求打印的字符信息翻译成不同打印机需要的打印点阵信息。
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);
/*其他方法的声明*/
};
更多精彩
赞助商链接