C++连接打印机(windows API)
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; } } |
四、小结
上面的例子非常简单,笔者主要是通过它说明如何实现打印功能,而不是说明如何实现复杂的打印效果,因为它们已经不属于我们这里所要讨论的范畴了,相信读者朋友真正掌握了上面实现打印功能的方法后,通过灵活的设置设备环境的各种对象(如字体对象、画刷等),一定可以打印出各种满意的效果来。
C++连接打印机(windows API)相关推荐
- win7无法连接打印机拒绝访问_Win7系统”windows无法连接到打印机拒绝访问“怎么办?通过创建local port端口连接来搞定...
随着电脑的使用率越来越高,我们有时候可能会遇到Win7系统"windows无法连接到打印机拒绝访问"的问题,要怎么处理呢?详细解决方法如下: 故障现象: 按照XP的方式添加打印机, ...
- win7无法连接打印机拒绝访问_“Windows无法连接打印机,操作失败,错误为0x000003e3”...
请求大家帮助,昨天在共享打印机时出现"Windows无法连接打印机,操作失败,错误为0x000003e3 ".在百度百科查询的资料修改了都不行(在不重装系统前提下,联想台式机都是w ...
- 计算机有效策略无法连接打印机,共享打印提示:Windows无法连接到打印机,拒绝访问...
laserjet mfp m436n 共享打印,别的电脑\\192.168.1.5登录成功,共享找到,点击共享打印连接 右键 点击"连接" 提示下面错误 连接到打印机 Window ...
- windows无法连接到打印机_“Windows无法连接打印机,操作失败,错误为0x000003e3”...
请求大家帮助,昨天在共享打印机时出现"Windows无法连接打印机,操作失败,错误为0x000003e3 ".在百度百科查询的资料修改了都不行(在不重装系统前提下,联想台式机都是w ...
- 打印添加打印机 windows无法连接到打印机 错误为0x0000011b
对于共享打印添加打印机 windows无法连接到打印机 错误为0x0000011b问题解决!亲测可用 1.以下是我的解决步骤:复制以下内容,在桌面新建一个txt文件,粘贴到txt文档里边.保存 win ...
- Windows 7 连接 Windows 10 共享打印机,Windows 无法连接打印机,操作失败,错误为0x0000011b 的终极解决办法
Windows 7 连接 Windows 10 共享打印机出现错误 0x000001b,建议不要通过卸载Windows10系统的KB5005565安全更新来解决该问题(犹如削足适履),正确的处理方法是 ...
- MFC程序解析以及使用cl.exe、link.exe编译连接Windows API和MFC程序
目录 一.实验目的 二.实验配置 三.MFC程序创建和解析 (一).创建MFC程序 (二).分析MFC程序 四.使用cl.exe和link.exe (一).Windows API 1.实验代码 2.实 ...
- 如何在 Windows XP 中使用 Web 浏览器连接打印机
如何在 Windows XP 中使用 Web 浏览器连接打印机 概要 本文介绍了如何使用 Web 浏览器连接到打印机. Internet 打印工作原理 有了 Microsoft Windows XP ...
- Windows 无法连接打印机,请检查打印机名并重试。如果这是网络打印机,请确保打印机已打开,并且打印机地址正确。报错代码:0x00000709
一.连接打印机报错信息 二.打开打印机报错信息 三.解决办法: 1.打开设置 2.打开更新和安全 3.查看跟新历史记录 4.如果你的系统更新了:KB50066xx这个版本 那么就卸载这 ...
- 64位计算机连接网络打印机驱动程序,为运行 64 位版本的打印机查找兼容的打印机Windows - Windows Server | Microsoft Docs...
如何为运行 64 位版本的打印机的计算机查找兼容的打印机Windows 09/08/2020 本文内容 本文介绍如何为运行 64 位版本 Windows 的计算机查找兼容的打印机Windows. 适用 ...
最新文章
- 关于虚函数的应用(10个例子)
- javaWEB学习之filter
- 卷积神经网络(CNN)中卷积的实现
- VS2017离线企业版,限时分享
- Unity 5.x 游戏开发指南 HD版 final.pdf
- 吴恩达《机器学习》第十四章:降维
- jenkins手把手教你从入门到放弃02-jenkins在Windows系统安装与配置
- 一个可以参考的JVM内存分配
- 995. K 连续位的最小翻转次数
- Hyperscan 5.1.0 安装
- [知乎] 开放世界游戏中的大地图背后有哪些实现技术?
- Win10系统怎么打开卓越模式?Win10这些隐藏模式你都知道吗?
- 网络安全技能竞赛通关教程
- 阿里云云原生数据湖体系全解读——数据湖构建 数据导入
- cdoj 71 I am Lord Voldemort 水题
- 苹果MacBook Air安装win7
- 朴新教育澄清破产传闻:债务重组是最有利方案 公司继续经营
- SkyEye天目全数字实时仿真软件功能介绍
- 未来10年什么行业发展比较好?
- 实现微信小程序web-view内嵌H5中的下载功能(大文件切片下载)
热门文章
- MAC捕获及协议分析 实验报告
- 你不知道的adb,熟知工具快速开发
- php表达式ax 2 bx c=0,设a,b,c为互不相等的非零实数,求证:方程ax2+2bx+c=0,bx2+2cx+a=0,cx2+...
- 小老板创业10大禁忌
- 流量壁垒消失后,电商风口重启
- Wannafly交流赛1 _A_有理数 【水】
- 利用GDAL(python)读取Landsat8数据
- python打印神兽佛祖和美女 | Buddha Bless, No Bug !
- 2021年了,来谈谈Flutter的未来
- 微小区V2 v2.3.4 小区 智能设备 智慧物业