1在对话框中拉入一个RichEdit控件。为它关联一个控件值
CRichEditCtrl m_rch;
2加入2个头文件
#include <afxole.h>
#include <richole.h>
3在对话框中,添加成员函数
void CRichEditIllustratePngDlg::InsertBitmap( CString pBmpFile )
{
HBITMAP hBmp;
hBmp = (HBITMAP)::LoadImage(NULL, pBmpFile, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_DEFAULTCOLOR|LR_DEFAULTSIZE);
STGMEDIUM stgm;
stgm.tymed = TYMED_GDI;
stgm.hBitmap = hBmp;
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();。。。//要加入这个初始化函数
本文介绍如何使用Visual C++将位图文件插入到RichEdit控件中。通过创建和利用OLE对象,实现位图在文本编辑器中的显示,并提供了一个具体的实现函数。
4537

被折叠的 条评论
为什么被折叠?



