教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 范文大全 > 行业范文 >

经典图书《windows程序设计(第5版)》第12章

来源:网络收集 时间:2026-05-15
导读: 经典图书《windows程序设计(第5版)》第12章 Microsoft Windows剪贴簿允许把数据从一个程序传送到另一个程序中。它的原理相对而言比较简单,把数据存放到剪贴簿上的程序或从剪贴簿上取出数据的程序都无须太多的负担。Windows 98和Microsoft Windows NT都提供

经典图书《windows程序设计(第5版)》第12章

Microsoft Windows剪贴簿允许把数据从一个程序传送到另一个程序中。它的原理相对而言比较简单,把数据存放到剪贴簿上的程序或从剪贴簿上取出数据的程序都无须太多的负担。Windows 98和Microsoft Windows NT都提供了剪贴簿浏览程序,该程序可以显示剪贴簿的目前内容。

许多处理文件或者其它数据的程序都包含一个「Edit」菜单,其中包括「Cut」、「Copy」和「Paste」选项。当使用者选择「Cut」或者「Copy」时,程序将数据传送给剪贴簿。这个数据使用某种格式,如文字、位图(一种按位排列的矩形数组,其中的位与平面显示的图素相对应)或者metafile(用二进制元数值内容表示的绘图命令集)等。当使用者从菜单中选择「Paste」时,程序检查剪贴簿中包含的数据,看看使用的是否是程序可以接受的一种格式。如果是,那么数据将从剪贴簿传送到程序中。

如果使用者不发出明确的指令,程序就不能把数据送入或移出剪贴簿。例如,在某个程序中执行剪下或复制(或者按Ctrl-X及Ctrl-C)操作的使用者,应该能够假定数据将储存在剪贴簿上,直到下次剪下或复制操作为止。

回忆一下第十和第十一章所示的POPPAD程序的修订版中,我们加上了「Edit」菜单,但是在那边这菜单的作用只是发送消息给编辑控件而已。多数情况下,处理剪贴簿并不方便,您必须自己呼叫剪贴簿传输函数。 本章集中讨论将文字传入和移出剪贴簿。在后面的章节里,我将向您展示如何用剪贴簿处理位图(第十四、十五和十六章)和metafile(第十八章)。

剪贴簿的简单使用

我们由分析把数据传送到剪贴簿(剪下或复制)和存取剪贴簿数据(粘贴)的程序代码开始。

标准剪贴簿数据格式

Windows支持不同的预先定义剪贴簿格式,这些格式在WINUSER.H定义成以CF为前缀的标识符。

首先介绍三种能够储存在剪贴簿上的文字数据型态,以及一个与剪贴簿格式相关的数据型态:

CF_TEXT以NULL结尾的ANSI字符集字符串。它在每行末尾包含一个carriage return和linefeed

字符,这是最简单的剪贴簿数据格式。传送到剪贴簿的数据存放在整体内存块中,并且是利用内存块句柄进行传送的(我将简短地讨论此项概念)。这个内存块专供剪贴簿使用,建立它的程序不应该继续使用它。

CF_OEMTEXT含有文字数据(与CF_TEXT类似)的内存块。但是它使用的是OEM字符集。通常

Windows程序不必关心这一点;它只有与在窗口中执行MS-DOS程序一起使用剪贴簿时才会使用。

CF_UNICODETEXT含有Unicode文字的内存块。与CF_TEXT类似,它在每一行的末尾包含一个

carriage return和linefeed字符,以及一个NULL字符(两个0字节)以表示数据结束。

CF_UNICODETEXT只支援Windows NT。

CF_LOCALE一个国家地区标识符的句柄。表示剪贴簿文字使用的国别地区设定。

经典图书《windows程序设计(第5版)》第12章

下面是两种附加的剪贴簿格式,它们在概念上与CF_TEXT格式相似(也就是说,它们都是文字数据),但是它们不需要以NULL结尾,因为格式已经定义了数据的结尾。现在已经很少使用这些格式了:

CF_SYLK包含Microsoft 「符号连结」数据格式的整体内存块。这种格式用在Microsoft的

Multiplan、Chart和Excel程序之间交换数据,它是一种ASCII码格式,每一行都用carriage

return和linefeed结尾。

CF_DIF包含数据交换格式(DIF)之数据的整体内存块。这种格式是由Software Arts公司提出的,用

于把数据送到VisiCalc电子表格程序中。这也是一种ASCII码格式,每一行都使用carriage

return和linefeed结尾。

下面三种剪贴簿格式与位图有关。所谓位图就是数据位的矩形数组,其中的数据位与输出设备的图素相对应。 第十四和 第十五章将详细讨论位图以及这些位图剪贴簿的格式:

CF_BITMAP与设备相关的位图格式。位图是通过位图句柄传送给剪贴簿的。同样,在把这个位图传送

给剪贴簿之后,程序不应该再继续使用这个位图。

CF_DIB定义一个设备无关位图(在第十五章中描述)的内存块。这种内存块是以位图信息结构开始

的,后面跟着可用的颜色表和位图数据位。

CF_PALETTE调色盘句柄。它通常与CF_DIB配合使用,以定义与设备相关的位图所使用的颜色调色

盘。

在剪贴簿中,还有可能以工业标准的TIFF格式储存的位图数据:

CF_TIFF含有标号图像文件格式(TIFF)数据的整体内存块。这种格式由Microsoft、Aldus公司和

Hewlett-Packard公司以及一些硬件厂商推荐使用。这一格式可从Hewlett-Packard的网站上获得。

下面是两个metafile格式,我将在第十八章详细讨论。一个metafile就是一个以二进制格式储存的画图命令集:

CF_METAFILEPICT以旧的metafile格式存放的「图片」。 CF_ENHMETAFILE增强型metafile(32位Windows支持的)句柄。

最后介绍几个混合型的剪贴簿格式:

CF_PENDATA与Windows的笔式输入扩充功能联合使用。 CF_WAVE声音(波形)文件。 CF_RIFF使用资源交换文件格式(Resource Interchange File Format)的多媒体数据。

经典图书《windows程序设计(第5版)》第12章

CF_HDROP与拖放服务相关的文件列表。

内存配置

程序向剪贴簿传输一些数据的时候,必须配置一个内存块,并且将这块内存交给剪贴簿处理。在本书早期的程序中需要配置内存时,我们只需使用标准C执行时期链接库所支持的malloc函数。但是,由于在Windows中执行的应用程序之间必须要共享剪贴簿所储存的内存块,这时malloc函数就有些不适任这项任务了。

实际上,我们必须把早期Windows所开发的内存配置函数再拿出来使用,那时的操作系统在16位的实际模式内存结构中执行。现在的Windows仍然支持这些函数,您还可以使用它们,但不是必须使用这些函数就是了。 要用Windows API来配置一个内存块,可以呼叫:

此函数有两个参数:一系列可能的旗标和内存块的字节大小。函数传回一个HGLOBAL型态的句柄,称为「整体内存块句柄」或「整体句柄」。传回值为NULL表示不能配置足够的内存。

虽然GlobalAlloc的两个参数略有不同,但它们都是32位的无正负号整数。如果将第一个参数设定为0,那么您就可以更有效地使用旗标GMEM_FIXED。在这种情况下,GlobalAlloc传回的整体句柄实际是指向所配置内存块的指针。

如果不喜欢将内存块中的每一位都初始化为0,那么您也能够使用旗标GMEM,_ZEROINIT。在Windows表头文件中,简洁的GPTR旗标定义为GMEM_FIXED和GMEM_ZEROINIT旗标的组合:

下面是一个重新配置函数:

如果内存块扩大了,您可以用GMEM_ZEROINIT旗标将新的字节设为0。

下面是获得内存块大小的函数:

经典图书《windows程序设计(第5版)》第12章

释放内存块的函数:

在早期16位的Windows中,因为Windows不能在物理内存中移动内存块,所以禁止使用GMEM_FIXED旗标。在32位的Windows中,GMEM_FIXED旗标很常见。这是因为它将传回一个虚拟地址,并且操作系统也能够通过改变内存页映像表在物理内存中移动内存块。因此为16位的Windows写程序时,GlobalAlloc推荐使用…… 此处隐藏:9778字,全部文档内容请下载后查看。喜欢就下载吧 ……

经典图书《windows程序设计(第5版)》第12章.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/fanwen/982221.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)