ocx控件打印之基础篇

 

 

Visual C++6.0是开发Windows应用程序的强大工具,但是要通过它实现程序的打印功能,一直是初学者的一个难点,经常有朋友询问如何在VC中实现打印功能,他们往往感到在MFC提供的框架内实现这个问题很复杂,不知道如何下手。本例针对这个问题,介绍一种简单的方法实现文字串的打印功能,读者朋友可以在此基础上稍微改动一下,就可以实现文件、图像的打印功能。
  一、实现方法
  在Windows操作系统下,显示器、打印机和绘图仪都被视为输出设备,正常情况下,系统默认的输出设备是显示器。要使用打印机,首先需要创建一个指向打印机的设备环境句柄,然后通过该句柄调用相关的绘图函数把所需的文字和图形输出至打印机上。当打印结束后,删除这个设备环境句柄即可。
  当Windows系统中安装好打印机后,系统总是自动设置一个打印机为系统的默认打印机,在Windows的启动配置文件Win.ini中的[window]段中列出了带有关键字device的默认打印机。下面是某一机器中Win.ini中的[Windows]字段的内容:

[windows] load= run= NullPort=None device=HP LaserJet 4050(computer000),HPBFDB1,LPT1

  在上述关键字device后的字符串中,包含了系统中默认打印机的三个重要属性,它们依次是打印机的设备名HP LaserJet 4050(computer000),驱动程序名是HPBFDB1,输出端口为LPT1。
  为了操纵系统默认的打印机,实现程序的打印功能,在程序中可调用API函数GetProfileString()从Win.ini文件中获得device这个设备字符串,该函数的原型为:DWORD GetProfileString( LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize)。函数中lpAppName参数为所要检索的Win.ini文件中的字段名;lpKeyName为字段中的关键字名;lpDefault为默认的字符串;lpReturnedString为检索到的字符串,如果该函数没有从lpKeyName关键字中检索到相应的字符串,则kpRetrunedString返回默认字符串lpDefault;nSize为返回字符串的长度。
  获取上述字符串后,再使用strtok()函数将该字符串进行分解,获得与打印机相关的三个属性,作为API函数CreateDC()创建打印机设备环境句柄的参数,CreateDC()函数如果调用成功,则为默认打印机创建一个设备环境句柄,否则返回一个空值(NULL)。该函数的原形为:HDC CreateDC(LPCTSTR lpszDriver,LPCTSTR lpszDevice,LPCTSTR lpszOutput,CONST DEVMODE *lpinitData)。该函数的前三个参数恰好对应打印机的三个属性,最后一个参数为初始化打印机驱动程序的数据,一般情况下该参数设置为NULL就可以了。
  在具体打印的过程中,调用int StartDoc( HDC hdc, CONST DOCINFO *lpdi )函数来开始一个打印任务,其中参数lpdi为一个指向DOCINFO结构的指针,该结构如下:

typedef struct {   int cbSize; //结构的尺寸大小;  LPCTSTR lpszDocName; //文档的名字;  LPCTSTR lpszOutput; //输出文档名,一般情况下为NULL;  LPCTSTR lpszDatatype;//用来记录打印过程的数据类型,一般情况下为NULL;  DWORD fwType; //用来支持打印工作的额外信息,一般情况下为NULL; } DOCINFO, *LPDOCINFO;

  开始一个打印任务后,再调用StartPage(hdcprint)函数让打印机走纸,通知打印机有文档将要打印;接下来的工作就是输出数据了,这部分工作对于开发人员来说就象往计算机屏幕上输出文字、图像一样容易,只不过是计算机根据当前的设备环境句柄自动将数据输出到打印机罢了。数据打印完后,需要作一些善后处理工作,使用RestoreDC(hdcprint,-1)函数恢复打印机设备句柄、EndPage(hdcprint)函数让打印机停止打印,最后调用EndDoc(hdcprint)函数结束上述的打印作业。
  二、编程步骤
  1、启动Visual C++6.0,新建一个基于对话框的应用程序Test,在程序的对话框窗体中加入一个按钮(Button),设置这个Button的属性:ID=IDC_PRINT,CAPTION="打印";
  2、使用Class Wizard类向导为该按钮添加一个鼠标单击处理函数OnPrint()
  3、修改TestDlg.cpp文件中的OnPrint()函数;
  4、添加代码,编译运行程序。

三、程序代码

void CTestDlg::OnPrint()  {  char szprinter[80];  char *szDevice,*szDriver,*szOutput;  HDC hdcprint; // 定义一个设备环境句柄  //定义一个打印作业  static DOCINFO di={sizeof(DOCINFO),"printer",NULL};   // 得到设备字符串存入数组szprinter中  GetProfileString("windows","device",",,,",szprinter,80);   // 将设备字符串分解  if(NULL!=(szDevice=strtok(szprinter,","))&&NULL!=(szDriver=strtok(NULL,","))&& NULL!=(szOutput=strtok(NULL,",")))   // 创建一个打印机设备句柄    if((hdcprint=CreateDC(szDriver,szDevice,szOutput,NULL))!=0)   {    if(StartDoc(hdcprint,&di)>0) //开始执行一个打印作业    {      StartPage(hdcprint); //打印机走纸,开始打印     SaveDC(hdcprint); //保存打印机设备句柄     // 输出一行文字     TextOut(hdcprint,1,1,"热烈祝贺编程实例出版发行!",16);      RestoreDC(hdcprint,-1); //恢复打印机设备句柄     EndPage(hdcprint); //打印机停纸,停止打印     EndDoc(hdcprint); //结束一个打印作业     MessageBox("打印完毕!","提示",MB_ICONINFORMATION);    }    // 用API函数DeleteDC销毁一个打印机设备句柄     DeleteDC(hdcprint);   }   else   {    MessageBox("没有默认打印机,或者没有安装打印机!");    return;   }  }

  四、小结
  上面的例子非常简单,笔者主要是通过它说明如何实现打印功能,而不是说明如何实现复杂的打印效果,因为它们已经不属于我们这里所要讨论的范畴了,相信读者朋友真正掌握了上面实现打印功能的方法后,通过灵活的设置设备环境的各种对象(如字体对象、画刷等),一定可以打印出各种满意的效果来。 

一款高性能的报表开发工具,特别适用于管理信息系统,如ERP、进销存、财务等软件的报表开发。适用范围广:VB.NET、C#.NET、VB、VC、Delphi、C++Builder、中文编程易语言等一切支持 COM 的开发工具。 <br>功能强大:实现普通格式报表、表格报表、多层表头、票据套打、交叉表等各种报表非常简便;报表完全可编程定义,非常适合开发通用软件中的动态报表。 <br>独有的报表查询显示功能:除了提供报表的打印打印预览、数据导出等功能,还提供独有的报表查询显示功能,既提供报表查询与输出的集成一次性实现,又能保证数据的一致性与完整性。 <br>报表完全可编程定义,报表运行编程可控制,开发动态报表方便灵活。 <br>特有的分组单元格合并功能,轻松实现常见的中国式报表分组在列中展现形式。 <br>实现票据套打非常简便:对票据套打进行了专门的实现。 <br>提供图表功能,包括饼图、柱状图、叠加柱状图、连线图、散列点图等,在报表中直接实现图表功能。 <br>报表数据导出格式丰富,包括:Excel、PDF、图像、HTML、文本,CSV等多种格式。 <br>支持所有常规条形码。 <br>报表模板提供脚本编程功能,直接在报表模板中自定义报表行为。 <br>支持参数化报表查询SQL语句,轻松实现动态过滤条件筛选报表数据。 <br>运行时打印生成对纸张有适应能力,即使不以设计时纸张进行打印也可以得到输出布局合理的报表。 <br>报表查询显示时提供报表内容文字查找功能。 <br>全中文界面,针对中国报表进行了很多专门实现,如:报表表格线、财务金额线、数字大写金额、负数红字显示、多层表头等。 <br>组件提供丰富交互事件,轻松实现报表穿透(透视)查询和报表交互。 <br>重新发布简单:最多只需分发两个 DLL 文件。 <br>易学易用:完全可视化设计,完善的复制/剪切/粘贴(Copy/Cut/Paste)和恢复与重做(Undo/Redo)功能。 <br>编写了完整详尽的帮助文档。提供了丰富例程,包括VB.NET、C#、VB、VC、Delphi、CBuilder、中文编程易语言。 <br>为 Delphi、C++Builder 进行了专门的包装,象使用 VCL 构件一样使用
控件功能强大,却简单易用,所有调用如同JavaScript扩展语句, 主要接口函数如下: PRINT_INIT 打印初始化 SET_PRINT_PAGESIZE 设定纸张大小 ADD_PRINT_HTM 增加超文本项 ADD_PRINT_TEXT 增加纯文本项 ADD_PRINT_TABLE 增加表格项 ADD_PRINT_SHAPE 画图形 SET_PRINT_STYLE 设置对象风格 PREVIEW 打印预览 PRINT 直接打印 PRINT_SETUP 打印维护 PRINT_DESIGN 打印设计 ... 样例清单 1.如何在页面内嵌入控件见样例一 2.如何选材打印当前页面内容见样例二 3.如何用代码生成打印页见样例三 4.如何打印设计和定位套打见样例四 5.如何控制纸张大小和连续打印见样例五 6.如何输出多页长文档及双面打印见样例六 7.如何定向输出见样例七 8.如何打印图片见样例八 9.如何用程序加载打印维护背景图见样例九 10.如何控制打印样式(STYLE)见样例十 11.如何直接打印条形码见样例十一 12.如何读写本地文件见样例十二 13.如何打印旋转内容见样例十三 14.如何按URL打印见样例十四 15.如何打印表格的页头页尾见样例十五 16.如何设置预览窗口大小见样例十六 17.如何发打印机指令或直接读写端口见样例十七 18.如何打印幅面高度不固定的票据见样例十八 19.如何内嵌显示及预览时包含背景图见样例十九 20.如何强制分页并预览多页卡片见样例二十 21.如何控制打印维护的功能权限见样例二十一 22.如何构建自己的纯WEB打印预览见样例二十二 23.如何居中打印超文本见样例二十三 24.如何选择界面皮肤见样例二十四 25.如何指定输出到哪页或仅预览见样例二十五 26.如何提高多页打印的性能见样例二十六 27.如何导出数据到Excel文件见样例二十七 28.如何快速读取客户端系统信息见样例二十八 29.如何使用其它长度单位见样例二十九 30.如何分页输出页面内容见样例三十 31.如何打印表格的分页小计或合计见样例三十一 32.如何实现清晰的图表打印见样例三十二 33.如何实现甘特图等的图表打印见样例三十三 34.如何使用百分比%和满页打印见样例三十四 35.如何获得打印结果和程序代码见样例三十五 36.如何在设计过程中用js编辑内容见样例三十六 37.如何打印公章效果图见样例三十七 38.如何用BASE64编码输出图片见样例三十八 39.如何打印田字格、上划线等文本见样例三十九 40.如何进行数据格式转换见样例四十 41.如何把内容关联后按顺序打印见样例四十一 42.如何把整页内容缩放打印见样例四十二 43.如何分页打印综合表格见样例四十三 44.如何缩放打印单个超文本内容见样例四十四 45.如何获得打印状态及最终结果见样例四十五 46.如何设置右边距和下边距见样例四十六
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值