在 CRichEditCtrl控件里 显示位图

首先定义一个类继承自 CRichEditCtrl,头文件定义如下

  1. #pragma once  
  2.   
  3.   
  4. // MyRichEdit  
  5.   
  6. class MyRichEdit : public CRichEditCtrl  
  7. {  
  8.     DECLARE_DYNAMIC(MyRichEdit)  
  9.   
  10. public:  
  11.     MyRichEdit();  
  12.     virtual ~MyRichEdit();  
  13. public:  
  14.     void InsertBitmap(CBitmap & bitmap );  
  15. protected:  
  16.     DECLARE_MESSAGE_MAP()  
  17.     IRichEditOle    *richOle;  
  18. public:  
  19. protected:  
  20.     virtual void PreSubclassWindow();  
  21. };  

然后再cpp文件中实现如下

  1. #include "stdafx.h"  
  2. #include "MyIPMsg.h"  
  3. #include "MyRichEdit.h"  
  4.   
  5. #include <objidl.h>  
  6. #include <ole2.h>  
  7. #include <commctrl.h>  
  8. #include <richedit.h>  
  9. #include <oledlg.h>  
  10. #include <RichOle.h>  
  11. class TDataObject : IDataObject {  
  12. private:  
  13.     ULONG       refCnt;  
  14.     HBITMAP     hBmp;  
  15.     FORMATETC   fe;  
  16.   
  17. public:  
  18.     TDataObject() { refCnt = 0; memset(&fe, 0, sizeof(fe)); }  
  19.     ~TDataObject() {}  
  20.   
  21.     STDMETHODIMP QueryInterface(REFIID iid, void **obj);  
  22.     STDMETHODIMP_(ULONG) AddRef(void);  
  23.     STDMETHODIMP_(ULONG) Release(void);  
  24.     STDMETHODIMP GetData(FORMATETC *_fe, STGMEDIUM *sm);  
  25.     STDMETHODIMP SetData(FORMATETC *_fe , STGMEDIUM *sm, BOOL fRelease) { return E_NOTIMPL; }  
  26.     STDMETHODIMP GetDataHere(FORMATETC *_fe, STGMEDIUM *sm) { return E_NOTIMPL; }  
  27.     STDMETHODIMP QueryGetData(FORMATETC *_fe) { return E_NOTIMPL; }  
  28.     STDMETHODIMP GetCanonicalFormatEtc(FORMATETC *_fei ,FORMATETC *_feo) { return E_NOTIMPL; }  
  29.     STDMETHODIMP EnumFormatEtc(DWORD direc, IEnumFORMATETC **ife) { return E_NOTIMPL; }  
  30.     STDMETHODIMP DUnadvise(DWORD conn) { return E_NOTIMPL; }  
  31.     STDMETHODIMP EnumDAdvise(IEnumSTATDATA **nav) { return E_NOTIMPL; }  
  32.     STDMETHODIMP DAdvise(FORMATETC *_fe, DWORD advf, IAdviseSink *as, DWORD *conn) {  
  33.         return E_NOTIMPL; }  
  34.   
  35.     void InsertBitmap(IRichEditOle *richOle, HBITMAP hBmp);  
  36. };  
  37.   
  38. HRESULT TDataObject::QueryInterface(REFIID riid, LPVOID* ppv)  
  39. {  
  40.     *ppv = NULL;  
  41.   
  42.     if (IID_IUnknown == riid || IID_IDataObject == riid) {  
  43.         *ppv = this;  
  44.     }  
  45.     else return ResultFromScode(E_NOINTERFACE);  
  46.   
  47.     AddRef();  
  48.     return S_OK;  
  49. }  
  50. HRESULT TDataObject::GetData(FORMATETC *_fe, STGMEDIUM *sm)  
  51. {  
  52.     HBITMAP     hDupBmp = (HBITMAP)::OleDuplicateData(hBmp, CF_BITMAP, NULL);  
  53.     if (!hDupBmp) return E_HANDLE;  
  54.   
  55.     sm->tymed            = TYMED_GDI;  
  56.     sm->hBitmap          = hDupBmp;  
  57.     sm->pUnkForRelease   = NULL;  
  58.   
  59.     return S_OK;  
  60. }  
  61. ULONG TDataObject::AddRef(void)  
  62. {  
  63.     refCnt++;  
  64.     return refCnt;  
  65. }  
  66.   
  67. ULONG TDataObject::Release(void)  
  68. {  
  69.     int ret = --refCnt;  
  70.   
  71.     if (0 == refCnt) {  
  72.         delete this;  
  73.     }  
  74.     return ret;  
  75. }  
  76. void TDataObject::InsertBitmap(IRichEditOle *richOle, HBITMAP _hBmp)  
  77. {  
  78.     IOleClientSite  *ocs    = NULL;  
  79.     IStorage        *is     = NULL;  
  80.     LPLOCKBYTES     lb      = NULL;  
  81.     IOleObject      *oleObj = NULL;  
  82.     REOBJECT        reobj;  
  83.     CLSID           clsid;  
  84.   
  85.     hBmp        = _hBmp;  
  86.     fe.cfFormat = CF_BITMAP;  
  87.     fe.ptd      = NULL;  
  88.     fe.dwAspect = DVASPECT_CONTENT;  
  89.     fe.lindex   = -1;  
  90.     fe.tymed    = TYMED_GDI;  
  91.   
  92.     richOle->GetClientSite(&ocs);  
  93.   
  94.     ::CreateILockBytesOnHGlobal(NULL, TRUE, &lb);  
  95.     if (!ocs || !lb) goto END;  
  96.   
  97.     ::StgCreateDocfileOnILockBytes(lb, STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &is);  
  98.     if (!is) goto END;  
  99.   
  100.     ::OleCreateStaticFromData(this, IID_IOleObject, OLERENDER_FORMAT, &fe, ocs, is,  
  101.         (void **)&oleObj);  
  102.     if (!oleObj) goto END;  
  103.     ::OleSetContainedObject(oleObj, TRUE);  
  104.   
  105.     memset(&reobj, 0, sizeof(REOBJECT));  
  106.     reobj.cbStruct = sizeof(REOBJECT);  
  107.     oleObj->GetUserClassID(&clsid);  
  108.   
  109.     reobj.clsid     = clsid;  
  110.     reobj.cp        = REO_CP_SELECTION;  
  111.     reobj.dvaspect  = DVASPECT_CONTENT;  
  112.     reobj.poleobj   = oleObj;  
  113.     reobj.polesite  = ocs;  
  114.     reobj.pstg      = is;  
  115.   
  116.     richOle->InsertObject(&reobj);  
  117.   
  118. END:  
  119.     if (oleObj) oleObj->Release();  
  120.     if (lb)     lb->Release();  
  121.     if (is)     is->Release();  
  122.     if (ocs)    ocs->Release();  
  123. }  
  124. // MyRichEdit  
  125.   
  126. IMPLEMENT_DYNAMIC(MyRichEdit, CRichEditCtrl)  
  127.   
  128. MyRichEdit::MyRichEdit()  
  129. {  
  130.     richOle=NULL;  
  131. }  
  132. MyRichEdit::~MyRichEdit()  
  133. {  
  134. }  
  135.   
  136.   
  137. BEGIN_MESSAGE_MAP(MyRichEdit, CRichEditCtrl)  
  138. END_MESSAGE_MAP()  
  139.   
  140. void MyRichEdit::InsertBitmap( CBitmap & bitmap )  
  141. {  
  142.     TDataObject *dataObject=new TDataObject;  
  143.     dataObject->AddRef();  
  144.     dataObject->InsertBitmap(richOle,(HBITMAP)bitmap.GetSafeHandle());dataObject->Release();  
  145. }  
  146.   
  147. void MyRichEdit::PreSubclassWindow()  
  148. {  
  149.     this->SendMessage(EM_GETOLEINTERFACE, 0, (LPARAM)&richOle);  
  150.     CRichEditCtrl::PreSubclassWindow();  
  151. }  


使用时直接调用void MyRichEdit::InsertBitmap( CBitmap & bitmap )就行,在程序的最初还要进行如下初始化

AfxInitRichEdit();

AfxOleInit();


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值