Windowless RichEdit 中,怎样实现对Bitmap,gif图片等OLE对象的复制粘贴?

我的你 2012-05-02 10:48:01
小弟在做DirectUI的项目,最近参考微软的Windowless Richedit和网上的Duilib自己实现了一个继承自ITextHost的windowless RichEdit,也通过实现IRichEditOleCallback加入了插入Bitmap和Gif图片的支持,代码基本上是参考的这里http://www.pudn.com/downloads421/sourcecode/windows/control/detail1784055.html
现在需要实现对插入的OLE对象比如bitmap和Gif图的剪贴板操作,复制,剪切,粘贴等,现在虽然也能复制粘贴bitmap但是粘贴进入的bitmap图能改变大小,格式不正确,并不是之前插入进去的图片,而且Gif图现在还不能粘贴,看了QQ的聊天对话框,一切都很完美,请教CSDN的各位大牛,怎样才能实现对Ole对象的剪贴板操作的支持?怎样才能实现插入复制粘贴bitmap,gif呢?
...全文
675 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
emote 2012-08-30
  • 打赏
  • 举报
回复
楼主共享下 关键点吧 俺也是用WTL, 关键点没弄好...
我的你 2012-05-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

引用 10 楼 的回复:

引用 9 楼 的回复:

http://blog.csdn.net/chenlycly/article/details/7258619

嗯,我也是正在照着这个上面去做,但是有一个问题,我的项目不是用的MFC,是WTL,COleDataSource等类都不能用,不知道这个文章中复制粘贴的代码是否可以用剪贴板操作来实现?另外,你已经实现了么?
呵呵,我……
[/Quote]

参照博客中说的,用剪贴版和TinyXML勉强实现了,虽然还是和QQ有差距,凑合用吧~
我的你 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

http://blog.csdn.net/chenlycly/article/details/7258619
[/Quote]
嗯,我也是正在照着这个上面去做,但是有一个问题,我的项目不是用的MFC,是WTL,COleDataSource等类都不能用,不知道这个文章中复制粘贴的代码是否可以用剪贴板操作来实现?另外,你已经实现了么?
dvlinker 2012-05-03
  • 打赏
  • 举报
回复
http://blog.csdn.net/chenlycly/article/details/7258619
我的你 2012-05-03
  • 打赏
  • 举报
回复
非常感谢楼上的回复,很有用!希望能QQ交流~47102138
用CLipSpy仔细看了QQ,WPS的复制粘贴操作在剪贴板中的内容,他们都有定义自己的结构,QQ是QQ_RichEdit_Format,是一个类似XML的结构,其中保存复制的内容,包括图片的地址信息,我的RichEdit要实现自己内部的复制粘贴的话就应该也要定义一个自己的结构,复制的时候写XML,粘贴的时候解析XML,不知有没有哪位大哥做过这方面的内容。
另外,发现QQ和WPS是可以互相复制粘贴内容的,图文混合都可以,查看CLipspy发现他们都有一个HTML Format结构,所以我估计要实现程序之间的复制粘贴是不是还要保存一个HEML Format的结构?而且这个结构应该是有一定的格式,应该是一个通用的结构。有没有大牛做过这方面的内容?
dvlinker 2012-05-03
  • 打赏
  • 举报
回复
给你一段参考代码
dvlinker 2012-05-03
  • 打赏
  • 举报
回复
// 将图片文件拷贝到剪切板(将包含文件名的文件完整路径添加到剪切板中)
void CCatchScreenDlg::CopyCatchFileToClipboard( CString strFilePath )
{
DROPFILES dropFiles;
UINT uGblLen, uDropFilesLen;
HGLOBAL hGblFiles, hGblEffect;
char *szData, *szFileList;

DWORD *pdwDropEffect;

hGblEffect = GlobalAlloc( GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, sizeof(DWORD) );
pdwDropEffect = (DWORD*)GlobalLock( hGblEffect );
*pdwDropEffect = DROPEFFECT_COPY;
GlobalUnlock(hGblEffect);

uDropFilesLen=sizeof(DROPFILES);
dropFiles.pFiles = uDropFilesLen;
dropFiles.pt.x = 0;
dropFiles.pt.y = 0;
dropFiles.fNC = FALSE;
dropFiles.fWide = TRUE;

uGblLen = uDropFilesLen + strFilePath.GetLength()*2 + 8;
hGblFiles = GlobalAlloc( GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, uGblLen );
szData = (char*)GlobalLock( hGblFiles );
memcpy (szData, (LPVOID)(&dropFiles), uDropFilesLen );
szFileList = szData + uDropFilesLen;


LPWSTR lpWStrBmpFileName = NULL; // 注意:Bitmap::Save接口第一个参数是宽字节参数
#ifdef _UNICODE
lpWStrBmpFileName = strFilePath.GetBuffer( 0 ); // 如果是_UNICODE模式,直接使用
#else
WCHAR wchBmpFileName[MAX_PATH*2] = {0};
MultiByteToWideChar( CP_ACP, 0, strFilePath.GetBuffer( 0 ), -1, wchBmpFileName, strlen(strFilePath)+1 ); // 将窄字符转化为宽字符
lpWStrBmpFileName = wchBmpFileName;
#endif

wmemcpy( (WCHAR *)szFileList, lpWStrBmpFileName, wcslen( lpWStrBmpFileName )+2 );

GlobalUnlock(hGblFiles);

if( ::OpenClipboard(NULL) )
{
::EmptyClipboard();
::SetClipboardData( CF_HDROP, hGblFiles );
::SetClipboardData( m_dwScreenCatchClipFormat, hGblEffect );
::CloseClipboard();
}
}
dvlinker 2012-05-03
  • 打赏
  • 举报
回复
关于剪切板的操作可以参考http://www.vckbase.com/document/viewdoc/?id=444
dvlinker 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 9 楼 的回复:

http://blog.csdn.net/chenlycly/article/details/7258619

嗯,我也是正在照着这个上面去做,但是有一个问题,我的项目不是用的MFC,是WTL,COleDataSource等类都不能用,不知道这个文章中复制粘贴的代码是否可以用剪贴板操作来实现?另外,你已经实现了么?
[/Quote]呵呵,我们用的是MFC,使用CRichedit控件,然后在网上找了一下插入richedit的方法,只是勉强实现了图片插入的功能,目前不支持图片和文字的同时复制!
fishion 2012-05-02
  • 打赏
  • 举报
回复
用clipspy看看QQ复制gif图像和bmp图像到剪切板的时候是用什么格式的,然后你自己进行复制的时候,就把数据按那样的格式用SetClipboardData等进行复制到剪切板中
fishion 2012-05-02
  • 打赏
  • 举报
回复
搜索下“VC 操作剪切板”,然后再看看MSDN
我的你 2012-05-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

用clipspy看看QQ复制gif图像和bmp图像到剪切板的时候是用什么格式的,然后你自己进行复制的时候,就把数据按那样的格式用SetClipboardData等进行复制到剪切板中
[/Quote]

谢谢你的回答,不过恕小弟愚钝,我用clipspy看了QQ的复制粘贴,其中确实有自定义的格式,但是对于你说的SetClipBoardData等方法还是不太明白,可以和你QQ交流么?我的QQ:47102138 Sky 在线

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧