3,245
社区成员
发帖
与我相关
我的任务
分享
IRichEditOle *pobject;
SendMessage( pU->hWndSend, EM_GETOLEINTERFACE, 0, (LPARAM) &pobject);
int nObjectMount = pobject->GetObjectCount();
for(int i = 0; i < nObjectMount; ++i) //遍历位图
{
REOBJECT object;
memset(&object,0,sizeof(REOBJECT));
object.cbStruct = sizeof(REOBJECT);
pobject->GetObjectA(i, &object, REO_GETOBJ_ALL_INTERFACES);
IDataObject* pDataObject = NULL;
SCODE sc = object.poleobj->QueryInterface( IID_IDataObject,(void**&pDataObject ); // 获取IDataObject信息
if(sc != S_OK)
{
break;
}
STGMEDIUM stg;
FORMATETC fm;
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; // 对应CF_BITMAP
HRESULT hr = pDataObject->GetData( &fm, &stg );
if ( hr != S_OK || stg.hBitmap == NULL )
{
break; // 已经找到选中的图片对象,获取信息失败,直接退出
}
HBITMAP bmp = GetImage(uInt);
InserBitMap(m_sendText,bmp,uInt);
InserBitMap(m_viewText,bmp,uInt);
改成
HBITMAP bmp = GetImage(uInt);
InserBitMap(m_sendText,bmp,uInt);
bmp = GetImage(uInt);
InserBitMap(m_viewText,bmp,uInt);
void InserBitMap(CRichEditCtrl& richEditCtrl,HBITMAP bmp,int index)
{
int nEndPos = richEditCtrl.GetWindowTextLength();
richEditCtrl.SetSel(nEndPos,nEndPos);
STGMEDIUM stgm;
memset(&stgm,0,sizeof(STGMEDIUM));
stgm.tymed = TYMED_GDI; // Storage medium = HBITMAP handle
stgm.hBitmap = bmp;
stgm.pUnkForRelease = NULL; // Use ReleaseStgMedium
FORMATETC fm;
memset(&fm,0,sizeof(FORMATETC));
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;
//创建输入数据源
IStorage*pStorage;
//分配内存
LPLOCKBYTES lpLockBytes = NULL;
SCODE scode = ::CreateILockBytesOnHGlobal(NULL,TRUE,&lpLockBytes);
if(scode != S_OK)
AfxThrowOleException(scode);
if(lpLockBytes == NULL)
return;
scode = ::StgCreateDocfileOnILockBytes(lpLockBytes,
STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE,0,&pStorage);
if(scode != S_OK)
{
VERIFY(lpLockBytes->Release() == 0);
lpLockBytes = NULL;
AfxThrowOleException(scode);
}
if(pStorage == NULL)
return;
COleDataSource *pDataSource = new COleDataSource;
pDataSource->CacheData(CF_BITMAP,&stgm);
LPDATAOBJECT lpDataObject =(LPDATAOBJECT) pDataSource->GetInterface(&IID_IDataObject);
//获取RichEdit的OleClientSite
LPOLECLIENTSITE lpClientSite;
richEditCtrl.GetIRichEditOle()->GetClientSite(&lpClientSite);
//创建OLE对象
IOleObject *pOleObject;
scode = ::OleCreateStaticFromData(lpDataObject,IID_IOleObject,OLERENDER_FORMAT,
&fm,lpClientSite,pStorage,(void**)&pOleObject);
if(scode != S_OK)
AfxThrowOleException(scode);
if(pOleObject == NULL)
return;
//插入OLE对象
REOBJECT reobject;
ZeroMemory(&reobject, sizeof(REOBJECT));
reobject.cbStruct = sizeof(REOBJECT);
CLSID clsid;
scode = pOleObject->GetUserClassID(&clsid);
if(scode != S_OK)
AfxThrowOleException(scode);
reobject.clsid = clsid;
reobject.cp = REO_CP_SELECTION;
reobject.dvaspect = DVASPECT_CONTENT;
reobject.poleobj = pOleObject;
reobject.polesite = lpClientSite;
reobject.pstg = pStorage;
reobject.dwUser = index;
richEditCtrl.GetIRichEditOle()->InsertObject(&reobject);
//////////////////////////////////////////////////////////////////////////
pOleObject->Release(); pOleObject = NULL;
lpClientSite->Release();lpClientSite = NULL;
pStorage->Release();pStorage = NULL;
lpDataObject->Release();lpDataObject = NULL;
lpLockBytes->Release();lpLockBytes = NULL;
if(pDataSource)
{
// ZeroMemory(pDataSource,sizeof(COleDataSource));
pDataSource = NULL;
}
}
HBITMAP CTalkDlg::GetImage(int index)
{
IMAGEINFO info;
m_imgListFaces.GetImageInfo(index,&info);
int wid = info.rcImage.right-info.rcImage.left;
int hei = info.rcImage.bottom-info.rcImage.top;
CClientDC cdc(NULL);
CDC memDC;
CBitmap bitmap2;
bitmap2.CreateCompatibleBitmap(&cdc,wid,hei);
memDC.CreateCompatibleDC(&cdc);
CBitmap* pOldBitmap = memDC.SelectObject(&bitmap2);
memDC.FillSolidRect(0,0,wid,hei,m_sendText.SetBackgroundColor(TRUE,0));
m_imgListFaces.Draw(&memDC,index,CPoint(0,0),ILD_NORMAL);
memDC.SelectObject(pOldBitmap);
return (HBITMAP)bitmap2.Detach();
}
DWORD CSkinRichEdit::GetSelectObjectUser()
{
DWORD dRet = -1;
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
{
FORMATETC fmtetc = { CF_BITMAP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
STGMEDIUM stgmed;
// ask the IDataObject for some CF_TEXT data, stored as a HGLOBAL
if(pDataObject->GetData(&fmtetc, &stgmed) == S_OK)
{
CString strPath = "c:\\test.bmp";
SaveToBmp(stgmed.hBitmap, strPath);
dRet = reobject.dwUser = SetImagePath(strPath);
ReleaseStgMedium(&stgmed);
}
}
pDataObject->Release();
break;
}
return dRet;
}