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

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

来源:网络收集 时间:2025-09-14
导读: 为剪贴簿配置记忆体时,您应该以GMEM_MOVEABLE和GMEM_SHARE旗标呼叫GlobalAlloc函式。GMEM_SHARE旗标使得其他应用程式也可以使用那块记忆体。 将文字传送到剪贴簿 让我们想像把一个ANSI字串传送到剪贴簿上,并且我

为剪贴簿配置记忆体时,您应该以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字,全部文档内容请下载后查看。喜欢就下载吧 ……

windows程序设计(C语言版)第12章-剪贴簿(2).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)