CRichEdit中插入bmp图像

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();。。。//要加入这个初始化函数



效果如下:

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值