1在对话框中拉入一个RichEdit控件。为它关联一个控件值
CRichEditCtrl m_rch;
2加入2个头文件
#include <afxole.h>
#include <richole.h>
3在对话框中,添加成员函数
- void CDialogDlg::InsertBitmap(CString *pBmpFile)
- {
- HBITMAP bmp;
- //创建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;
- 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;
- }
然后就可以调用这个函数了
- void CWhatFuckDlg::OnFasong()
- {
- // TODO: Add your control notification handler code here
- InsertBitmap(&CString("d:\\haha.bmp"));
- }
值得注意的是,一定要API函数初始化,否则,运行之后是不会弹出窗口的
- BOOL CWhatFuckApp::InitInstance()
- {
- ::AfxInitRichEdit();。。。//要加入这个初始化函数
效果如下: