windows程序设计(C语言版)第12章-剪贴簿(2)
为剪贴簿配置记忆体时,您应该以GMEM_MOVEABLE和GMEM_SHARE旗标呼叫GlobalAlloc函式。GMEM_SHARE旗标使得其他应用程式也可以使用那块记忆体。 将文字传送到剪贴簿
让我们想像把一个ANSI字串传送到剪贴簿上,并且我们已经有了指向这个字串的指标(pString)。现在希望传送这个字串的iLength字元,这些字元可能以NULL结尾,也可能不以NULL结尾。
首先,通过使用GlobalAlloc来配置一个足以储存字串的记忆体块,其中还包括一个终止字元NULL:
hGlobal = GlobalAlloc (GHND | GMEM_SHARE, iLength + 1) ;
如果未能配置到记忆体块,hGlobal的值将为NULL 。如果配置成功,则锁定这块记忆体,并得到指向它的一个指标: pGlobal = GlobalLock (hGlobal) ;
将字串复制到记忆体块中:
for (i = 0 ; i < wLength ; i++)
*pGlobal++ = *pString++ ;
由於GlobalAlloc的GHND旗标已使整个记忆体块在配置期间被清除为零,所以不需要增加结尾的NULL 。以下叙述为记忆体块解锁:
GlobalUnlock (hGlobal) ;
现在就有了表示以NULL结尾的文字所在记忆体块的记忆体代号。为了把它送到剪贴簿中,打开剪贴簿并把它清空:
OpenClipboard (hwnd) ;
EmptyClipboard () ; 利用CF_TEXT识别字把记忆体代号交给剪贴簿,关闭剪贴簿:
SetClipboardData (CF_TEXT, hGlobal) ;
CloseClipboard () ;
工作告一段落。
下面是关於此过程的一些规则:
在处理同一个讯息的过程中呼叫OpenClipboard和CloseClipboard。不需
《Windows程序设计(第5版 珍藏版)》是一本经典的Windows编程圣经,曾经伴随着近50万Windows程序员步入编程殿堂,成长为IT时代的技术精英。
要时,不要打开剪贴簿。
不要把锁定的记忆体代号交给剪贴簿。
当呼叫SetClipboardData後,请不要再继续使用该记忆体块。它不再属於使用者程式,必须把代号看成是无效的。如果需要继续存取资料,可以制作资料的副本,或从剪贴簿中读取它(如下节所述)。您也可以在SetClipboardData呼叫和CloseClipboard呼叫之间继续使用记忆体块,但是不要使用传递给SetClipboardData函式的整体代号。事实上,此函式也传回一个整体代号,必需锁定这些代码以存取记忆体。在呼叫CloseClipboard之前,应先为此代号解锁。
从剪贴簿上取得文字
从剪贴簿上取得文字只比把文字传送到剪贴簿上稍微复杂一些。您必须首先确定剪贴簿是否含有CF_TEXT格式的资料,最简单的方法是呼叫
bAvailable = IsClipboardFormatAvailable (CF_TEXT) ;
如果剪贴簿上含有CF_TEXT资料,这个函式将传回TRUE(非零)。我们在
第十章的POPPAD2程式中已使用了这个函式,用它来确定「Edit」功能表中「Paste」项是被启用还是被停用的。IsClipboardFormatAvailable是少数几个不需先打开剪贴簿就可以使用的剪贴簿函式之一。但是,如果您之後想再打开剪贴簿以取得这个文字,就应该再做一次检查(使用同样的函式或其他方法),以便确定CF_TEXT资料是否仍然留在剪贴簿中。
为了传送出文字,首先打开剪贴簿:
OpenClipboard (hwnd) ;
会得到代表文字的记忆体块代号:
hGlobal = GetClipboardData (CF_TEXT) ;
如果剪贴簿不包含CF_TEXT格式的资料,此代号就为NULL。这是确定剪贴簿是否含有文字的另一种方法。如果GetClipboardData传回NULL,则关闭剪贴簿,不做其他任何工作。
从GetClipboardData得到的代号并不属於使用者程式——它属於剪贴簿。仅在GetClipboardData和CloseClipboard呼叫之间这个代号才有效。您不能释放这个代号或更改它所引用的资料。如果需要继续存取这些资料,必须制作这个记忆体块的副本。
这里有一种将资料复制到使用者程式中的方法。首先,配置一块与剪贴簿资料块大小相同的记忆体块,并配置一个指向该块的指标:
pText = (char *) malloc (GlobalSize (hGlobal)) ;
再次呼叫hGlobal ,而hGlobal是从GetClipboardData呼叫传回的整体代
《Windows程序设计(第5版 珍藏版)》是一本经典的Windows编程圣经,曾经伴随着近50万Windows程序员步入编程殿堂,成长为IT时代的技术精英。
号。现在锁定代号,获得一个指向剪贴簿块的指标:
pGlobal = GlobalLock (hGlobal) ;
现在就可以复制资料了:
strcpy (pText, pGlobal) ;
或者,您可以使用一些简单的C程式码:
while (*pText++ = *pGlobal++) ;
在关闭剪贴簿之前先解锁记忆体块:
GlobalUnlock (hGlobal) ;
CloseClipboard () ;
现在您有了一个叫做pText的指标,以後程式的使用者就可以用它来复制文字了。
打开和关闭剪贴簿
在任何时候,只有一个程式可以打开剪贴簿。呼叫OpenClipboard的作用是当一个程式使用剪贴簿时,防止剪贴簿的内容发生变化。OpenClipboard传回BOOL值,它说明是否已经成功地打开了剪贴簿。如果另一个应用程式没有关闭剪贴簿,那么它就不能被打开。如果每个程式在回应使用者的命令时都尽快地、遵守规范地打开然後关闭剪贴簿,那么您将永远不会遇到不能打开剪贴簿的问题。
但是,在不遵守规范程式和优先权式多工环境中,总会发生一些问题。即使在您的程式将某些东西放入剪贴簿和使用者启动一个「Paste」选项期间,您的程式并没有失去输入焦点,但是您也不能假定您放入的东西仍然在那里,一个背景程式有可能已经在这段期间存取过剪贴簿了。
而且,请留意一个与讯息方块有关的更微妙问题:如果不能配置足够的记忆体来将内容复制到剪贴簿,那么您可能希望显示一个讯息方块。但是,如果这个讯息方块不是系统模态的,那么使用者可以在显示讯息方块期间切换到另一个应用程式中。您应该使用系统模态的讯息方块,或者在您显示讯息方块之前关闭剪贴簿。
如果您在显示一个对话方块时将剪贴簿保持为打开状态,那么您还可能遇到其他问题,对话方块中的编辑栏位会使用剪贴簿进行文字的剪贴。
剪贴簿和Unicode
迄今为止,我只讨论了用剪贴簿处理ANSI文字(每个字元对应一个位元组)。我们用CF_TEXT识别字时就是这种格式。您可能对CF_OEMTEXT和CF_UNICODETEXT还不熟悉吧。
《Windows程序设计(第5版 珍藏版)》是一本经典的Windows编程圣经,曾经伴随着近50万Windows程序员步入编程殿堂,成长为IT时代的技术精英。
我有一些好消息:在处理您所想要的文字格式时,您只需呼叫SetClipboardData和GetClipboardData,Windows将处理剪贴簿中所有的文字转换。例如,在Windows NT中,如果一个程式用SetClipboardData来处理CF_TEXT剪贴簿资料型态,程式也能用CF_OEMTEXT呼叫GetClipboardData。同样地,剪贴簿也能将CF_OEMTEXT资料转换为CF_TEXT。
在Windows NT中,转换发生在CF_UNICODETEXT、CF_TEXT和CF_OEMTEXT之间。程式应该使用对程式本身而言最方便的一种文字格式来呼叫SetClipboardData 。同样地,程式应该用程式需要的文字格式来呼叫GetClipboardData。我们已经知道,本书附上的程式在编写时可以带有或不带UNICODE识别字。如果您的程式也依此编写,那么在定义了UNICODE识别字之後,程式将执行带有CF_UNICODETEXT参数的SetClipboardData以及GetClipboardData呼叫,而不是CF_TEXT。
CLIPTEXT程式,如程式12-1所示,展示了一种可行的方法。 …… 此处隐藏:3564字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [外语考试]管理学 第13章 沟通
- [外语考试]07、中高端客户销售流程--分类、筛选讲
- [外语考试]2015-2020年中国高筋饺子粉市场发展现
- [外语考试]“十三五”重点项目-汽车燃油表生产建
- [外语考试]雅培奶粉培乐系列适用年龄及特点
- [外语考试]九三学社入社申请人调查问卷
- [外语考试]等级薪酬体系职等职级表
- [外语考试]货物买卖合同纠纷起诉状(范本一)
- [外语考试]青海省实施消防法办法
- [外语考试]公交车语音自动报站系统的设计第3稿11
- [外语考试]logistic回归模型在ROC分析中的应用
- [外语考试]2017-2021年中国隔膜泵行业发展研究与
- [外语考试]神经内科下半年专科考试及答案
- [外语考试]园林景观设计规范标准
- [外语考试]2018八年级语文下册第一单元4合欢树习
- [外语考试]分布式发电及微网运行控制技术应用
- [外语考试]三人行历史学笔记:中世纪人文主义思想
- [外语考试]2010届高考复习5年高考3年联考精品历史
- [外语考试]挖掘机驾驶员安全生产责任书
- [外语考试]某211高校MBA硕士毕业论文开题报告(范
- 用三层交换机实现大中型企业VLAN方案
- 斯格配套系种猪饲养管理
- 涂层测厚仪厂家直销
- 研究生学校排行榜
- 鄱阳湖湿地景观格局变化及其驱动力分析
- 医学基础知识试题库
- 2010山西省高考历年语文试卷精选考试技
- 脉冲宽度法测量电容
- 谈高职院校ESP教师的角色调整问题
- 低压配电网电力线载波通信相关技术研究
- 余额宝和城市商业银行的转型研究
- 篮球行进间运球教案
- 气候突变的定义和检测方法
- 财经大学基坑开挖应急预案
- 高大支模架培训演示
- 一种改进的稳健自适应波束形成算法
- 2-3-鼎视通核心人员薪酬股权激励管理手
- 我国电阻焊设备和工艺的应用现状与发展
- MTK手机基本功能覆盖测试案例
- 七年级地理教学课件上册第四章第一节