描述:
网上找了段代码,也是没有解决的
GetObject获取的ole对象如何判断是否为图片,这对象又怎么保存到HBITMAP或写成文件??
-------------------------------------------------------------------------------
IRichEditOle* pRichEditOle = m_reView.GetIRichEditOle();
REOBJECT reobject;
ZeroMemory(&reobject,sizeof(REOBJECT));
reobject.cbStruct = sizeof(REOBJECT);
pRichEditOle->GetObject(REO_IOB_SELECTION,&reobject,REO_GETOBJ_POLEOBJ);
IDataObject *pDataObject;
reobject.poleobj->GetClipboardData(0,&pDataObject);
FORMATETC fm;
STGMEDIUM sm;
if(pDataObject)
pDataObject->GetData(&fm, &sm);
//CImage.Attach((HBITMAP)sm.hBitmap);
CFileDialog fileDlg(false,
0,
0,
OFN_HIDEREADONLY|OFN_FILEMUSTEXIST,
TEXT("图像文件(*.jpg)|*.jpg |图像文件(*.bmp)|*.bmp ||"));
if(fileDlg.DoModal()==IDOK)
{
if(fm.cfFormat == CF_BITMAP)
{
//保存图片SaveBitmap(sm.hBitmap,fileDlg.GetPathName());
}
}
解决方案1:
太感谢了,我成功了..
分享一下代码,我把这个功能写成一个成员函数,放在我继承的CRichEditEx里面,
void CRichEditEx::SaveBitmap(int nIndex, LPCTSTR lpFileName)
{
REOBJECT reobject;
ZeroMemory(&reobject,sizeof(REOBJECT));
reobject.cbStruct = sizeof(REOBJECT);
m_lpRichEditOle->GetObject(/*REO_IOB_SELECTION*/nIndex,&reobject,REO_GETOBJ_POLEOBJ);
IDataObject *pDataObject;
if (S_OK != reobject.poleobj->QueryInterface(IID_IDataObject, (void **)&pDataObject))
{
MessageBox(_T("获取数据失败!"));
return;
}
//IDataObject *pDataObject;
//reobject.poleobj->GetClipboardData(0,&pDataObject);
FORMATETC fm;
STGMEDIUM sm;
sm.tymed = TYMED_GDI; // Storage medium = HBITMAP handle
sm.pUnkForRelease = NULL; // Use ReleaseStgMedium
fm.cfFormat = CF_BITMAP; // Clipboard format = CF_BITMAP
fm.ptd = NULL; // Target Device = Screen
fm.dwAspect = DVASPECT_CONTENT; // Level of detail = Full content
fm.lindex = -1; // Index = Not applicaple
fm.tymed = TYMED_GDI;
if(pDataObject)
pDataObject->GetData(&fm, &sm);
CImage image;
image.Attach(sm.hBitmap);
image.Save(lpFileName);
::ReleaseStgMedium(&sm);
}
解决方案2:
这里有解答:
http://social.microsoft.com/Forums/cs-CZ/visualcpluszhchs/thread/989ccf75-95f5-4e4f-b102-db5085e11ade
是蒋晟的回复哦。