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

本文介绍了如何通过WindowsAPI函数如GetProfileString获取默认打印机信息,创建打印设备句柄,并利用TextOut函数在打印机上输出文本,以一个小程序为例演示了整个过程。
摘要由CSDN通过智能技术生成

         本文目的主要是通过这个小程序理解打印机调用过程。通过调用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;

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值