背景: 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++ 打印编程技术-编程基础的更多相关文章

  1. Visual C++ 打印编程技术-编程基础-映射模式

    映射模式: Visual C++ 中采用的坐标映射方式使得用户图形坐标和输出设别的像素完全一致. eg:当屏幕的像素大小为800X600时,每英寸包含屏幕像素为96,打印机则需要几倍的点数才能达到同样 ...

  2. Visual C++ 打印编程技术-编程基础-获取打印机

    标准方法是用: EnumPrinters() 函数获取 #define PRINTER_ENUM_DEFAULT 0x00000001 #define PRINTER_ENUM_LOCAL 0x000 ...

  3. shell编程技术之-基础知识

    一.脚本结构 linux下shell的脚本,是将一系列命令序列写在一个文本文件,而这个文本文件时可执行的.相对命令行来说,开发效率提高.因此他的构架有2部分构成#!和命令序列.其中#!指明此脚本是用哪 ...

  4. C++ STL编程轻松入门基础

    C++ STL编程轻松入门基础 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL 1.2 追根溯源:STL的历史 1.3 千丝万缕的联系 1.4 STL的不同实现版本 2 牛刀小试 ...

  5. 关于如何提高Web服务端并发效率的异步编程技术

    最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...

  6. 转载--提高C++性能的编程技术

    读书笔记:提高C++性能的编程技术   第1章 跟踪范例 1.1 关注点 本章引入的实际问题为:定义一个简单的Trace类,将当前函数名输出到日志文件中.Trace对象会带来一定的开销,因此在默认情况 ...

  7. linux脚本编程技术

    linux脚本编程技术 一.什么是脚本 脚本是一个包含一系列命令序列的可执行(777)文本文件.当运行这个脚本文件时,文件中包含的命令序列将得到自动执行. 二.脚本编程 #!/bin/sh 首行固定格 ...

  8. 如何提高Web服务端并发效率的异步编程技术

    作为一名web工程师都希望自己做的web应用能被越来越多的人使用,如果我们所做的web应用随着用户的增多而宕机了,那么越来越多的人就会变得越来越少了,为了让我们的web应用能有更多人使用,我们就得提升 ...

  9. 电脑小白自学软件编程-.Net语法基础之循环语句,纯技巧干货

    写代码也要读书,爱全栈,更爱生活.每日更新原创IT编程技术及日常实用视频. 我们的目标是:玩得转服务器Web开发,搞得懂移动端,电脑客户端更是不在话下. 本教程是基础教程,适合任何有志于学习软件开发的 ...

随机推荐

  1. [转]ASP.NET MVC 入门2、项目的目录结构与核心的DLL

    我们新建一个ASP.NET MVC的Web Application后,默认的情况下,项目的目录结构如下: App_Data :这个目录跟我们一般的ASP.NET website是一样的,用于存放数据. ...

  2. oracle之spool详细使用总结

    今天实际项目中用到了spool,发现网上好多内容不是很全,自己摸索了好半天,现在总结一下. 一.通过spool 命令,可以将select 数据库的内容写到文件中,通过在sqlplus设置一些参数,使得 ...

  3. ACM2030_机内码

    /* 汉字统计 问题说明 统计给定文本文件中汉字的个数.   输入 输入文件首先包含一个整数Ñ,表示测试实例的个数,然后是Ñ段文本.   产量 对于每一段文本,输出其中的汉字的个数,每个测试实例的输出 ...

  4. about云开发虚拟化资源汇总,持续更新

    H3C实验手册H3C实验手册内容包括:1.帧中继典型配置举例一2.典型访问列表和地址转换综合应用配置案例3.交换机基本配置4.轮循DCC配置举例5.X.25典型配置举例6.MultiLink PPP配 ...

  5. sudo 和 sudoers设置

    转: http://www.cnblogs.com/zhuowei/archive/2009/04/13/1435190.html sudo是linux下常用的允许普通用户使用超级用户权限的工具,允许 ...

  6. 使用 AppFuse 的七个理由

    mvn -e  archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfus ...

  7. 问题-delphi在某电脑(win7)上是界面超乱 DPL

    问题现象:本机运行正常,但是在WIN7或个别的XP上,界面显示控件大小不一,界面超乱 问题原因:可以百度“delphi dpi”或者“delphi 控件自适应分辨率” 问题处理:将窗体的Scaled设 ...

  8. 问题-Delphi不能进行调试模式

    问题现象:delphi不能进行调试模式 问题原因:可能是防火墙的原因,我有一次在电脑清理时,把delphi的调试程序名放在了360的黑名单中,按F9后,无法调试. 问题处理:你懂的(要不白名单,要不你 ...

  9. 问题-[Delphi]无法设置断点

    问题现象: 今天突然发现不知何时起DELPHI7除了.dpr文件外,其余各Unit都无法设置断点.即在设计状态下设置了断点,在运行后出现的无效断点!百思不得其解...后查了许多资料,花了两个小时才搞好 ...

  10. 【面试虐菜】—— MongoDB知识整理

    为什么我们要使用MongoDB? 特点: 高性能.易部署.易使用,存储数据非常方便.主要功能特性有: 面向集合存储,易存储对象类型的数据. 模式自由. 支持动态查询. 支持完全索引,包含内部对象. 支 ...