Visual C++大学教程 教学课件 ppt 作者 冯博琴 第10章 打印 动态链接库及多线程技术

上传人:w****i 文档编号:94772184 上传时间:2019-08-11 格式:PPT 页数:76 大小:1.12MB
返回 下载 相关 举报
Visual C++大学教程 教学课件 ppt 作者 冯博琴 第10章 打印 动态链接库及多线程技术_第1页
第1页 / 共76页
Visual C++大学教程 教学课件 ppt 作者 冯博琴 第10章 打印 动态链接库及多线程技术_第2页
第2页 / 共76页
Visual C++大学教程 教学课件 ppt 作者 冯博琴 第10章 打印 动态链接库及多线程技术_第3页
第3页 / 共76页
Visual C++大学教程 教学课件 ppt 作者 冯博琴 第10章 打印 动态链接库及多线程技术_第4页
第4页 / 共76页
Visual C++大学教程 教学课件 ppt 作者 冯博琴 第10章 打印 动态链接库及多线程技术_第5页
第5页 / 共76页
点击查看更多>>
资源描述

《Visual C++大学教程 教学课件 ppt 作者 冯博琴 第10章 打印 动态链接库及多线程技术》由会员分享,可在线阅读,更多相关《Visual C++大学教程 教学课件 ppt 作者 冯博琴 第10章 打印 动态链接库及多线程技术(76页珍藏版)》请在金锄头文库上搜索。

1、第10章 打印、动态链接库及多线程技术,10.1 打 印 技 术 MFC通过CView类为应用程序提供打印及打印预览的功能。,10.1.1 映射模式与坐标系统,1固定比率与可变比率映射模式 映射模式的比率可分为固定比率和可变比率。 (1)“固定比率”映射模式 “固定比率”映射模式包含以下映射模式:,MM_LOMETRIC MM_HIMETRIC MM_LOENGLISH MM_HIENGLISH MM_TWIPS,(2)“可变比率”映射模式,“可变比率”映射模式包括MM_ANISOTROPIC和MM_ISOTROPIC两种映射模式。,MM_ISOTROPIC映射模式:该映射模式在X轴和Y轴使用

2、相同的单位长度,X和Y始终保持11比率,所以对保留图形的形状非常有用,如在屏幕上画了一个圆形,无论比例因子如何改变,始终还是圆形。,MM_ANISOTROPIC映射模式:该映射模式允许改变X和Y的比率为任意值,如在屏幕上画了一个圆形,当比例因子改变后,圆形会变成椭圆形。,可以用下面的公式实现逻辑单位到设备单位的转换。 X比例因子 = X视口长度/X窗口长度。 Y比例因子 = Y视口长度/Y窗口长度。 设备X = 逻辑XX比例因子+X原点偏移量。 设备Y = 逻辑YY比例因子+Y原点偏移量。,2MM_TEXT映射模式,MM_TEXT映射模式又称为文本映射模式,是系统默认使用的映射模式,每个逻辑单

3、位映射为一个设备像素,所以在逻辑坐标和设备坐标之间不存在任何的缩放。,3设置逻辑与设备坐标,设备环境本身提供了一些函数实现逻辑坐标和设备坐标间的互换。,(1)DPtoHIMETRIC函数:用于将设备坐标单位转换为HIMETRIC坐标单位,该函数以像素为单位进行转换。 语法: void DPtoHIMETRIC( LPSIZE lpSize ) const;,(2)DptoLP函数:可以接受一个指向CPoint类或者CRect类对象的指针作为参数,然后把它所指向的对象从设备单位转换为逻辑单位。,语法: void DPtoLP( LPPOINT lpPoints, int nCount = 1 )

4、 const; void DPtoLP( LPRECT lpRect ) const; void DPtoLP( LPSIZE lpSize ) const;,(3)HIMETRICtoDP函数:将HIMETRIC单位转换为设备单位,该函数以像素为单位进行转换。 语法: void HIMETRICtoDP( LPSIZE lpSize ) const;,(4)HIMETRICtoLP函数:将HIMETRIC单位转换为逻辑单位,该函数以像素为单位进行转换。 语法: void HIMETRICtoLP( LPSIZE lpSize ) const;,(5)LptoDP函数:将逻辑单位转换为设备单位

5、。该函数以点为单位进行转换。 语法: void LPtoDP( LPPOINT lpPoints, int nCount = 1 ) const; void LPtoDP( LPRECT lpRect ) const; void LPtoDP( LPSIZE lpSize ) const;,(6)LPtoHIMETRIC函数:将逻辑单位转换为HIMETRIC单位,该函数以像素为单位进行转换。 语法: void LPToHIMETRIC( LPSIZE lpSize ) const;,10.1.2 打印控制,1获取打印纸的左边距和上边距 首先通过GetDevMode()函数获取DEVMODE结构

6、,通过DEVMODE结构 的成员变量可以自定义打印纸的大小。,2控制打印方向,在打印时经常会遇到这样的问题,待打印的数据超出了打印纸的宽度,导致在打印时只有部分数据被打印出来。 通常可以有两种方式解决,一种是折行打印,另一种是横向打印。,3设置打印纸大小,Windows系统中提供了许多规格的打印纸,但实际应用中,这些规格的纸张并不能满足需求,因此,在设计程序时,需要自定义纸张的大小。,4设置打印份数,CPrintDialog封装了一个PRINTDLG结构的变量,保存了该对话框的所有信息。 该结构的主要成员如下:,typedef struct tagPD DWORD lStructSize; H

7、WND hwndOwner; HANDLE hDevMode; HANDLE hDevNames; HDC hDC;,DWORD Flags; WORD nFromPage; WORD nToPage; WORD nMinPage; WORD nMaxPage; WORD nCopies; HINSTANCE hInstance; DWORD lCustData;,LPPRINTHOOKPROC lpfnPrintHook; LPSETUPHOOKPROC lpfnSetupHook; LPCTSTR lpPrintTemplateName; LPCTSTR lpSetupTemplateNa

8、me; HANDLE hPrintTemplate; HANDLE hSetupTemplate; PRINTDLG;,10.1.3 打印实例,1设计报表打印程序 通过CPrintDialog对话框封装的成员函数可以对打印机的设备环境进行设置。,2设计单据打印报表 通过CPrintDialog对话框封装的成员函数可以对打印机的设备环境进行设置,然后通过打印机DC将要打印的内容绘制到打印纸上。,10.2 动态链接库技术,10.2.1 链接库概述 1链接库的构成 DLL是动态链接库(Dynamic Linkable Library)的简称。,DLL的结构和应用程序很相近,每个应用程序都有一个入口函

9、数WinMain,而每个DLL也有一个入口函数DllMain;应用程序中含有资源,而DLL中也含有资源;应用程序中含有数据段和代码段,DLL中也有数据段和代码段。,DLL可以像应用程序一样使用回调(CALLBACK)函数,也可以使用自定义消息。,DLL中必须有一个入口函数DllMain,它的主要框架如下。 BOOL APIENTRY DllMain(HANDLE hModule, /动态库被调用时一个指向自己的句柄 DWORD ul_reason_for_call, /动态库被调用原因的标志,LPVOID lpReserved /系统所保留 switch(ul_reason_for_call)

10、 ,case DLL_PROCESS_ATTACH: /进程被调用 case DLL_THREAD_ATTACH: /线程被调用 case DLL_THREAD_DETACH: /进程被停止,case DLL_PROCESS_DETACH: /线程被停止 return TRUE; ,2动态链接库和静态链接库,(1)静态链接库 静态链接库的英文全称是Static Link Library,它经常是一些相对小的,比较稳定的函数库。,(2)动态链接库,动态链接库的英文全称是Dynamic Link Library,简称DLL。 动态链接库可以在需要的时候动态加载到内存中,而且动态链接库在内存中只有一

11、个实例,如果一个应用程序调用了DLL,其他应用程序也调用该DLL 。,那么第2个应用程序只是将DLL在内存中的地址映射到自己的进程地址空间中;系统中有一个计数器,记录有多少个应用程序在使用DLL 。,10.2.2 链接库的创建与使用,1通过向导创建静态链接库 Visual C+中提供了创建静态链接库的工程向导,运行Visual C+菜单“File”/“New”打开New对话框,如图10.9所示。,图10.9 “New”对话框,2使用静态链接库,要测试上面的静态链接库,需要新建一个MFC对话框工程,工程名为testDLL,在对话框上添加编辑框控件、按钮控件、静态文本框控件,设计对话框如图10.1

12、0所示。,图10.10 测试链接库的应用程序,可以通过工程设置对话框来加入对静态链接库的引用,工程设置对话框通过Visual C+ 的“Project/Settings”菜单来打开。 打开工程设置对话框,选择Link选项卡,在“Object/library modules”编辑框中输入需要引用的静态链接库文件。 本实例使用StaticLib.lib,如图10.11所示。,图 10.11 导入静态链接库文件,3创建Win32动态链接库,创建Win32动态链接库,需要使用Win32 Dynamic_link Library工程向导,向导需要用户设置一步,主要是设置An empty DLL proj

13、ect、A simple DLL project、A DLL that exports some symbols等3种工程类型。,An empty DLL project向导创建一个不带任何文件的空工程。,A simple DLL project创建一个含有3个文件的工程,分别是带有DllMain函数的实现文件、StdAfx.cpp和StdAfx.h。,A DLL that exports some symbols创建一个可以导出类的链接库工程。,10.2.3 链接库的导出,1动态链接库的命名改编 在创建动态链接库中,为了导出动态链接库中的函数,在函数定义前增加了extern “C“ _dec

14、lspec(dllexport)语句,其实只增加_declspec(dllexport)语句就可以导出函数。,但此时的动态链接库只能进行隐式调用,如果使用动态加载可能会出错,因为只使用_declspec(dllexport)语句,导出的函数名称会发生变化,使用命令dumpbin -exports查看没有extern “C“语句生成的DynicDLL.dll文件,此时导出的函数名变为如下面代码所示的名称:,1 0 0000100A ?GetMaxCommDivYAHHHZ 2 1 00001005 ?GetMinCommMulYAHHHZ,使用extern “C“语句后名称不会发生改变,如下面的

15、代码所示: 1 0 0000100A GetMaxCommDiv 2 1 00001005 GetMinCommMul,2使用dumpbin工具查看链接库,dumpbin.exe命令可以用来查看动态链接库文件的一些信息。,表10.1 常用命令选项,3使用DEF文件导出函数名称,如果使用DEF文件,就可以不使用extern “C“ _declspec( dllexport )来声明函数。,4隐式调用与动态加载,通过隐式链接,无论是调用动态链接库还是调用静态链接库,都是在编译的时候就对链接库进行链接。,动态加载主要是通过LoadLibrary和GetProcAddress两个函数来实现。,(1)L

16、oadLibrary,用来装载模块的函数,动态链接库和可执行程序都是模块,如果函数执行成功,返 回模块句柄,这个句柄会在GetProcAddress函数中使用。,语法: HINSTANCE LoadLibrary( LPCTSTR lpLibFileName );,(2)GetProcAddress,获得模块中的函数地址。 语法: FARPROC GetProcAddress( HMODULE hModule, LPCSTR lpProcName );,5从动态链接库中导出类,动态链接库可以导出C+类及C+类的成员函数。,10.3 多线程技术,10.3.1 深入理解线程 线程是指进程内的一个执行单元,也是进程内的可调度实体。 单个进程在任何给定时刻,可能有不止一个线程正在运行。,但进程启动的同时会启动一个线程,该线程被称作主线程或执行线程。 一个进程除启动主线程外还可以启动多个线程,每个

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号