91上位机VC MFC富编辑框插入图片
91上位机VC MFC富编辑框插入图片
功能展示
富编辑框中显示文字同时再显示图片,图文并茂效果更佳,我们当前例程给CRichEditCtrl播放图片扩展它默认的不支持图片插入功能,效果如图 要点提示 富编辑框中插入图片可以以这种形式实现GetIRichEditOle()->InsertObject(&reobject ); reobject 为REOBJECT 的OLE对象, 创建REOBJECT 首先得创建HBITMAP对象;使用函数LoadImage()便可快速创建HBITMAP位图对象;当前例程以此形式创建 HBITMAP bmp; //创建HBITMAP bmp = (HBITMAP): oadImage(NULL, sPath,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_DEFAULTCOLOR|LR_DEFAULTSIZE);其中sPath为位图所在路径;
实现功能 1.新建基于对话框的应用程序 2.新建自定义类class CRichEditCtrlEx : publicCRichEditCtrl,添加头文件#include <afxole.h>
#include <Richole.h>再添加 一函数用于位图void InsertBitmap(CString sPath); - void CRichEditCtrlEx::InsertBitmap(CString sPath)
- {
- HBITMAP bmp;
- //创建HBITMAP
- bmp = (HBITMAP)::LoadImage(NULL, sPath, 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;
- this->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 = this->GetIRichEditOle()->InsertObject( &reobject );
- delete pDataSource;
- }
复制代码最后是类的使用,在主对话框中添加富编辑框控件,关联我们的类CRichEditCtrlEx m_RichEditEx;然后通过按钮函数加载位图即可 CString s,s1; GetDlgItemText(IDC_EDIT1,s); s+=".bmp"; s1.Format("%s",".\\res\\"); s1+=s; m_RichEditEx.InsertBitmap(s1);
我们来演示下功能实现的整个过程
|