教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 外语考试 >

windows程序设计(C语言版)第12章-剪贴簿(4)

来源:网络收集 时间:2025-09-14
导读: 当这三种格式的资料同时位於剪贴簿上时,用CF_TEXT、CF_BITMAP或CF_METAFILEPICT参数呼叫IsClipboardFormatAvailable将传回TRUE。通过下列呼叫程式可以存取这些代码: hGlobalText = GetClipboardData (CF_TEXT) ;

当这三种格式的资料同时位於剪贴簿上时,用CF_TEXT、CF_BITMAP或CF_METAFILEPICT参数呼叫IsClipboardFormatAvailable将传回TRUE。通过下列呼叫程式可以存取这些代码:

hGlobalText = GetClipboardData (CF_TEXT) ;

hBitmap = GetClipboardData (CF_BITMAP) ;

hGlobalMFP = GetClipboardData (CF_METAFILEPICT) ;

下一次程式呼叫EmptyClipboard时,Windows将释放或删除剪贴簿上保留的所有三个代号。

在将不同的文字格式、不同的点阵图格式或者不同的metafile格式添加到剪贴簿时,不要使用这种技术。只使用一种文字格式、一种点阵图格式以及一种metafile格式。就像我所说的那样,Windows将在CF_TEXT、CF_OEMTEXT和CF_UNICODETEXT之间转换,也可以在CF_BITMAP和CF_DIB之间,以及在CF_METAFILEPICT和CF_ENHMETAFILE之间进行转换。

透过首先打开剪贴簿,然後呼叫EnumClipboardFormats,程式可以确定剪贴簿储存的所有格式。开始时设定变数iFormat为0:

《Windows程序设计(第5版 珍藏版)》是一本经典的Windows编程圣经,曾经伴随着近50万Windows程序员步入编程殿堂,成长为IT时代的技术精英。

iFormat = 0 ;

OpenClipboard (hwnd) ;

现在从0值开始逐次进行连续的EnumClipboardFormats呼叫。函式将为目前在剪贴簿中的每种格式传回一个正的iFormat值。当函式传回0时,表示完成:

while (iFormat = EnumClipboardFormats (iFormat))

{

各个iFormat值的处理方式

}

CloseClipboard () ; 您可以通过下面的呼叫来取得目前在剪贴簿中之不同格式的个数:

iCount = CountClipboardFormats () ;

延迟提出

当把资料放入剪贴簿中时,一般来说要制作一份资料的副本,并将包含这份副本的记忆体块代号传给剪贴簿。对非常大的资料项目来说,这种方法会浪费记忆体空间。如果使用者不想把资料粘贴到另一个程式里,那么,在被其他内容取代之前,它将一直占据著记忆体空间。

通过使用一种叫做「延迟提出」的技术可以避免这个问题。实际上,直到另一个程式需要资料,程式才提供这份资料。为此,不将资料代号传给Windows,而是在SetClipboardData呼叫中使用NULL:

OpenClipboard (hwnd) ;

EmptyClipboard () ;

SetClipboardData (iFormat, NULL) ;

CloseClipboard () ;

可以有多个使用不同iFormat值的SetClipboardData呼叫,对其中某些呼叫可使用NULL值。而对其他一些则使用实际的代号值。

前面的过程比较简单,以下的过程就要稍微复杂一些了。当另一个程式呼叫GetClipboardData时,Windows将检查那种格式的代号是否为NULL。如果是,Windows将给「剪贴簿所有者」(您的程式)发送一个讯息,要求取得资料的实际代号,这时您的程式必须提供这个代号。

更具体地说,「剪贴簿所有者」是将资料放入剪贴簿的最後一个视窗。当一个程式呼叫OpenClipboard时,Windows储存呼叫这个函式时所用的视窗代号,这个代号标示打开剪贴簿的视窗。一旦收到一个EmptyClipboard呼叫,Windows就使这个视窗作为新的剪贴簿所有者。

使用延迟提出技术的程式在它的视窗讯息处理程式中必须处理三个讯息:WM_RENDERFORMAT、WM_RENDERALLFORMATS和WM_DESTROYCLIPBOARD。当另一个

《Windows程序设计(第5版 珍藏版)》是一本经典的Windows编程圣经,曾经伴随着近50万Windows程序员步入编程殿堂,成长为IT时代的技术精英。

程式呼叫GetClipboardData时,Windows给视窗讯息处理程式发送一个WM_RENDERFORMAT讯息,wParam的值是所要求的格式。在处理WM_RENDERFORMAT讯息时,不要打开或清空剪贴簿。为wParam所指定的格式建立一个整体记忆体块,把数据传给它,并用正确的格式和相应代号呼叫SetClipboardData。很明显地,为了在处理WM_RENDERFORMAT时正确地构造出此资料,需要在程式中保留这些资讯。当另一个程式呼叫EmptyClipboard时,Windows给您的程式发送一个WM_DESTROYCLIPBOARD讯息,告诉您不再需要构造剪贴簿资料的资讯。您的程式不再是剪贴簿的所有者。

如果程式在它自己仍然是剪贴簿所有者的时候就要终止执行,并且剪贴簿上仍然包含著该程式用SetClipboardData设定的NULL资料代号,它将收到WM_RENDERALLFORMATS讯息。这时,应该打开剪贴簿,清空它,把资料载入记忆体块中,并为每种格式呼叫SetClipboardData,然後关闭剪贴簿。WM_RENDERALLFORMATS讯息是视窗讯息处理程式最後收到的讯息之一。它後面跟有WM_DESTROYCLIPBOARD讯息(由於已经提出了所有资料),然後是正常的WM_DESTROY讯息。

如果您的程式只能向剪贴簿传输一种格式的资料(例如文字),那么您可以把WM_RENDERALLFORMATS和WM_RENDERFORMAT处理结合在一起。这些程式码应该类似下面这样: case WM_RENDERALLFORMATS :

OpenClipboard (hwnd) ;

EmptyClipboard () ;

case WM_RENDERFORMAT :

// 将文字放入整体记忆体块

SetClipboardData (CF_TEXT, hGlobal) ;

if (message == WM_RENDERALLFORMATS)

CloseClipboard () ;

return 0 ; // fall through

如果您的程式使用好几种剪贴簿格式,那么您可能想为wParam所要求的格式处理WM_ RENDERFORMAT。除非程式在存放构造资料所需的资讯时遇到困难,否则不需要处理WM_DESTROYCLIPBOARD讯息。

自订资料格式

到目前为止,我们仅处理了Windows定义的标准剪贴簿资料格式。但是,您可能想用剪贴簿来储存「自订资料格式」。许多文书处理程式使用这种技术来储存包含著字体和格式化资讯的文字。

初看之下,这个概念似乎是没有意义的。如果剪贴簿的作用是在应用程式

《Windows程序设计(第5版 珍藏版)》是一本经典的Windows编程圣经,曾经伴随着近50万Windows程序员步入编程殿堂,成长为IT时代的技术精英。

之间传送资料,那么,为什么剪贴簿中要含有只有一个应用程式才能理解的资料呢?答案很简单:剪贴簿允许在同一个程式的内部(或者可能在一个程式中的不同执行实体之间)传送资料。很明显地,这些执行实体能理解它们自己的自订资料格式。

有几种使用自订资料格式的方法。最简单的方法用到一种表面上是标准剪贴簿格式(文字、点阵图或metafile)的资料,可是该资料实际上只对您的程式有意义。这种情况下,在SetClipboardData和GetClipboardData呼叫中可使用下列wFormat值:CF_DSPTEXT、CF_DSPBITMAP、CF_DSPMETAFILEPICT或CF_DSPENHMETAFILE(字母DSP代表「显示器」)。这些格式允许Windows按文字、点阵图或metafile来浏览或显示资料。但是,另一个使用常规的CF_TEXT、CF_BITMAP、CF_DIB、CF_METAFILEPICT或CF_ENHMETAFILE格式呼叫GetClipboardData的程式将不能取得这个资料。

如果用其中一种格式把资料放入剪贴簿中,则必须使用同样的格式读出资料。但是,如何知道资料是来自程式的另一个执行实体,还是来自使用其中某种资料格式的另一个程式呢?这里有一种方法,可以透过下列呼叫首先获得剪贴簿所有者:

hwndClipOwner = GetClipboardOwner () ;

然後可以得到此视窗代号的视窗类别名称: TCHAR szClassName [32] ;

//其他行程式

GetClassName (hwndClipOwner, szClassName, 32) ;

如果类别名称与程式名称相同,那么资料是由程 …… 此处隐藏:3675字,全部文档内容请下载后查看。喜欢就下载吧 ……

windows程序设计(C语言版)第12章-剪贴簿(4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/116449.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)