Crando 2015-08-07 09:17 采纳率: 0%
浏览 1766

怎样将bmp图片放入CRichEditCtrl

最近在做MFC的IM类程序开发,有一个CRichEditCtrl控件用来发消息,现在想把CBitmap图片放入到这个控件中,网上试了好多代码都不行,希望指导一下

//将图片放在richedit中
void BugReportDialog::InsertPicToRichEdit(HBITMAP hbitmap)
{
HBITMAP bmp = hbitmap;

//创建HBITMAP

//bmp = (HBITMAP)::LoadImage(NULL, *pBmpFile, IMAGE_BITMAP, 0, 0,

// LR_LOADFROMFILE|LR_DEFAULTCOLOR|LR_DEFAULTSIZE);

STGMEDIUM stgm;     
stgm.tymed = TYMED_GDI;     
stgm.hBitmap = bmp;     
stgm.pUnkForRelease = NULL;     

FORMATETC fm;     
fm.cfFormat = CF_BITMAP;     
fm.ptd = NULL;     
fm.dwAspect = DVASPECT_CONTENT;     
fm.lindex = -1;     
fm.tymed = TYMED_GDI;      

//创建输入数据源      
IStorage *pStorage;     

//分配内存      
LPLOCKBYTES lpLockBytes = NULL;     
SCODE sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);     
if (sc != S_OK)     
    AfxThrowOleException(sc);     
ASSERT(lpLockBytes != NULL);     

sc = ::StgCreateDocfileOnILockBytes(lpLockBytes,     
    STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &pStorage);     
if (sc != S_OK)     
{     
    VERIFY(lpLockBytes->Release() == 0);     
    lpLockBytes = NULL;     
    AfxThrowOleException(sc);     
}     
ASSERT(pStorage != NULL);     

COleDataSource *pDataSource = new COleDataSource;     
pDataSource->CacheData(CF_BITMAP, &stgm);     
LPDATAOBJECT lpDataObject =     
    (LPDATAOBJECT)pDataSource->GetInterface(&IID_IDataObject);     

//获取RichEdit的OLEClientSite      
LPOLECLIENTSITE lpClientSite; 
CRichEditCtrl* m_rch = (CRichEditCtrl*)FromHandle(m_contentHwnd); 
m_rch->GetIRichEditOle()->GetClientSite(&lpClientSite);    

//创建OLE对象      
IOleObject *pOleObject;     
sc = OleCreateStaticFromData(lpDataObject,IID_IOleObject,OLERENDER_FORMAT,     
    &fm,lpClientSite,pStorage,(void **)&pOleObject);     
if(sc!=S_OK)     
    AfxThrowOleException(sc);     

//插入OLE对象      
REOBJECT reobject;     
ZeroMemory(&reobject, sizeof(REOBJECT));     
reobject.cbStruct = sizeof(REOBJECT);     

CLSID clsid;     
sc = pOleObject->GetUserClassID(&clsid);     
if (sc != S_OK)     
    AfxThrowOleException(sc);     

reobject.clsid = clsid;     
reobject.cp = REO_CP_SELECTION;     
reobject.dvaspect = DVASPECT_CONTENT;     
reobject.poleobj = pOleObject;     
reobject.polesite = lpClientSite;     
reobject.pstg = pStorage;     

HRESULT hr = m_rch->GetIRichEditOle()->InsertObject( &reobject );     

delete pDataSource; 

}

  • 写回答

3条回答 默认 最新

  • threenewbee 2015-08-07 09:29
    关注

    http://www.docin.com/p-676139597.html

    如果不行,请说清楚什么错误,怎么不行

    评论

报告相同问题?

悬赏问题

  • ¥15 运筹学中在线排序的时间在线排序的在线LPT算法
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧