资源预览内容
第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
第9页 / 共9页
亲,该文档总共9页全部预览完了,如果喜欢就下载吧!
资源描述
下载第1 7章 用剪贴板共享信息本章内容: 剪贴板基础 创建你自己的剪贴板格式 以前,人类只为生存而奋斗。人们住在黑暗的山洞里,用长矛和石块打猎谋生,以喊叫和手势进 行交流。他们崇拜火,因为火给他们带来光明。随着时代的发展,人们现在使用计算机进行交流。起 初,由于受到硬件和软件的限制,计算机在同一时刻只能运行一个应用程序。因此,要想共享信息只 有一个办法,就是把信息保存到硬盘上,然后再复制到其他机器上。 今天,硬件和软件都有了改进。在Windows 95/98和Windows NT/2000等操作系统下都能够同时运 行多个应用程序,使得计算机用户的生活更加轻松、更有创造性。 Wi n d o w s带来的一个好处是,在同 一台计算机中运行的应用程序之间可以共享信息。Wi n 3 2剪贴板和动态数据交换( D D E )是早期的两个共 享信息技术。对于用户来说,使用任一方法都可以方便地把信息从一个应用程序复制到另一个应用程 序。 本章向你介绍如何使用D e l p h i环境下的Wi n 3 2剪贴板。本书的前一版介绍过 D D E,但是,有了功 能强大的信息交换技术如C O M后,我们不想再使用以前的笨方法。在稍后的第2 3章“C O M和A c t i v e X” 中,我们将深入讨论C O M。但是要在应用程序间进行简单的信息共享,剪贴板仍不失为一个实用的解 决办法。17.1 剪贴板基础如果你是一个有经验的Wi n d o w s程序员,对Wi n 3 2剪贴板应该很熟悉至少在功能上。如果你是 一个Wi n d o w s编程新手,但用过Wi n d o w s,那么可能使用过剪贴板,但是并不知道它是怎样实现的。 几乎所有带编辑( E d i t )菜单的应用程序都能使用剪贴板。究竟什么是剪贴板呢?简单来说,剪贴板 就是一块内存区域和一套 Win32 API函数,通过这些函数,应用程序可在这块内存区域上保存和获取 信息。例如,你可以从D e l p h i编辑器中复制部分源代码并粘贴到Wi n d o w s记事本或其他编辑器内。 为什么Wi n 3 2需要一套特殊的函数和消息来操纵剪贴板呢?因为,向剪贴板复制数据,并不只是 分配一块内存区域并将数据放到该区域中,还需要让其他应用程序知道数据如何读取、数据格式是否 是它支持的。Wi n 3 2负责内存管理,你只管执行复制、粘贴和查询等操作就可以了。剪贴板格式 Wi n 3 2支持2 5种预定义格式,应用程序可从剪贴板复制和粘贴这些格式的数据。下面是常 用的几种格式: CF_BITMAP位图数据。 CF_DIB带调色板的位图数据。 CF_PALETTE调色板。 CF_TEXT字符数组,每行结尾有回车/换行标志。这是最常用的格式。 如果你还想知道其他不常用的格式,可以参考Win32 API在线帮助的“S e t C l i p b o a r d D a t a” 部分。此外,Win32允许你定义你自己的私有剪贴板格式,如本章稍后演示的。在D e l p h i之前,不得不直接调用各种剪贴板函数,还需要保证应用程序不受剪贴板内容的错误影 响。有了D e l p h i,只需要使用一个叫C l i p b o a r d的全局变量即可。C l i p b o a r d是一个封装Wi n 3 2剪贴板的 D e l p h i类。17.1.1 剪贴板对文本操作第1 6章“M D I应用程序”中,我们已经介绍了如何使用剪贴板来操作文本,特别是必须在 M D I应 用程序中处理文本编辑器。为此,我们创建菜单项目以执行文本的剪切、复制、粘贴、删除和选择等 操作。 在M D I应用程序中,编辑器T M e m o组件覆盖了窗口的客户区。T M e m o组件本身有函数与全局 C l i p b o a r d对象交互。这些函数是 C u t To C l i p B o a r d ( ),C o p y To C l i p B o a r d ( )和P a s t e F r o m C l i p B o a r d ( )。 C l e a r S e l e c t i o n ( )和S e l e c t A l l ( )不是必须用到的剪贴板函数,但它们使你能够选择文本以拷贝到剪贴板。 清单1 7 - 1列出了处理编辑菜单项目的事件处理过程。清单17-1 剪贴板对文本操作正如清单1 7 - 1所示的,只要调用T M e m o方法就能执行剪贴板函数。还能通过 C l i p b o r d . A s Te x t属性 手工把文本放到剪贴板中。在以前的1 6位环境下,A s Te x t属性被限制在2 5 5个字符之内,要想把更长的 字符串复制到剪贴板中,就不得不调用函数 S e t Te x t B u f ( )和G e t Te x t B u f ( )。在3 2位D e l p h i中,这个情况 是不存在的,因为A s Te x t属性现在是长字符串类型。你会注意到 S e t Te x t B u f ( )和G e t Te x t B u f ( )仍然保留 着。注意剪贴板函数GetTextBuf()和SetTextBuf()使用Pascal PChar类型的缓冲区来传递和接收剪贴 板的数据。在使用这些函数时,要转换长字符串为Pchar。17.1.2 剪贴板对位图操作剪贴板也能够复制和粘贴图像。你可以在相同的 M D I例子程序中看到它的实现。清单 1 7 - 2列出了 执行剪贴板操作的事件处理过程。清单17-2 剪贴板对位图操作5 4 0第二部分高 级 技 术下载提示 为了访问全局变量Clipboard,你必须在使用剪贴板单元的uses子句中包含ClipBrd。在清单1 7 - 2中,事件处理过程m m i C o p y C l i c k ( )调用了C l i p b o a r d . A s s i g n ( )方法来把图像复制到剪贴 板中。用这个方法,你可以把图像粘贴到另一个支持C F _ B I T M A P格式的Wi n 3 2应用程序中,如 Windows Paint(PBrush.EXE)。 m m i P a s t e C l i c k ( )调用I m a g e . A s s i g n ( )方法从剪贴板中复制图像并相应重新调整滚动条。注意C F _ P I C T U R E不是标准的Wi n 3 2剪贴板格式。相反,它是D e l p h i应用程序独有的格式, 用于判断剪贴板中的数据是否与T P i c t u r e兼容,如位图和图元文件( m e t a f i l e )。如果你想注册自 己的图形格式,T P i c t u r e将支持这个格式。在D e l p h i在线帮助中,你可以进一步查找T P i c t u r e以 获取与TPicture兼容格式有关的信息。17.2 创建你自己的剪贴板格式假设我们正在使用一个地址输入程序。如果正要输入的记录与前一条记录只有细微的差别,方便 的做法是复制前一个记录的内容并将其粘贴到当前记录,而不是一个字段一个字段地再输入。可以在 其他应用程序中采用同样的方法下一个例子将介绍如何创建一个感知 Wi n 3 2剪贴板的对象,它能够把 自己的特殊格式的数据保存到剪贴板。还能学到怎样保存诸如 C F _ T E X T格式的信息,这样就能够在其 他支持C F _ T E X T格式的应用程序中获取同样的数据。17.2.1 创建一个感知剪贴板的对象你可能会想到,自定义剪贴板格式的一种方法是创建一个了解新定义格式的 T C l i p b o a r d派生类, 这个特殊的T C l i p b o a r d类要包含处理自定义格式的特殊方法。虽然这样的类可以解决某些特殊的格式, 但是当需要其他格式或重定义数据格式时,重复这个工作将是非常乏味的。如果 7 0个不同的厂商为各 自的自定义剪贴板格式提供自己的 T C l i p b o a r d派生类,即使只使用其中的两个格式也会出现问题,因 为它们之间会发生冲突。 一个比较好的办法是定义一个对象把数据包装起来,并使它与剪贴板相联系。剪贴板的这种独有 模式与B o r l a n d使用的D e l p h i组件方法相同。T M e m o组件知道如何把数据放到剪贴板中,正如T I m a g e组 件知道如何把数据放到剪贴板中一样。所有组件使用相同的 T C l i p b o a r d对象,因此没有冲突。下面我 们将介绍这个方法,它定义一种剪贴板格式,该剪贴板格式大致是一个具体人的名字、年龄和出生日 期等信息的记录。清单1 7 - 3列出了定义数据的代码和从剪贴板复制和粘贴数据的方法。清单17-3 自定义剪贴板数据的单元第1 7章用剪贴板共享信息5 4 1下载5 4 2第二部分高 级 技 术下载这个单元执行了几项任务。首先,它调用 R e g i s t e r C l i p b o a r d F o r m a t ( )函数注册了Wi n 3 2剪贴板的新 格式并返回这个新格式的标识号。任何其他函数若注册了相同的格式,调用这个函数会得到同样的返 回值。新格式将出现在剪贴板格式列表中,此格式列表可被 C l i p b o a r d . F o r m a t属性访问。 这个单元还定义了一个记录T D a t a R e c和一个对象,该记录包含了放到剪贴板的数据,而对象封装第1 7章用剪贴板共享信息5 4 3下载了这个记录。T D a t a R e c有一个字符串域用于存储姓名,一个整型域用于存储年龄,还有一个T D a t a Ti m e 类型域用于存储出生日期。 T D a t a对象封装了T D a t a R e c记录,并且定义了两个方法:C o p y To C l i p b o a r d ( )和G e t F r o m C l i p b o a r d ( )。 TData. CopyTo C l i p b o a r d ( )方法以C F _ D D G D ATA和C F _ T E X T两种格式把T D a t a . R e c域的内容放到剪 贴板上。C F _ T E X T是一个已定义的剪贴板格式。TData. Rec域的文本将连接成一个字符串,域与域之 间由回车 /换行隔开,然后放到剪贴板中。在存放之前,非字符串类型的域已转换成字符串类型。 C l i p b o a r d . S e t A s H a n d l e ( )先要把给定的句柄存放到剪贴板中,格式由参数指定。这里,这个参数就是新 定义的剪贴板格式C F _ D D G D ATA。 然而,在调用C l i p b o a r d . S e t A s H a n d l e ( )之前,需要准备一个有效的 T H a n d l e句柄以传递给S e t A s - H a n d l e ( )。这个句柄代表被放到剪贴板的数据所在的内存块,参见“使用 T H a n d l” 。下列代码让Wi n 3 2 系统分配S i z e O f ( T D a t a R e c )个字节的可移动内存,如果必要的话,同时返回变量 D a t a的内存句柄:下列语句可获得该内存的指针:调用M o v e ( )函数就可把数据放到该内存块中。在剩下的代码行中,用 Clipboard. Open ()方法打开 剪贴板,以防止其他应用程序向剪贴板送数据:一般地,不需要调用 O p e n ( ),除非要把多种格式的数据送到剪贴板中。这是因为,每次通过 C l i p B o a r d . S e t Te x t B u f ( )等方法和C l i p B o a r d . A s Te x t ( )等属性使用剪贴板时,剪贴板会
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号