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开发,搞得懂移动端,电脑客户端更是不在话下. 本教程是基础教程,适合任何有志于学习软件开发的 ...
随机推荐
- CodeBlocks+opencv2.4.4+cmake+MinGW
/*-----------------------------------------------------------------------------* * 版权声明:* 可以任意 ...
- Unity4.3.3 烘焙踩坑
许久没发文章了,开始实习了,挺忙的基本没什么时间了 unity4.3.3是一个非常古老的版本了,弄了一下烘焙,踩了不少坑, 首先是unity自带的nature shader,其中有soft occlu ...
- ModelSim仿真
(1)出现“Fatal: SDF files require Altera primitive library” 书上的方法是在ModelSim-SE下的使用,而我用的是ModelSim-Alter ...
- 如何使用 RDP 或 SSH 连接到 Azure 虚拟机
使用 RDP 或 SSH 连接到 Azure 虚拟机 本文简要概述了如何使用远程桌面控制协议 (RDP) 或安全外壳(Secure Shell,SSH)客户端登录 Azure 虚拟机.它还包括要求和故 ...
- RTCP
RTCP RTCP协议将控制包周期发送给所有连接者,应用与数据包相同的分发机制.低层协议提供数据与控制包的复用,如使用单独的UDP端口号.RTCP执行下列四大功能: (1) 主要是提供数据发布的质量反 ...
- IOS学习笔记38--@class #import辨析 #include
tyle="margin:20px 0px 0px; line-height:26px; font-family:Arial"> #include 区分 #i ...
- Unity定时器
需求:制作定时器,运行3秒后执行第一次,之后每隔3秒执行一次操作. 1.使用变量在Update中计时 public class TestTimer : MonoBehaviour { private ...
- 按需讲解之Supervisor
Supervisor是一个进程监控程序. 满足的需求是:我现在有一个进程需要每时每刻不断的跑,但是这个进程又有可能由于各种原因有可能中断.当进程中断的时候我希望能自动重新启动它,此时,我就需要使用到了 ...
- IOS GCD 使用 (二)
上一节,主要介绍了GCD的基本的概念,这节将用代码深入详细介绍GCD的使用. 一 使用介绍 GCD的使用主要分为三步:创建代码块;选择或创建合适的分发队列;(同步.异步方式)向分发队列提交任 ...
- 走进C++程序世界-----继承和派生(2)
覆盖基类的函数 覆盖基类函数顾名思义就是在派生类中对基类的函数进行的重新定义.这里将会讲到下面的2个知识点: 1.隐藏基类的方法 2.调用基类的方法(隐式和显示调用基类的方法) /* *derive2 ...