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 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)