windows程序设计(C语言版)第12章-剪贴簿(4)
当这三种格式的资料同时位於剪贴簿上时,用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字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [外语考试]管理学 第13章 沟通
- [外语考试]07、中高端客户销售流程--分类、筛选讲
- [外语考试]2015-2020年中国高筋饺子粉市场发展现
- [外语考试]“十三五”重点项目-汽车燃油表生产建
- [外语考试]雅培奶粉培乐系列适用年龄及特点
- [外语考试]九三学社入社申请人调查问卷
- [外语考试]等级薪酬体系职等职级表
- [外语考试]货物买卖合同纠纷起诉状(范本一)
- [外语考试]青海省实施消防法办法
- [外语考试]公交车语音自动报站系统的设计第3稿11
- [外语考试]logistic回归模型在ROC分析中的应用
- [外语考试]2017-2021年中国隔膜泵行业发展研究与
- [外语考试]神经内科下半年专科考试及答案
- [外语考试]园林景观设计规范标准
- [外语考试]2018八年级语文下册第一单元4合欢树习
- [外语考试]分布式发电及微网运行控制技术应用
- [外语考试]三人行历史学笔记:中世纪人文主义思想
- [外语考试]2010届高考复习5年高考3年联考精品历史
- [外语考试]挖掘机驾驶员安全生产责任书
- [外语考试]某211高校MBA硕士毕业论文开题报告(范
- 用三层交换机实现大中型企业VLAN方案
- 斯格配套系种猪饲养管理
- 涂层测厚仪厂家直销
- 研究生学校排行榜
- 鄱阳湖湿地景观格局变化及其驱动力分析
- 医学基础知识试题库
- 2010山西省高考历年语文试卷精选考试技
- 脉冲宽度法测量电容
- 谈高职院校ESP教师的角色调整问题
- 低压配电网电力线载波通信相关技术研究
- 余额宝和城市商业银行的转型研究
- 篮球行进间运球教案
- 气候突变的定义和检测方法
- 财经大学基坑开挖应急预案
- 高大支模架培训演示
- 一种改进的稳健自适应波束形成算法
- 2-3-鼎视通核心人员薪酬股权激励管理手
- 我国电阻焊设备和工艺的应用现状与发展
- MTK手机基本功能覆盖测试案例
- 七年级地理教学课件上册第四章第一节