MSDN示例應使用位圖圖像。您可以使用Gdiplus
打開jpeg/png,然後從Gdiplus手柄獲取HBITMAP
。使用OleCreateStaticFromData
在RichEdit控件中插入圖片
void InsertBitmap(CRichEditCtrl *edit, HBITMAP hBitmap, int position)
{
STGMEDIUM stgm;
stgm.tymed = TYMED_GDI;
stgm.hBitmap = hBitmap;
stgm.pUnkForRelease = NULL;
FORMATETC fm;
fm.cfFormat = CF_BITMAP;
fm.ptd = NULL;
fm.dwAspect = DVASPECT_CONTENT;
fm.lindex = -1;
fm.tymed = TYMED_GDI;
COleDataSource oleDataSource;
oleDataSource.CacheData(CF_BITMAP, &stgm);
LPDATAOBJECT dataObject = (LPDATAOBJECT)oleDataSource.GetInterface(&IID_IDataObject);
if (OleQueryCreateFromData(dataObject) != OLE_S_STATIC)
return;
LPOLECLIENTSITE oleClientSite;
if (S_OK != edit->GetIRichEditOle()->GetClientSite(&oleClientSite))
return;
//allocate memory
LPLOCKBYTES lockBytes = NULL;
if (S_OK == CreateILockBytesOnHGlobal(NULL, TRUE, &lockBytes) && lockBytes)
{
IStorage *storage = NULL;
if (S_OK == StgCreateDocfileOnILockBytes(lockBytes, STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 0, &storage) && storage)
{
IOleObject *oleObject = NULL;
if (S_OK == OleCreateStaticFromData(dataObject, IID_IOleObject, OLERENDER_FORMAT, &fm, oleClientSite, storage, (void **)&oleObject) && oleObject)
{
CLSID clsid;
if (S_OK == oleObject->GetUserClassID(&clsid))
{
REOBJECT reobject = { sizeof(REOBJECT) };
reobject.clsid = clsid;
reobject.cp = position;
reobject.dvaspect = DVASPECT_CONTENT;
reobject.poleobj = oleObject;
reobject.polesite = oleClientSite;
reobject.pstg = storage;
edit->GetIRichEditOle()->InsertObject(&reobject);
}
oleObject->Release();
}
storage->Release();
}
lockBytes->Release();
}
oleClientSite->Release();
}
用法:
Gdiplus::Bitmap *gdibmp = Gdiplus::Bitmap::FromFile(filename);
HBITMAP hbitmap = NULL;
gdibmp->GetHBITMAP(0, &hbitmap);
if (hbitmap)
InsertBitmap(&richEdit, hbitmap, 0);
delete gdibmp;
注意,Gdiplus
需要Unicode文件名。如果您的項目是ANSI(不應該是這樣),那麼使用CStringW
將文件名轉換爲Unicode。