小程序:windows下C++调用打印机过程简介

         本文目的主要是通过这个小程序理解打印机调用过程。通过调用windowsAPI函数GetProfileString,获得当前计算机默认打印机信息,然后生成打印设备句柄,再调用TextOut函数通过打印设备句柄将文字信息输出打印机上。
//有关程序代码及详细注释见下:
//**********马上龙年春节了,祝所有看到本文的朋友们春节快乐!龙年大吉!*********
#include <windows.h>
#include <string>
using namespace std;

int Print(string str)
{
    char szprinter[80];//用于存储打印相关信息
    char *szDevice,*szDriver,*szOutput; //用于存储将上面信息解析后的信息
    HDC hdcprint; // 定义一个打印设备句柄
    //定义一个打印作业
    static DOCINFO docinfo={sizeof(DOCINFO),"printer",NULL}; 
    /*
     关于DOCINFO结构体:
         int cbSize - 结构体字节数
         LPCTSTR lpszDocName - 指向指定文档名称的空终止字符串的指针
         LPCTSTR lpszOutput - 指向指定输出文件名称的以空结尾的指针。如果此指针为 NULL,则输出将发送到
                              由传递给 StartDoc 函数的设备上下文句柄标识的设备。
         LPCTSTR lpszDatatype - 指向指定用于记录打印作业的数据类型的空终止字符串的指针。此成员可以为 
                                NULL。这里使用缺省值。
         DWORD fwType - 指定有关打印作业的附加信息。此成员必须使用指定值。这里使用缺省值。
    */
    GetProfileString("windows","device",",,,",szprinter,80); 
       //GetProfileString是WIN32 API函数,功能是检索与 Win.ini文件的指定节中的键关联的字符串。注意此函
       //数只是为了与基于 16 位 Windows的应用程序兼容,其提取的信息应在注册表中。
       //参数介绍:
       //lpAppName -- 包含密钥的节的名称。
       //lpKeyName -- 要检索其关联字符串的键的名称。
       //lpDefault -- 默认字符串。如果在初始化文件中找不到lpKeyName键,函数会将默认字符串复制到lpReturnedString中。
       //lpReturnedString -- 指向接收字符串的缓冲区的指针。
       //nSize -- lpReturnedString 参数指向的缓冲区的大小(以字符为单位)。
    szDevice=strtok(szprinter,","); 
          //功能:分解字符串为一组标记串。参1 要分解的字符串、参2 字符串中的分隔符。
          //说明:首次调用时,参1必须指向要分解的字符串,随后再调用要把参1改成NULL。 
    szDriver=strtok(NULL,",");
    szOutput=strtok(NULL,",");
    if(szDevice&&szDriver&&szOutput)
    {
        if((hdcprint=CreateDC(szDriver,szDevice,szOutput,NULL))!=0) //生成打印设备句柄
             {
                if(StartDoc(hdcprint,&docinfo)>0) //开始执行一个打印作业 
                {
                    StartPage(hdcprint); //开始打印
                    SaveDC(hdcprint); //保存打印设备句柄  
                    TextOutA(hdcprint,10,10,str.data(),str.length());
                    string temp= "打印完毕!";
                    TextOutA(hdcprint, 10, 200, temp.data(), temp.length());
                    RestoreDC(hdcprint, -1); //恢复打印设备句柄到最近由SaveDC函数保存的状态中
                    EndPage(hdcprint); //停止打印
                    EndDoc(hdcprint); //结束一个打印作业
                    MessageBox(NULL,"打印完毕!","提示",MB_ICONINFORMATION); 
                }
                DeleteDC(hdcprint);// 销毁打印设备句柄                
             }
        else{
                MessageBox(NULL,"没有默认打印机,或者没有安装打印机!","消息",1);
                return 0;
            }
       }
    return 1;
}
int main()
{
    string a="天津市位于渤海之滨,是一座美丽的城市!";
    
    Print(a);
    system("pause");
    return 0;

}

//程序运行结果:(在打印机上输出)
//天津市位于渤海之滨,海河穿越其中,是一座美丽的城市!
//打印完毕!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/677788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis集群模型

主从 全量同步 增量同步 哨兵 分片集群

微信小程序上传代码教程

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 小程序上传代码到gogs上面来 整体架构流程 小程序也要远程连接仓库&#xff0c;实现代码上传 技术名词解释 微信开发者工具gogs 技术细节 连接gogs仓库地址 微信小程序需要head将本地代码和gogs代码同步 小结 …

JAVA反射总结学习

初始反射反射的基本操作反射安全性问题 反射是指在Java运行状态中: 给定一个类对象(Class对象)&#xff0c;通过反射获取这个类对象(Class对象)的所有成员结构&#xff1b; 给定一个具体的对象&#xff0c;能够动态地调用它的方法及对任意属性值进行获取和赋值&#xff1b; …

[word] word如何打印背景和图片? #微信#其他#经验分享

word如何打印背景和图片&#xff1f; 日常办公中会经常要打印文件的&#xff0c;其实在文档的打印中也是有很多技巧的&#xff0c;可以按照自己的需求设定&#xff0c;下面给大家分享word如何打印背景和图片&#xff0c;一起来看看吧&#xff01; 1、打印背景和图片 在默认的…

离线数仓(一)【数仓概念、需求架构】

前言 今天开始学习数仓的内容&#xff0c;之前花费一年半的时间已经学完了 Hadoop、Hive、Zookeeper、Spark、HBase、Flume、Sqoop、Kafka、Flink 等基础组件。把学过的内容用到实践这是最重要的&#xff0c;相信会有很大的收获。 1、数据仓库概念 1.1、概念 数据仓库&#x…

在gtkmm4 中检索子控件 (children)

文章目录 前言源代码 前言 gtkmm4.10已经没有控件的 get_children() 方法了但引进了observe_children() 但这个如其名字一样, 不能对子控件作修改 可以用它返回的对象.get_n_items() 获取子控件的数量还有如下的代替 get_first_child() : 如果只有一个child 则first与last返回…

typedef关键词的使用

typedef的应用 typedef定义函数数组 定义表达式 typedef <元素类型关键字><数组类型名>[<常量表达式>];例如: (1) typedef int vector[10]; (2) typedef char strings[80]; (3) typedef short int array[N]; 第一条语句定义了一个元素类型为int,含有…

《动手学深度学习(PyTorch版)》笔记8.3

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

从 F-Droid 安装 termux

Installing from F-Droid - Termux Wiki 如何从 F-Droid 安装 Termux 应用&#xff1a; 点击此链接&#xff0c;在 Android 或 Chrome OS 设备上打开 F-Droid。点按下载 APK&#xff0c;点击设备上下载的APK&#xff0c;点击允许安装来自未知来源的应用程序&#xff08;无论如…

【开源】JAVA+Vue.js实现计算机机房作业管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登录注册模块2.2 课程管理模块2.3 课时管理模块2.4 学生作业模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 课程表3.2.2 课时表3.2.3 学生作业表 四、系统展示五、核心代码5.1 查询课程数据5.2 新增课时5.3 提交作…

【PyTorch][chapter 15][李宏毅深度学习][Neighbor Embedding-LLE]

前言&#xff1a; 前面讲的都是线性降维&#xff0c;本篇主要讨论一下非线性降维. 流形学习&#xff08;mainfold learning&#xff09;是一类借鉴了拓扑流行概念的降维方法. 如上图,欧式距离上面 A 点跟C点更近&#xff0c;距离B 点较远 但是从图形拓扑结构来看&#xff0c; …

「C++ 类和对象篇 10」初始化列表

目录 一、什么是初始化列表&#xff1f; 二、为什么需要初始化列表&#xff1f; 三、初始化列表怎么使用&#xff1f; 3.1 在构造函数中使用初始化列表 3.2 注意 3.3 结论 3.4 应用场景 四、初始化列表的初始化顺序 五、另一种初始化成员变量的方法 【总结】 一、什么是初始化…

C++入门篇(4)—— 类与对象(1)

目录 1.类的引入 2.类的定义 3.类的访问限定符 4.类的作用域 5. 类对象的存储方式 6. this指针 6.1 this指针的引入 6.2 this指针的特性 6.3有意思的面试题 1.类的引入 C语言struct 结构体中只能定义变量&#xff0c;而C中可以定义函数。 struct Date {void Init(int…

vue常用9个事件修饰符

第075个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使用&#xff0c;computed&a…

vueRouter中Hash模式和History模式有什么区别

VueRouter是Vue.js官方推荐的前端路由库&#xff0c;它提供了一种方便的方式来构建单页应用&#xff08;SPA&#xff09;。在使用VueRouter时&#xff0c;我们可以选择不同的路由模式&#xff0c;其中最常见的是Hash模式和History模式。本文将深入探讨这两种模式的区别&#xf…

逐行拆解Guava限流器RateLimiter

逐行拆解Guava限流器RateLimiter 常见限流算法 计数器法 设置一个时间窗口内允许的最大请求量&#xff0c;如果当前窗口请求数超过这个设定数量&#xff0c;则拒绝该窗口内之后的请求。 关键词&#xff1a;时间窗口&#xff0c;计数器。 举个例子&#xff0c;我们设置1秒钟…

vue3 可视化大屏自适应屏幕组件

首先定义了一个名叫ScreenContainerOptions的组件&#xff0c;需要传的参数如下 export type ScreenContainerOptions {width?: string | numberheight?: string | numberscreenFit?: boolean // 是否开启屏幕自适应&#xff0c;不然会按比例显示 } 组件的主要代码如下 …

【sass】 中使用 /deep/ 修改 elementUI 组件样式报错

element plus 想要覆盖组件的样式&#xff0c;想到了/deep/样式穿透&#xff0c;但样式一直不生效&#xff0c;代码如下&#xff1a; <style scoped lang"sass"> .main_wrapper{padding: 0 53pxposition: relativetop: -20px } >>> .el-tabs__item{h…

CSS3 基本语法

CSS3 基本语法 1. CSS3 新增长度单位 rem 根元素字体大小的倍数&#xff0c;只与根元素字体大小有关。vw 视口宽度的百分之多少 10vw 就是视口宽度的 10% 。vh 视口高度的百分之多少 10vh 就是视口高度的 10% 。vmax 视口宽高中大的那个的百分之多少。&#xff08;了解即可&am…

JVM相关-JVM模型、垃圾回收、JVM调优

一、JVM模型 JVM内部体型划分 JVM的内部体系结构分为三部分&#xff0c;分别是&#xff1a;类加载器&#xff08;ClassLoader&#xff09;子系统、运行时数据区&#xff08;内存&#xff09;和执行引擎 1、类加载器 概念 每个JVM都有一个类加载器子系统&#xff08;class l…