行式打印机:Windows下实时行式打印系统设计(2)来源: 发布时间:星期四, 2008年9月25日 浏览:37次 评论:0
供响应打印请求的服务进程使用的类至少要提供如下操作:
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); /*其他方法的声明*/ }; 驱动程序的编写实例 要实现本系 0
相关文章
读者评论
发表评论 |