Visual C++ 打印编程技术-编程基础
背景: windows产生前,操作系统(如DOS等)都不提供支持图像处理的打印机驱动程序,使得程序员为打印出图像,不得不针对使用的打印机
自己编写设备驱动程序,导致了大量的、不必要的重复开发。
随着windows操作系统系统的面世,其所提供的设备环境模型允许开发人员将显示器、打印机和绘图仪等设备都堪称 二维绘图接口,并且
设置驱动程序已经由制造商完成,开发人员无需再编写打印驱动程序。Windows操作系统提供的API接口支持图像打印功能,但对开发者来
讲,打印依然是比较困难的编程任务。幸运的是,MFC库6.0版本大大简化打印的实现,并且加入了打印预览的功能,使得开发者容易开发
出不错的打印和预览功能来。
两个重要概念“设备环境” 和 “映射模式”
1.设备环境
设备环境本身是GDI(Graphics Device Interface)对象。每个C++设备对象有一个相关的设备环境,它由一个32位HDC类型句柄来标识。GDI是windows核心DLL中的一组接口函数。这些函数处于硬件的驱动程序之上,当应用程序调用这些函数的时候,他们再调用驱动程序提供的接口函数。
MFC 6.0 版本提供大量的设备环境类型。基类CDC封装了绘图需要的所有成员函数,这些函数提供了大量的绘图、坐标映射、裁剪功能。
除了CmetaFileDC类之外,派生类只在他们的构造函数和析构函数中有所区别。
1.CDC类: 使用MFC编程,所有的设备环境不是CDC就是从CDC派生的。
CDC类有两个底层GDI对象有关的句柄:
m_hDC:与m_hDC相关的GDI对象处理绘图函数所有输出流;
m_hAttribDC:与m_hAttribDC句柄有关的GDI对象处理所有与绘图属性有关的操作,如颜色属性、绘图模式。
每个窗口、控件(包括通用控件和Activex控件)都拥有一个覆盖窗口或控件的设备环境变量。我们既可以获得Windows桌面的窗口设备环境,在桌面上绘制,也可以使用任何一个控件的设备环境,从而绘制控件或者改善控件的外观。
获得设备环境对象指针调用:GetDC()函数。在构造一个CDC对象,并且对它处理完之后,务必使用ReleaseDC()函数释放CDC对象。
CDC* pDC=GetDC(); //获取试图设备环境 这个不包括边框、标题栏和菜单栏
ReleaseDC(pDC);//释放对象
注意:不善删除通过OnDraw()函数的置身参数传递的CDC对象,应用程序框架会自动控制它的删除。
2.CClientDC和CWindowDC
CClientDC继承于CDC:1.产生窗口客户区对象,用户客户区的输出,与特定窗口关联(构造函数参数传递窗口句柄)
2.该对象构造函数调用(GetDC),析构函数调用(ReleaseDC) 意味着无需显示调用GetDC,及ReleaseDC
CWindowDC集成于CDC:1.产生客户区或非客户区对象,CClientDC 只能产生客户区对象
2.构造函数调用 GetWindowDC,析构函数调用ReleaseDC ,同上意味着不用显示构造和释放
坐标原点均试创建对象的参数而定。
3.CPaintDC
CPaintDC类是一个特殊的设备环境封装类。它用来处理来自Windows的WM_PAIT消息。 当窗口上覆盖的其他窗口移走或窗口最小化后又最大化,窗口会收到一个系统发来的WM_PAINT消息,这是应用程序会重画可见区域。这个被重画的区域,称之为无效区域。WM_PAINT消息发出后,Windows会帮助用户判断哪些区域需要重画,哪些区域保持不变,从而加快窗口的显示速度。
typedef struct tagPAINTSTRUCT {
HDC hdc; //底层GDI环境对象的句柄
BOOL fErase; //指定背景是否需要重新绘制
RECT rcPaint; //请求指定绘制矩形的左上角和右下角
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[16];
} PAINTSTRUCT;
Visual C++ 打印编程技术-编程基础的更多相关文章
- Visual C++ 打印编程技术-编程基础-映射模式
映射模式: Visual C++ 中采用的坐标映射方式使得用户图形坐标和输出设别的像素完全一致. eg:当屏幕的像素大小为800X600时,每英寸包含屏幕像素为96,打印机则需要几倍的点数才能达到同样 ...
- Visual C++ 打印编程技术-编程基础-获取打印机
标准方法是用: EnumPrinters() 函数获取 #define PRINTER_ENUM_DEFAULT 0x00000001 #define PRINTER_ENUM_LOCAL 0x000 ...
- shell编程技术之-基础知识
一.脚本结构 linux下shell的脚本,是将一系列命令序列写在一个文本文件,而这个文本文件时可执行的.相对命令行来说,开发效率提高.因此他的构架有2部分构成#!和命令序列.其中#!指明此脚本是用哪 ...
- C++ STL编程轻松入门基础
C++ STL编程轻松入门基础 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL 1.2 追根溯源:STL的历史 1.3 千丝万缕的联系 1.4 STL的不同实现版本 2 牛刀小试 ...
- 关于如何提高Web服务端并发效率的异步编程技术
最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...
- 转载--提高C++性能的编程技术
读书笔记:提高C++性能的编程技术 第1章 跟踪范例 1.1 关注点 本章引入的实际问题为:定义一个简单的Trace类,将当前函数名输出到日志文件中.Trace对象会带来一定的开销,因此在默认情况 ...
- linux脚本编程技术
linux脚本编程技术 一.什么是脚本 脚本是一个包含一系列命令序列的可执行(777)文本文件.当运行这个脚本文件时,文件中包含的命令序列将得到自动执行. 二.脚本编程 #!/bin/sh 首行固定格 ...
- 如何提高Web服务端并发效率的异步编程技术
作为一名web工程师都希望自己做的web应用能被越来越多的人使用,如果我们所做的web应用随着用户的增多而宕机了,那么越来越多的人就会变得越来越少了,为了让我们的web应用能有更多人使用,我们就得提升 ...
- 电脑小白自学软件编程-.Net语法基础之循环语句,纯技巧干货
写代码也要读书,爱全栈,更爱生活.每日更新原创IT编程技术及日常实用视频. 我们的目标是:玩得转服务器Web开发,搞得懂移动端,电脑客户端更是不在话下. 本教程是基础教程,适合任何有志于学习软件开发的 ...
随机推荐
- Shell 脚本编程
Shell 两个数据比较取差异 flag=0 local array1=("a" "b") local array2=("a" " ...
- Warning: Function created with compilation errors!
解决方案: sqlplus / as sysdba grant execute on UTL_I18N to scott; grant execute on DBMS_CRYPTO to scott;
- Entity Framework 杂碎
其实看图很简单,database first和model first都是通过 data model创建的edmx文件,只不过model first模块可以自己根据需要创建和修改实体,显得更加灵活. c ...
- hdu 3724 Encoded Barcodes
Trie模板.把所有单词都用字典树存起来,然后给每个节点赋权值表示前缀到该节点出现了几次.然后直接查询就可以了. #include <algorithm> #include <ios ...
- struts2 struts.xml配置文件详解
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN&quo ...
- sqrt 源代码
stap -v -e 'probe process("/usr/local/mysql56/bin/mysqld").function("*@/usr/src/mysql ...
- 解决Visual Studio 2010新建工程时出现『1>LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt』错误
VS2010在经历一些更新后,建立Win32 Console Project时会出"error LNK1123" 错误. 解决方案为: 第一步:将:项目|项目属性|配置属性|清 ...
- DHCPv6 server port and DHCPv6 client port
The DHCPv6 draft says that, the port numbers for client and agents are given as 546 & 547 在wires ...
- SoundPool没有声音的问题
在项目中需要播放一个提示,很短的一个声音,Android中播放声音有两种方式:MediaPlayer和SoundPool.相对来说SoundPool比较轻量级一些,多用在播放比较短急的声音,Media ...
- 解决DataTable中的DataColumn类型默认为int类型时, 导致不能修改其列值为其他类型的解决办法
问题起因: 扔给数据库一条select * from [表名] , 得到一个DataTable, 发现有一列status状态的DataColumn的类型是int,然后我想换成字典表里的文字描述,然后就 ...