使用Visual C++实现OLE剪贴板
南京市随园8-2号702室
王珂
---- 一、概述
---- 在Windows操作系统中存在两种剪贴板机制:Windows标准剪贴板和OLE剪贴板机制。
---- 标准的Windows剪贴板是一个被所有Windows应用程序共享的系统服务,因此它并没有自己的句柄或类。但你可以通过CWnd类的成员函数来管理剪贴板。
---- 自从OLE(Object Linking and Embedding,对象链接和嵌入)诞生之后,Windows操作系统中便出现了第二种剪贴板机制——OLE剪贴板机制。标准的Windows剪贴板API(Application Programming Interface,应用程序编程接口)依然可用,但是他已经被OLE数据传输机制来实现了。OLE支持UDT(Uniform Data Transfer,统一数据传输),并可以通过拖放操作实现剪贴板的剪切、复制和粘贴等操作。OLE剪贴板除了拥有标准Windows剪贴板的性能外,还支持传输用户自定义的剪贴板格式,并能够在传输数据时绑定OLE格式(如字体、字号等)。OLE剪贴板机制将成为更为主要的数据传输机制。
---- 本文将简要叙述标准Windows剪贴板的实现,并将重点放在讨论如何通过Visual C++实现OLE剪贴板上。
---- 二、选择适当的剪贴板机制
---- 在选择使用何种剪贴板机制时通常应遵循下面的原则:
---- 如果应用程序在将来又可能具有新的性能(比如现在只需要传输纯文本,但将来有可能需要另外传输字体等特性),那么使用OLE剪贴板。
---- 如果你正在使用一个OLE应用程序,或者你希望使用任何OLE特性(如拖放等)那么你应当使用OLE剪贴板机制。
---- 如果你提供了OLE格式(如字体、字号等),那么使用OLE剪贴板机制。
---- 三、使用Windows标准剪贴板
---- 大多数Windows下的应用程序支持剪切或复制数据到Windows剪贴板中以及从剪贴板粘贴数据至目的地。在这个过程中,剪贴板数据格式在多种应用程序之间发生了变化。系统构架仅仅通过实现一些有限的类来支持一些有限的剪贴板格式,下表列出了Windows标准剪贴板支持的格式(第一列“值”将在下面的程序代码中使用)。
值 含义CF_BITMAP 一个对应于位图的句柄(HBITMAP)。CF_DIB 一个包含BITMAPINFO结构并且跟着位图数据的内存对象。CF_DIF 数据交互格式CF_DSPBITMAP 有一个私有格式的位图显示格式。CF_DSPENHMETAFILE 有一个私有格式的增强的元文件的显示格式。CF_DSPMETAFILEPICT 有一个私有格式的元图显示格式。CF_DSPTEXT 有一个私有格式的文本显示格式。CF_ENHMETAFILE 一个增强的元文件(HENHMETAFILE结构)的句柄。CF_GDIOBJFIRST到 CF_GDIOBJLAST 应用软件定义的一系列GDI对象的整型值。CF_HDROP 一个HDROP类型的句柄,用来标识一列文件。CF_METAFILEPICT 一个使用METAFILEPICT结构定义的元图文件的句柄。CF_OEMTEXT 预定义的字符的文本格式,每一行都绑定一个CR-LF字符,并且用一个空字符表示数据结尾。CF_OWNERDISPLAY 剪贴板拥有者的显示格式,剪贴板的拥有者必须显示并且更新剪贴板的观察器窗口,并且接收WM_ASKCBFORMATNAME、WM_HSCROLLCLIPBOARD、WM_PAINTCLIPBOARD、WM_SIZECLIPBOARD以及 WM_VSCROLLCLIPBOARD等消息,hMem参数必需为NULL。CF_PALETTE 调色板的句柄CF_PRIVATEFIRST到CF_PRIVATELAST 私有的剪贴板格式的整型值。CF_RIFF 能够提交比CF_WAVE标准波表文件格式更为复杂的音频数据CF_SYLK 微软公司的SYLK(Symbolic Link,符号链接)格式CF_TEXT 文本格式CF_WAVE 使用一种标准波表文件格式如11kHz或22kHz等PCM(Pulse Code Modulation,脉冲编码调制器)提交音频数据。CF_TIFF TIFF图形格式CF_UNICODETEXT Unicode文本格式(注意:仅适用于Windows NT或Windows 2000操作系统)---- 表1 常用的标准剪贴板格式
---- 要编写一个实现剪切和复制命令的函数,就要在你的应用程序中实现选定操作;要编写一个实现粘贴命令的函数,就需要请求剪贴板来检测它是否包含你的应用程序能够支持的数据。下面的代码实现了复制命令,其它实现可仿照进行,在此不再赘言。






