通过GDI打印

转载 2013年12月02日 15:03:04

VC 5.0是开发Windows 95下应用程序的强大工具。本文将通过一个具体实例讨论用VC打印文字和图形的一些技术。在Windows  95下,显示器和打印机、绘图仪都被视为输出设备。系统默认的输出设备是显示器。要使用打印机,首先需要创建一个指向打印机的设备环境句柄,然后通过该句柄调用相关的绘图函数把所需的文字和图形输出至打印机上。当打印结束后,删除这个设备环境句柄即可。


  一、技术细节


  当我们在Windows95下安装好打印机后,总是需要设置一个为默认打印机,在Windows95的启动配置文件WIN.INI中[window]段中列出了带有关键字device的默认打印机。如果在文件WIN.INI中有如下几行:



  [windows]

  [其他程序行]

  device=EPSON LQ-1600K,EPSON24,LPT1:



  在device后的字符串中就包含了系统中默认的打印机的三个重要属性.它们依次是打印机的设备名是LQ-1600K,驱动程序名是EPSON24,输出端口为LPT1。在程序中我们可调用API函数GetProfileString从WIN.INI文件中获得这个设备字符串。再将这个设备字符串进行分解,获得这三个属性,作为参数用API函数CreateDC调用。如果调用成功,则为默认打印机创建一个设备环境句柄,否则返回一个空值(NULL)。

  CreateDC函数的原形如下:


  HDC CreateDC(

   LPCTSTR lpszDriver,

   LPCTSTR lpszDevice,

   LPCTSTR lpszOutput,

   CONST DEVMODE *lpinitData

   );


  二、程序代码及说明


   新建一个名为Test的工程,窗体类型为对话框(Dialog based)模式。在窗体中加入一个按钮(Button),设置这个Button的属性:ID=IDC_PRINT,CAPTION="打印"。在类向导中找到该Button的单击事件对应的消息BN_CLICKED,增加其成员函数OnPrint。在TestDlg.cpp文件中找到OnPrint函数并作如下改动。



   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,"这是一个例子",12);

// 输出一条直线

MoveToEx(hdcprint,20,20,NULL);

LineTo(hdcprint,120,120);



   RestoreDC(hdcprint,-1); //恢复打印机设备句柄

EndPage(hdcprint); //打印机停纸,停止打印

EndDoc(hdcprint); //结束一个打印作业

MessageBox("打印完毕!","提示",MB_ICONINFORMATION);

}

   // 用API函数DeleteDC销毁一个打印机设备句柄

   DeleteDC(hdcprint);

   }

   else

  {

   MessageBox("没有默认打印机,或者没有安装打印机!");

   return;

  }

  }

  编译运行程序,出现如下窗体:



  在窗体中按下"打印"按钮,则打印机上会输出一行字"这是一个例子"。然后再输出一条直线。在程序中使用了许多API函数,这些函数的具体用法在VC5.0提供的帮助文件中都有详细的说明,有兴趣的读者不妨看一看。

 

硬件的配置信息,在注册表里面有每一个打印机设置对应的二进制串,位置在:
HKEY_CURRENT_USER\Printers\DevModePerUser
可以读取它来保存成文件,或者从文件读取数据到这里,达到快速修改打印首选项的目的

相关文章推荐

【GDI+编程--打印篇(三)】--分页打印

有段时间没有更新文章了,最近一段时间一直没有时间去写点东西,因为在项目后期,很多地方需要修改,导致了时间的浪费。现在回头想想,大部分时间并不是浪费到了实现功能上,而是后期调试。通过三篇的GDI+打印的...

【GDI+编程--打印篇(一)】--.NET打印机制解析

上篇博客对GDI+的基本绘图方法汇总整理了一遍,本来以为不会学习到有关GDI+更深一步的内容了,但随着项目的进行发现事实并非如此,GDI+不仅仅是封装了图形绘制的功能,它还封装了经常使用的打印功能。今...

GDI+实现图片格式转换(bmp、jpeg、gif、tiff、png)

转自:http://blog.csdn.net/yuzl32/article/details/5389919 引言:通过GDI+我们可以很方便的对bmp、jpeg、gif、tiff、png格式的图片...
  • jax_lee
  • jax_lee
  • 2011年09月15日 16:29
  • 1666

使用Windows API进行GDI窗口绘图

http://blog.csdn.net/celte/article/details/10243309   使用Windows API进行GDI窗口绘图 标签: GD...

用PNG透明图片和GDI+做不规则透明窗体"异形窗口"

一、准备工作(PNG图片透空窗体) 1、图片资源准备工作。首先在Photoshop中编辑所用图片,将这些图片保存成为带透明通道的.png格式(GDI+调用显示时能够透明调背景)。这样程序中图片资源就...

关于GDI+中GraphicsPath进行合并(Union)截切(Exclude)等编程的探讨(1)

我们知道,在GDI+中,两个图形路径(GraphicsPath)的区域(Region)合并,我们可以采用Region.Union方法进行。但使用它之后,我们再想取得合并后的Region的Graphic...
  • johnsuna
  • johnsuna
  • 2013年01月06日 11:44
  • 11402

Windows GDI+坐标系统详解(二)

在上一篇中,作者详细介绍了GDI+中坐标系的概念,并以示例的方式进行了解释。 以下代码,是根据作者的示例,编写的VC++代码: 1.首先新建一个基于对话框的MFC程序项目名称GDIMan,在其ap...

利用c++实现数值坐标刻度生成,并利用GDI绘制

给定两个数值如(3001,5020),如何做到均匀地标注刻度? 研究matlab图形刻度会发现,在matlab中,图像无论如何缩放,坐标刻度间隔都是以1,2,5为基数,按照10倍或者0.1倍的幂进行放...

GDI+绘制极坐标图、雷达图

作者:野比 (conmajia@gmail.com) 时间:May, 2012 封面图片为野比原创,请勿未经允许私自引用 一个简单的GDI+例子。 简单绘制极坐...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过GDI打印
举报原因:
原因补充:

(最多只允许输入30个字)