RichEdit控件保存图片问题

sghcpt 2013-07-05 01:44:26
我的问题是这样的,我想把从Word文档拷贝过来的图片粘贴到RichEdit控件中,再点击某个按钮,就把RichEdit控件中的图片保存为png图片。下面代码只能保存为wmf文件,不知道怎么能保存为png图片。
CComPtr<IRichEditOle> pTalkRichEditOle;
CComPtr<ITextRange> pTalkRange;
::SendMessage(m_pwndTalk->m_hWnd,EM_GETOLEINTERFACE,0,(LPARAM)&pTalkRichEditOle);
CComQIPtr<ITextDocument>(pTalkRichEditOle)->Range(0,0,&pTalkRange);
int pic_count = (int)pTalkRichEditOle->GetObjectCount();
for (int nIndex = 0; nIndex < pic_count; nIndex++)
{
REOBJECT reobject = {0};
reobject.cbStruct = sizeof(REOBJECT);
pTalkRichEditOle->GetObject(i, &reobject, REO_GETOBJ_POLEOBJ);
reobject.poleobj->SetClientSite(NULL);
CComQIPtr<IDataObject> pDataObject = reobject.poleobj;
if (!pDataObject) continue;

CComPtr<IEnumFORMATETC> pEnumFormatEtc;
if (SUCCEEDED(pDataObject->EnumFormatEtc(DATADIR_GET,&pEnumFormatEtc)) && pEnumFormatEtc)
{
FORMATETC fmt = {0};
if (S_FALSE != pEnumFormatEtc->Next(1,&fmt,NULL))
{
STGMEDIUM medium;
pDataObject->GetData(&fmt,&medium);
if (fmt.cfFormat == CF_METAFILEPICT)
{
HMETAFILEPICT hMetaFilePict = medium.hMetaFilePict;
LPMETAFILEPICT pMFP = (LPMETAFILEPICT)GlobalLock(hMetaFilePict);
SIZE size;
size.cx = 19;
size.cy = 19;
HWND hWnd = ::GetDesktopWindow();
HDC hDC = ::GetDC(hWnd);

HDC hMemDC = ::CreateCompatibleDC(hDC);
HBITMAP hMemBmp = ::CreateCompatibleBitmap(hDC, size.cx, size.cy);
HBITMAP hPrevBmp = (HBITMAP)::SelectObject(hMemDC, hMemBmp);
::PlayMetaFile(hMemDC, pMFP->hMF);
HMETAFILE hFile = CopyMetaFile(pMFP->hMF, _T("E:\\fromMSN.wmf"));
DeleteMetaFile(hFile);
GlobalUnlock(pMFP);
}
}
}
}


...全文
282 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangys_fly 2013-08-10
  • 打赏
  • 举报
回复
引用 4 楼 sghcpt 的回复:
不好意思,写错代码了,应该是下面的代码:
CxImage * pImage = new CxImage();
if (pImage)
{
   pImage->CreateFromHANDLE(hMemBmp);
   bool bRetCode = pImage->Save(bstrFullPathName,CXIMAGE_FORMAT_PNG);
   delete pImage;
   pImage = NULL;
}
这个不对把,CxImage说是CreateFromHANDLE都不准确,不知道你试过没有
sghcpt 2013-07-11
  • 打赏
  • 举报
回复
又没有人回答了,我顶上去。。。。
sghcpt 2013-07-10
  • 打赏
  • 举报
回复
不好意思,写错代码了,应该是下面的代码:
CxImage * pImage = new CxImage();
if (pImage)
{
   pImage->CreateFromHANDLE(hMemBmp);
   bool bRetCode = pImage->Save(bstrFullPathName,CXIMAGE_FORMAT_PNG);
   delete pImage;
   pImage = NULL;
}
sghcpt 2013-07-10
  • 打赏
  • 举报
回复
To fishion: 谢谢你的回答。我在工程里使用了另外一个库,CxImage库。在PlayMetaFile函数后执行了下面的语句:
CxImage * pImage = new CxImage();
									pImage->CreateFromHANDLE(medium.hBitmap);
									bool bRetCode = pImage->Save(bstrFullPathName, CXIMAGE_FORMAT_PNG);
									delete pImage;
									pImage = NULL;
但是保存的png图片是错误的。请问上面的代码错了吗?
fishion 2013-07-09
  • 打赏
  • 举报
回复
简单的尝试在PlayMetaFile之后用CImage类来传入hMemBmp然后再Save ImageFormatPNG类型
sghcpt 2013-07-09
  • 打赏
  • 举报
回复
问题没有回答,我顶上去。。。。。。。。。。

3,248

社区成员

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

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