剪切板

news/2024/10/24 6:36:40/

剪切板

���¼���ԭʼ��ҳ ��ӡ

OLE剪贴板和普通剪贴板_chenkun_新浪博客

传统Windows剪贴板编程

将数据复制到剪贴板:
1.调用OpenClipboard()设置数据的源窗口.
2.调用EmptyClipboard()清空剪贴板中以前的数据.
3.调用SetClipboardData()将数据存放到剪贴板上.
4.调用CloseClipboard()使别的窗口能访问剪贴板.
取得剪贴板上的数据:
1.调用OpenClipboard()访问剪贴板.
2.调用GetClipboardData()取得数据.
3.调用CloseClipboard()释放剪贴板.

使用延迟供应技术时,源数据方以NULL为数据句柄调用SetClipboardData(),数据使用方GetClipboardData()时,Windows向数据产生者发送WM_RENDERFORMAT和WM_RENDERFORMATS消息,数据提供者响应消息并产生数据.

局限性:使用全局内存来传输,数据量大时系统要使用虚拟内存管理机制来管理,对交换效率有很大影响.

//------------------------------------------------------------
OLE剪贴板

介于应用程序与标准剪贴板间,从标准剪贴板扩展而来,补充了OLE的数据传输机制,对标准剪贴板向后兼容.
OLE剪贴板使用IDataObject接口进行传输,相关的API:
.OleSetClipboard():在剪贴板上放置一个IDataObject接口指针.
.OleGetClipboard():从剪贴板上取得一个IDataObject接口指针.
.OleFlushClipboard():清空OLE剪贴板,释放上面的IDataObject接口指针.
.OleIsCurrentClipboard():判断指定的对象当前是否在剪贴板上.
OLE剪贴板的工作步骤:
1.数据创造者程序将数据放到剪贴板并实现IDataObject.数据创造者用OleSetClipboard()得IDataObject的一个拷贝.并将其放到剪贴板上.
2.剪贴板上有IDataObject指针时,OLE像普通应用程序一样使用剪贴板.OLE调用OpenClipboard来声明剪贴板的拥有者,OLE剪贴板使用延迟供应模式.OLE剪贴板会创建一个隐藏窗口作为剪贴板的拥有者(OpenClipboard需要HWND参数)--在OleInitialize()中创建.
3.OLE枚举IDataObject的格式,同时对每个在全局句柄中提供数据的格式调用SetClipboard().标准剪贴板不支持文件和结构的传输入,所以只能将全局句柄放在剪贴板上.
4.数据消耗者访问剪贴板.当它不知道OLE的信息时,使用标准方式GetClipboardData()来获取数据--数据是由延迟供应方式提供的.OLE剪贴板查询IDataObject接口,然后调用接口上的GetData()方法取得数据.如数据消耗者支持OLE,它可用OleGetClipboard()取得IDataObject指针,并用GetData()取得数据.

MFC的IDataObject支持

.COleDataSource:一个完全的COM对象,实现了IDataObject接口.常用在数据提供者一方.
.COleDataObject:封装一个IDataObject指针,为开发者提供C++接口.常用在数据消耗者一方.

A.通过剪贴板传输数据

1.将数据放置到剪贴板中.
得到数据指针并创建COleDataSource的一个实例,用这个对象来保存数据.例:
{
LPCTSTR   source   =   GetString()   ;
COleDataSource   *pCods;
HGLOBAL   h   =   GlobalAlloc(GHND|GMEM_SHARE,(_tcslen(source)+1)*sizeof(TCHAR));
_tcscpy(   LPSTR(GloballLock(h)),   source   )   ;
GlobalUnlock(h);//使用全局内存时这句一定要有.
pCods-> CacheGlobalData(CF_TEXT,h)   ;
pCods-> SetClipboard()   ;
//没有释放全局内存?在将数据放到OLE剪贴板的情况下,OLE自己会去释放它.
//不想使用全局内存?那用COleDataSource::CacheData()放入数据源对象,但需要提供两个描绘数据的参数.
}
2.从剪贴板中粘贴数据
声明一个COleDataObject的实例,调用COleDataObject::AttachClipboard().可用ColeDataObject::IsDataAvailable()获取数据格式;但也支持COleDataObject::BeginEnumFormats()/COleDataObject::GetNextFormat()枚举所有格式.
确定格式后,用COleDataObject的以下函数可得到数据:
.COleDataObject::GetDataObject();//最通用的,处理所有格式.
.COleDataObject::GetFileData();//数据的存储介质是文件时;文件由使用者释放.
.COldDataObject::GetGlobalData();//数据在全局内存.
例:
{
COleDataObject   odo   ;
odo.AttachClipboard()   ;
if(   odo.IsDataAvailable(CT_TEXT)){
HANDLE   h   =   odo.GetGlobalData(CF_TEXT);
//use   data
GlobalUnlock(h)   ;
GlobalFree(h)   ;
}
odo.Release()   ;
}
B.延迟供应.
由COldDataSource中的DelayRenderData(),DelayRenderFileData(),OnRenderData()实现.需要在COleDataSource派生类中实现OnRenderData().类似的函数还有OnRenderFileData,OnRenderGlobalData().

//-----------------------------------------------------------

OLE拖放

使用3个接口:IDataObject,IDropSource(COleDropSource实现),IDropTarget(COleDropTarget实现).

控制键:[没有]=移动数据;[CONTROL]=复制数据;[CONTROL-SHIFT]=建立快捷方式;[ALT]=移动数据

开起拖放:与将数据放在剪贴板相似,不过是调用COldDataSource::DoDragDrop()而不是COleDataSource::SetClipboard();
结束播放:放置目标通常需要两个COleDropTarget与CView类
1.注册CView为一个COleDropTarget类.在类中声明一个COleDropTarget变量,在OnCreate()中调用COleDropTarget::Register(this);
2.重载CView类的OnDragEnter(),OnDragOver(),OnDragLeave(),OnDrop();

posted @ 2013-12-31 14:46 心灵捕手 阅读( ...) 评论( ...)   编辑 收藏

http://www.ppmy.cn/news/574769.html

相关文章

kindeditor+粘贴word图片

公司做的项目需要用到粘贴Word功能。就是将word内容一键粘贴到网页编辑器(在线富文本编辑器)中。ChromeIE默认支持粘贴剪切板中的图片,但是我要粘贴的文章存在word里面,图片多达数十张,我总不能一张一张复制吧 &#x…

Word2003入门动画教程44:在Word中使用Office剪贴板

Windows剪贴板只能保留最近一次剪切或复制的信息,而Office2003提供的剪贴板在 Word 中以任务窗格的形式出现,它具有可视性,允许用户存放24个复制或剪切的内容,而且在Office系列软件中,剪切板信息是共用的。利用之&am…

20款电脑剪贴板软件良心推荐汇总

我自己长期使用的,是 Ditto。 我自己长期使用的,是 Ditto。 我自己长期使用的,是 Ditto。 1.Copyq 开源免费,下载zip免安装 可以置顶,不聚焦时不关闭。 中文 下载地址:https://github.com/hluk/CopyQ/rele…

使用Office剪贴板(转)

使用Office剪贴板(转) Windows剪贴板只能保留最近一次剪切或复制的信息,而Office 2003提供的剪贴板在Word中以任务窗格的形式出现,它具有可视性,允许用户存放24个复制或剪切的内容,而且,在Office系列软件中&#xff0c…

计算机关闭系统剪切板上的内容,怎样删除电脑粘贴板上的内容?三个方法教你清空剪切板...

我们平时经常使用电脑,但是大多数人其实只是懂得最基础的一些电脑应用,也就是其实只懂得一些皮毛。还有一些工作者虽然会经常使用电脑,电脑中的很多软件也可以熟练应用。可是实际上对于电脑深层的一些操作还是没有人特别了解。例如剪切板&…

剪切板是计算机系统,电脑剪切板在哪里找 电脑剪切板位置【图文】

在我们使用电脑的过程中,总会出现这样或那样的问题。比如当我们使用截屏保存了张图片时,电脑显示在剪贴板,但是我们却很难找到剪贴板在电脑的哪个位置,因此也找不到需要的图片了。可见,作为内存中的一个区域,剪切板也是电脑系统内置的一个非常有用的小工具。通过剪切板,…

计算机用word做海报,【2人回答】电脑Word怎么做海报?-3D溜溜网

回答: 首先你要有一定的ps技术、创意和审美。下面是简单制作海报流程: 一、新建画布 文件——新建 或者 快捷键CtrlN ● 海报的设置如下图: 请点击输入图片描述 ● 传单的设置如下图: 请点击输入图片描述 按确定进入操作区。 二、…

便捷的在线剪切板

有时候我们想在两台终端互传简短的文本,两端没有或不允许安装im工具,但都可以浏览网页 这个时候最方便的方式便是通过网页来传递消息,以下是搜藏的两个免费工具站点,不敢独享 1 https://cl1p.net/ 在主域名后直接敲入自己相好的…