解决方案 »
- 为什么ComboBox AddString速度变的很慢
- ActiveX控件,jsp接收不到事件!
- 为何组合框下拉不出来呢?
- 查杀QQ进程的代码
- 如何让视图里的文本对鼠标敏感?
- 如何屏蔽多文档应用程序自窗口的系统关闭按钮
- 我的分太多了,又没有什么问题问
- 如何打开标准控件?
- 当基类是抽象类时,导出类的构造函数如何调用基类的构造函数的呀?多谢。
- 警惕!Microsoft在毒害我们开发人员!
- 为什么com的变量不能调用初始化com的函数,连最基本的setcommport都没有,报错class CMSComm has no member setcomm
- 我在view中添加了OnLButtonDblClk响应函数?
由于 从QQ或者WORD复制粘贴的图片格式为:CF_METAFILEPICT
调整后GetData能成功,但尝试将其保存为文件时出错:
HENHMETAFILE hMetaFile=CopyEnhMetaFile(sm.hEnhMetaFile, "c:\test.emf");//保存到文件
DWORD dwRet = GetLastError();这里dwRet=6,表示句柄无效。
请问这里如何将获取到的sm.hEnhMetaFile保存为实际的图片文件?
DWORD CSkinRichEdit::GetSelectObjectUser(CString& strPathRet)
{
DWORD dRet = 0;
int nCount = m_pIRichEditOle->GetObjectCount(); // 当前m_ChatEdit中所有的object对象 for ( int i=nCount -1; i >= 0; i-- )
{
REOBJECT reobject;
memset( &reobject, 0 , sizeof(REOBJECT) );
reobject.cbStruct = sizeof(REOBJECT);
SCODE sc = m_pIRichEditOle->GetObject( i, &reobject, REO_GETOBJ_ALL_INTERFACES ); // 获取到reobject对象
if ( sc != S_OK )
{
continue;
} if ( (reobject.dwFlags & REO_SELECTED) != REO_SELECTED ) // 检验当前reobject是否处于选中状态
{
continue; // 不是当前选中的对象,继续查找
}
IDataObject* pDataObject = NULL;
sc = reobject.poleobj->QueryInterface( IID_IDataObject, (void**)&pDataObject ); // 获取IDataObject信息
if ( sc != S_OK )
{
break;
}
CString strPath = "";
if(reobject.dwUser > 0)
{
dRet = reobject.dwUser;
}
else
{
IEnumFORMATETC *pEnumFmt = NULL;
if (S_OK != pDataObject->EnumFormatEtc(DATADIR_GET,&pEnumFmt))
break; FORMATETC fm;
STGMEDIUM sm; CString strPath = "c:\\test.bmp";
HRESULT Ret = S_OK;
ULONG Fetched;
while(Ret == S_OK)
{
HRESULT ret=pEnumFmt->Next(1,&fm,&Fetched);
if(SUCCEEDED(ret))
{
if( fm.cfFormat == CF_METAFILEPICT //媒体
||fm.cfFormat == CF_BITMAP //位图
|| fm.cfFormat == CF_DIB) //DIB
{
if(fm.cfFormat == CF_DIB)
fm.cfFormat = CF_BITMAP; if (S_OK != pDataObject->GetData(&fm, &sm))
{
break;
}
if (sm.pUnkForRelease != NULL)
{
break;
}
if (fm.cfFormat == CF_BITMAP //位图
|| fm.cfFormat == CF_DIB)
{
CImage image;
image.Attach(sm.hBitmap);
image.Save(strPath);
}
else
{
HENHMETAFILE hMetaFile=CopyEnhMetaFile(sm.hEnhMetaFile, "c:\test.emf");//保存到文件
DWORD dwRet = GetLastError();
DeleteEnhMetaFile(hMetaFile);
}
dRet = reobject.dwUser = SetImagePath(strPath);
::ReleaseStgMedium(&sm);
Ret = S_FALSE;
}
}
else
{
Ret = S_FALSE;
}
}
}
pDataObject->Release();
break;
}
if (dRet > 1000)
{
GetImagePath(dRet, strPathRet);
}
return dRet;
}
LPMETAFILEPICT pMFP =
(LPMETAFILEPICT) GlobalLock (sm.hMetaFilePict);
HMETAFILE hFileRet = CopyMetaFile(pMFP->hMF, str); DWORD dwRet = GetLastError();
DeleteMetaFile(hFileRet);
GlobalUnlock(sm.hMetaFilePict);
DWORD CSkinRichEdit::GetSelectObjectUser(CString& strPathRet, CString strPicFlag)
{
DWORD dRet = 0;
int nCount = m_pIRichEditOle->GetObjectCount(); // 当前m_ChatEdit中所有的object对象 for ( int i=nCount -1; i >= 0; i-- )
{
REOBJECT reobject;
memset( &reobject, 0 , sizeof(REOBJECT) );
reobject.cbStruct = sizeof(REOBJECT);
SCODE sc = m_pIRichEditOle->GetObject( i, &reobject, REO_GETOBJ_ALL_INTERFACES ); // 获取到reobject对象
if ( sc != S_OK )
{
continue;
} if ( (reobject.dwFlags & REO_SELECTED) != REO_SELECTED ) // 检验当前reobject是否处于选中状态
{
continue; // 不是当前选中的对象,继续查找
}
IDataObject* pDataObject = NULL;
sc = reobject.poleobj->QueryInterface( IID_IDataObject, (void**)&pDataObject ); // 获取IDataObject信息
if ( sc != S_OK )
{
break;
}
CString strPath = "";
if(reobject.dwUser > 0)
{
dRet = reobject.dwUser;
}
else
{
IEnumFORMATETC *pEnumFmt = NULL;
if (S_OK != pDataObject->EnumFormatEtc(DATADIR_GET,&pEnumFmt))
break; FORMATETC fm;
STGMEDIUM sm; CString strPath = "c:\test.jpg"; HRESULT Ret = S_OK;
ULONG Fetched;
while(Ret == S_OK)
{
HRESULT ret=pEnumFmt->Next(1,&fm,&Fetched);
if(SUCCEEDED(ret))
{
if(
fm.cfFormat == CF_METAFILEPICT //媒体
||fm.cfFormat == CF_BITMAP //位图
|| fm.cfFormat == CF_DIB) //DIB
{
if(fm.cfFormat == CF_DIB)
fm.cfFormat = CF_BITMAP; if (S_OK != pDataObject->GetData(&fm, &sm))
{
break;
}
if (sm.pUnkForRelease != NULL)
{
break;
}
if (fm.cfFormat == CF_BITMAP //位图
|| fm.cfFormat == CF_DIB)
{
CImage image;
image.Attach(sm.hBitmap);
image.Save(strPath);
}
else
{
LPMETAFILEPICT pMFP = (LPMETAFILEPICT) GlobalLock (sm.hMetaFilePict);
SaveToBitMap(pMFP, strPath);
GlobalUnlock(sm.hMetaFilePict);
}
dRet = reobject.dwUser = SetImagePath(strPath);
::ReleaseStgMedium(&sm);
Ret = S_FALSE;
}
}
else
{
Ret = S_FALSE;
}
}
}
pDataObject->Release();
break;
}
if (dRet > 1000)
{
GetImagePath(dRet, strPathRet);
}
return dRet;
}
//////////////////////////////////////////////////////////////////////////void CSkinRichEdit::SaveToBitMap(LPMETAFILEPICT pMFP, CString strPath )
{
SIZE size;
CDC* pDC = GetDC();
if (pDC)
{
size.cx = pMFP->xExt;
size.cy = pMFP->yExt;
pDC->HIMETRICtoDP(&size); CBitmap bm;
bm.CreateCompatibleBitmap(pDC, abs(size.cx), abs(size.cy)); CDC memdc;
memdc.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = memdc.SelectObject(&bm); memdc.SetMapMode(pMFP->mm) ;
memdc.SetViewportExt(abs(size.cx), abs(size.cy)) ;
memdc.SetViewportOrg(0, 0);
memdc.PlayMetaFile(pMFP->hMF);
CImage img;
img.Attach((HBITMAP)bm.GetSafeHandle());
img.Save(strPath);
memdc.SelectObject(pOldBitmap);
memdc.DeleteDC();
bm.DeleteObject();
ReleaseDC(pDC);
}
}
如有空帮忙看下 我发的这个求助帖子吧 先谢过了!