现在的位置: 首页 > 综合 > 正文

CRichEdit中插入bmp图像

2013年08月28日 ⁄ 综合 ⁄ 共 2000字 ⁄ 字号 评论关闭

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

效果如下:

 

抱歉!评论已关闭.