MFC中richedit控件插入BMP图片

1在对话框中拉入一个RichEdit控件。为它关联一个控件值

CRichEditCtrl m_rch;

2加入2个头文件

#include <afxole.h>
#include <richole.h>

3在对话框中,添加成员函数

[cpp]  view plain copy
  1. void CDialogDlg::InsertBitmap(CString *pBmpFile)     
  2. {     
  3.     HBITMAP bmp;     
  4.     //创建HBITMAP      
  5.     bmp = (HBITMAP)::LoadImage(NULL, *pBmpFile, IMAGE_BITMAP, 0, 0,     
  6.         LR_LOADFROMFILE|LR_DEFAULTCOLOR|LR_DEFAULTSIZE);     
  7.         
  8.     STGMEDIUM stgm;     
  9.     stgm.tymed = TYMED_GDI;     
  10.     stgm.hBitmap = bmp;     
  11.     stgm.pUnkForRelease = NULL;     
  12.         
  13.     FORMATETC fm;     
  14.     fm.cfFormat = CF_BITMAP;     
  15.     fm.ptd = NULL;     
  16.     fm.dwAspect = DVASPECT_CONTENT;     
  17.     fm.lindex = -1;     
  18.     fm.tymed = TYMED_GDI;      
  19.         
  20.     //创建输入数据源      
  21.     IStorage *pStorage;     
  22.         
  23.     //分配内存      
  24.     LPLOCKBYTES lpLockBytes = NULL;     
  25.     SCODE sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);     
  26.     if (sc != S_OK)     
  27.         AfxThrowOleException(sc);     
  28.     ASSERT(lpLockBytes != NULL);     
  29.         
  30.     sc = ::StgCreateDocfileOnILockBytes(lpLockBytes,     
  31.         STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &pStorage);     
  32.     if (sc != S_OK)     
  33.     {     
  34.         VERIFY(lpLockBytes->Release() == 0);     
  35.         lpLockBytes = NULL;     
  36.         AfxThrowOleException(sc);     
  37.     }     
  38.     ASSERT(pStorage != NULL);     
  39.         
  40.     COleDataSource *pDataSource = new COleDataSource;     
  41.     pDataSource->CacheData(CF_BITMAP, &stgm);     
  42.     LPDATAOBJECT lpDataObject =     
  43.         (LPDATAOBJECT)pDataSource->GetInterface(&IID_IDataObject);     
  44.         
  45.     //获取RichEdit的OLEClientSite      
  46.     LPOLECLIENTSITE lpClientSite;     
  47.     m_rch.GetIRichEditOle()->GetClientSite(&lpClientSite);    
  48.         
  49.     //创建OLE对象      
  50.     IOleObject *pOleObject;     
  51.     sc = OleCreateStaticFromData(lpDataObject,IID_IOleObject,OLERENDER_FORMAT,     
  52.         &fm,lpClientSite,pStorage,(void **)&pOleObject);     
  53.     if(sc!=S_OK)     
  54.         AfxThrowOleException(sc);     
  55.         
  56.     //插入OLE对象      
  57.     REOBJECT reobject;     
  58.     ZeroMemory(&reobject, sizeof(REOBJECT));     
  59.     reobject.cbStruct = sizeof(REOBJECT);     
  60.         
  61.     CLSID clsid;     
  62.     sc = pOleObject->GetUserClassID(&clsid);     
  63.     if (sc != S_OK)     
  64.         AfxThrowOleException(sc);     
  65.         
  66.     reobject.clsid = clsid;     
  67.     reobject.cp = REO_CP_SELECTION;     
  68.     reobject.dvaspect = DVASPECT_CONTENT;     
  69.     reobject.poleobj = pOleObject;     
  70.     reobject.polesite = lpClientSite;     
  71.     reobject.pstg = pStorage;     
  72.         
  73.     HRESULT hr = m_rch.GetIRichEditOle()->InsertObject( &reobject );     
  74.         
  75.     delete pDataSource;     
  76. }     


然后就可以调用这个函数了

[cpp]  view plain copy
  1. void CWhatFuckDlg::OnFasong()   
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     InsertBitmap(&CString("d:\\haha.bmp"));  
  5.   
  6. }  


值得注意的是,一定要API函数初始化,否则,运行之后是不会弹出窗口的

[cpp]  view plain copy
  1. BOOL CWhatFuckApp::InitInstance()  
  2. {  
  3.     ::AfxInitRichEdit();。。。//要加入这个初始化函数  



效果如下:

猜你喜欢

转载自blog.csdn.net/dragonrxl/article/details/8598741