1. 程式人生 > >MFC中richedit控制元件插入BMP圖片

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();。。。//要加入這個初始化函式  



效果如下: