找回密码
 注册
查看: 11221|回复: 0

RichEdit中插入Bitmap/GIF动画以及获取这些元素的信息的方法

[复制链接]
发表于 2006-12-11 22:33:14 | 显示全部楼层 |阅读模式
  利用RichEdit制作表情控件是,首先需要向RichEdit中插入图片(Bitmap)或GIF动画,然后需要从RichEdit中获取Bitmap/GIF的信息,以便向远端传送。
3 X1 w) c8 ?: T7 {: {  本人对RichEdit了解很有限。下面是本人根据网上找到的资料,以通过看MSDN整理出来的实现在RichEdit中插入Bitmap与/GIF的方法,在这里共享给大家。RichEdit方面的高手不要取笑。
1 [$ j8 \# e1 Z8 X  W2 Z3 I4 N  1.在RichEdit中插入Bitmap/GIF的方法5 G+ @* g; j) A$ m: s
  下面的代码是从网上找来的,我稍微作了一点修改(代码中红色部分是我改过的)。
& A8 O% Z5 P# G8 b8 J* V% bImageDataObect.h$ k+ }4 \- h+ i1 I$ j9 e1 P6 x
====================================================) W6 ]9 v4 r  R) @- [: J
#ifndef IMAGE_DATA_OBJECT__H& T% P" F5 `- e& _+ E# m( s
#define IMAGE_DATA_OBJECT__H
3 m( I0 ^2 L+ \6 d  _#include <Richedit.h>
, T; Q5 e% t2 Z$ L* Z% q#include <objidl.h.>
, r# Q# X4 \3 F2 x# @#include <Richole.h>
0 z' S! s4 N+ F4 l9 O: X3 Pclass CImageDataObject : IDataObject 6 p7 f) u- S8 G  j- a: M0 N
{
, Y0 A1 t8 _2 H- Qpublic:, |* b) F/ S8 J  T7 I5 }' v0 L
    // This static fumction accepts those parameters:
5 _; q8 h' d% V; E    // IRichEditOle* : a pointer to IRochEditOle interface for the RichEdit Control
% \6 Z, `% P$ G5 x  J9 Y$ F7 p* d    // HBITMAP : the bitmap handle.3 l1 u7 q' {( R: Z
    //DWORD dwUser - 位图相关的信( C  I! Y4 m/ z5 k2 n9 V
    // After calling the function, it inserts the image in the current # J5 `* F/ w* ~& S3 J. b. t
    //    position of the RichEdit
2 R1 D2 q: ^% m2 N  g9 j7 i    //
: v& O# p9 s* K( h0 x( X0 y8 }& B    static void InsertBitmap(IRichEditOle* pRichEditOle, HBITMAP hBitmap,DWORD dwUser);. e1 \0 W2 e. q$ k4 m& j! U1 y
    static void InsertGif(IRichEditOle *pRichEditOle,const char *gif_file,DWORD dwUser);
+ K7 q/ m0 e4 b' T6 A% T7 j
private:
' j1 p6 F& h, l  h    ULONG    m_ulRefCnt;' e% O6 W. ?; A1 j  Y: w$ W3 {
    BOOL    m_bRelease;
' ^+ |' q  {3 D5 i. N: T    // The data being bassed to the richedit
8 P( v# f# X' y3 U! _: G2 @9 {7 i    //
# `; ~7 K& c( W# j! O3 X% y    STGMEDIUM m_stgmed;+ A0 ?! S- s. ~) j( j5 C  O
    FORMATETC m_fromat;
7 _& w: D* C0 k. N  Rpublic:
5 w. R8 g4 p8 q8 r5 ?/ R    CImageDataObject() : m_ulRefCnt(0)
. q: l3 h) o1 A* G. r' W1 [1 s    {
% [4 Q8 D4 c8 T  @( h0 W        m_bRelease = FALSE;
2 X1 t7 K- R& N6 r- k, n! k    }1 l. f& e( c' v6 a
    ~CImageDataObject()
4 z0 D7 o" g5 p% i2 ]: q9 x- n    {0 j& K8 Y) ~) V6 u; d% T2 _8 H
        if (m_bRelease)
  E9 D" K. V1 m! A! K( B            ::ReleaseStgMedium(&m_stgmed);  @7 h8 P( ~% x, s3 Z9 a- m+ e
    }
% H8 h/ |  b' [5 R    // Methods of the IUnknown interface7 g: B/ H( j" B1 s# N
    //   S2 K& e" e1 a
    STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject)  E( R2 w3 m1 T( }
    {0 W/ [  t# p+ @2 j. O
        if (iid == IID_IUnknown || iid == IID_IDataObject)) ?) W0 I! Y6 t5 T( U) F* C
        {
5 O9 o! o& b, {$ [            *ppvObject = this;
1 O: W9 |/ @0 c% G) W            AddRef();' o+ E0 C/ {2 ~: w! X1 r
            return S_OK;1 J1 z/ ?% J+ d5 ^
        }' D& ?$ c/ r! L3 l! W
        else
  V3 @* ?/ J% _4 f            return E_NOINTERFACE;" o' B2 H1 S0 _" u) H
    }
! m8 U% M, W5 O' {2 u0 @- p8 Y    STDMETHOD_(ULONG, AddRef)(void)
& r" m% j( L' ?* i; T; k0 Z    {# v4 k+ j# z9 x' s1 W
        m_ulRefCnt++;4 M- y# M+ l1 j1 ^* h  v
        return m_ulRefCnt;
- }, u3 a) X$ n6 i    }" v' c4 }& d/ ]) M6 w# ^$ s% e$ h  I
    STDMETHOD_(ULONG, Release)(void)4 {! W2 t8 K; @+ n1 g
    {; M7 E% r) ~3 O
        if (--m_ulRefCnt == 0)
" h0 D  W( l9 g" J- |        {3 \, n* M( Y0 C! j" t! |' V
            delete this;
4 |8 W  `2 y3 K8 I9 F- i0 {        }# ]) \3 C* o3 K# d0 R
        return m_ulRefCnt;
& t( y1 ?$ n8 x$ T8 W/ M    }
; M& ^/ Y# T% f6 m% j3 V$ j/ P    // Methods of the IDataObject Interface) `; h* x0 [, O+ z+ @* E
    //
2 F( A* Z5 C9 M7 [4 |  j* `+ f+ F  B    STDMETHOD(GetData)(FORMATETC *pformatetcIn, STGMEDIUM *pmedium) {
% b2 q$ U9 O9 i6 n& B; V) {% z        HANDLE hDst;
: ^5 l$ W- @* y3 H        hDst = ::OleDuplicateData(m_stgmed.hBitmap, CF_BITMAP, NULL);2 X4 m9 Z; e8 G# s& k2 n, f
        if (hDst == NULL)
$ ~0 L8 v; U& T8 B$ r        {# H" m- \# T' K5 S( M3 c; B' m& [
            return E_HANDLE;
: e; T! R% r) `+ d& G0 w$ g        }$ p- m* u! u: T- ~" {  E) e. p
        pmedium->tymed = TYMED_GDI;
. R6 Q% g3 u5 g: w5 |8 }6 [        pmedium->hBitmap = (HBITMAP)hDst;
2 e# h" D: j7 y: A  b/ N, q        pmedium->pUnkForRelease = NULL;
( F5 I3 C* E, L! A/ Q        return S_OK;
1 h; m( W5 _8 V, A    }, o1 f  `3 u2 Y; Y
    ( ]( U6 i% u% j% [7 ?
    STDMETHOD(GetDataHere)(FORMATETC* pformatetc, STGMEDIUM*  pmedium ) $ K# }" z4 Q) r9 E
    {. i3 K" Z' H5 }8 M' h: H- f% |
        return E_NOTIMPL;
: d+ \8 V6 f5 f/ f    }+ s9 `; w' W) S4 z) }$ e8 `  e
    . g' M: x, y9 v8 J# r* v: P  Q
    STDMETHOD(QueryGetData)(FORMATETC*  pformatetc ) 4 Q( E' h9 w3 [! w* y# E" J! t* b
    {
* t+ H& a' P+ T7 e. h" A        return E_NOTIMPL;
3 K& q# `2 h3 }# K- X3 @; I8 ^  k    }
8 K; J' A' |9 A! u' e& X    7 S. L' y8 k# g" p6 S5 _
    STDMETHOD(GetCanonicalFormatEtc)(FORMATETC*  pformatectIn ,FORMATETC* pformatetcOut )     
. X$ z6 T0 c$ ?6 @  u    {
- r+ u" i( f, d3 N) p8 W) Y        return E_NOTIMPL;
# ~+ l) f# ^. V6 e) [    }. d7 e* p& k& g& R5 \) E% M* s
    & b5 X- D  N  |
    STDMETHOD(SetData)(FORMATETC* pformatetc , STGMEDIUM*  pmedium , BOOL  fRelease )
1 F: F- @* X& x% r- u    {
) F" F* u% b/ Y. ?) ]        m_fromat = *pformatetc;
9 k% ], K: t1 n2 K) s  C        m_stgmed = *pmedium;+ B" `( Y2 G0 _" e0 t
        return S_OK;
) Q0 |5 O: |0 c& F* }( @    }
! Y) @3 J. ~* Z5 Q' U6 H; H    4 o+ N" X4 d2 w  w
    STDMETHOD(EnumFormatEtc)(DWORD  dwDirection , IEnumFORMATETC**  ppenumFormatEtc ) " [) ?- a6 q. w- r* X6 n0 W5 \
    {
% C2 f+ B) U$ U& F. J) i6 o  @* v        return E_NOTIMPL;! A5 |2 o8 q# I4 r) W' z% F
    }9 ?, }  {$ h, S# s
    ( r6 e, Q: R( V8 E
    STDMETHOD(DAdvise)(FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink,
' _( d5 [! ]+ j        DWORD *pdwConnection)
4 e6 N- u! p$ K4 E* ^0 f, p    {1 F" X* U0 W1 T9 @! y
        return E_NOTIMPL;
6 A- F) I: q+ a4 D" I    }
7 m5 x2 y4 D, @  U, n; M" F    ! C& `# v% T8 ]' p: R2 ]+ ^
    STDMETHOD(DUnadvise)(DWORD dwConnection) 8 k  l2 v  P& _6 X4 Y
    {
* D3 g- o' p0 D2 ^. G        return E_NOTIMPL;
* [5 y- _' l+ e; o9 y+ F4 {' t    }$ L2 D8 h: N+ Z- d! [5 Z& S
    - i* i4 y: n5 x5 n8 G
    STDMETHOD(EnumDAdvise)(IEnumSTATDATA **ppenumAdvise) & M# c0 M4 F2 `6 j
    {
) I: v3 Y' d+ C& g) {/ z5 p        return E_NOTIMPL;( T! R+ k+ t& A# q% N- f
    }
" T7 K. L/ \& D$ j+ ~1 e    // Some Other helper functions
9 r7 Y$ i4 F* _) a; ]/ g2 z    //0 }" J4 O' o" n( C/ q9 j
    void SetBitmap(HBITMAP hBitmap);
3 a/ W0 E5 C. d: k7 T0 a3 ?    IOleObject *GetOleObject(IOleClientSite *pOleClientSite, IStorage *pStorage);
2 F! V6 ^8 p# u+ J0 x};  l6 D6 _5 o3 }
#endif // IMAGE_DATA_OBJECT__H
! R5 o9 m5 H4 |===========================# _" R  s; S. \) ^
ImageDataObject.cpp
. O  u. G- m( b- u7 K( M9 F#include "stdafx.h"  //我很不喜欢这个头文件,这个程序只能在windows下运行,就留着吧
/ F9 H* S2 r, \$ t# Y5 k
#include "ImageDataObject.h": t5 |# c5 n% c3 b8 m. |
#import "ImageOle.dll" raw_interfaces_only, raw_native_types, no_namespace, named_guids, auto_search7 ?7 B+ p; `5 x4 G2 M
static CLSID const gif_clsid = { 0x6ADA938, 0xFB0, 0x4BC0, { 0xB1, 0x9B, 0xA, 0x38, 0xAB, 0x17, 0xF1, 0x82 } };

3 s# q6 U( b% ]/ }/ V- f. j) Mvoid CImageDataObject::InsertBitmap(IRichEditOle* pRichEditOle, HBITMAP hBitmap,DWORD dwUser)
0 s8 K5 P8 M# a! w0 O0 O{6 Z7 s8 D) u( h7 V% m8 b5 A
    SCODE sc;
7 m  a; C1 z- s* G# w+ G9 x4 R2 }9 L    // Get the image data object$ D9 L0 l3 N: h# g
    //
2 L* a: Z. J! y3 S. ]: }    CImageDataObject *pods = new CImageDataObject;
/ Y" f# D6 Z7 K" @; `    LPDATAOBJECT lpDataObject;
1 O6 a) q% O: \( q# O    pods->QueryInterface(IID_IDataObject, (void **)&lpDataObject);8 b! |' @, a! c- S* u9 ^# Y2 l
    pods->SetBitmap(hBitmap);
. J# |) w- }9 u9 e0 j! L8 b0 {    // Get the RichEdit container site% N$ D( s) h0 M6 t* g5 ]- t
    //8 e# s8 v) Z) D
    IOleClientSite *pOleClientSite;   
# e* \* E/ w# V% l1 u) T   
7 O8 v  \' R1 V: C. m    pRichEditOle->GetClientSite(&pOleClientSite);
& F2 m7 U; O( y1 N    // Initialize a Storage Object1 m( R( s, N9 p
    //
; d% J/ m% \; w: H) r" H    IStorage *pStorage;   
) r' A! N# I# A6 m% [% Y( c    LPLOCKBYTES lpLockBytes = NULL;  I- X; r% B/ L) k1 r  o) C( L
    sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);0 I- j9 _4 C$ `; e
   
; }# M4 A5 m& S) }8 B& [    sc = ::StgCreateDocfileOnILockBytes(lpLockBytes,
& `, G# s! Y' r2 o        STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &pStorage);. C8 I6 S# R+ s* l7 `9 X, n

/ _7 L( N0 Q* [; B1 T    // The final ole object which will be inserted in the richedit control9 Y1 g9 z2 ~, K& V& @  o
    //) F! G& g) |& F& X! G6 e- T
    IOleObject *pOleObject; % q2 T( W; D" J! W
    pOleObject = pods->GetOleObject(pOleClientSite, pStorage);) \7 J( y9 O' _% b4 v
    // all items are "contained" -- this makes our reference to this object: F; V# z6 S! O' R( L
    //  weak -- which is needed for links to embedding silent update.! g% S: t  c; T( ?' ~+ Q, |
    OleSetContainedObject(pOleObject, TRUE);
  K% v0 T  X0 J' {, W; Z$ c9 d    // Now Add the object to the RichEdit
. X0 ?! D9 i% h' H    //% q+ H) x% X9 l! C- c0 n' i3 w
    REOBJECT reobject;
5 K3 f  O8 M+ W+ W* y7 w  s    ZeroMemory(&reobject, sizeof(REOBJECT));) T# I# E2 o! p$ J% J# E- r$ Y
    reobject.cbStruct = sizeof(REOBJECT);
$ h3 l1 G. ]) |; m0 e- o6 ?    8 b0 b1 z3 ?) v# h* H, b6 b
    CLSID clsid;% ^2 E4 b, Y3 _* x9 D6 f/ i
    sc = pOleObject->GetUserClassID(&clsid);: f# w. u4 W" U  ^, S" z+ w
9 ]5 V; l8 k! t
    reobject.clsid = clsid;1 f- V0 Q7 u, c4 ^
    reobject.cp = REO_CP_SELECTION;
3 z  ?% [: q, Q  w9 }3 Q    reobject.dvaspect = DVASPECT_CONTENT;/ [6 {* t! u' K+ |2 B5 H- c
    reobject.poleobj = pOleObject;6 X4 m# t. A4 Y; d! q7 |: M! ^5 P( `9 B$ J
    reobject.polesite = pOleClientSite;
# k# d$ L4 |! M+ q    reobject.pstg = pStorage;+ s! @" }! z' i! D
reobject.dwUser = dwUser;5 D. j, W( X7 L- D
    // Insert the bitmap at the current location in the richedit control
: w. a' I9 Z: c, h    //1 E, q) ^* n, a6 V& |8 H
    pRichEditOle->InsertObject(&reobject);
( \% O7 k  S9 @. m4 J    // Release all unnecessary interfaces  H( i' _% F' `) ]
    //
: L; @% m' N; _( E! U    pOleObject->Release();, b) i) N1 p: R1 w. D# Q
    pOleClientSite->Release();" i. l7 z* N$ J- m, i3 l
    pStorage->Release();$ d; j& g. W$ d7 ~( w
    lpDataObject->Release();# f0 |5 `9 E6 d% C
}0 V+ L7 b2 \* Z: k* I
void CImageDataObject::InsertGif(IRichEditOle *lpRichEditOle,const char *gif_file,DWORD dwUser)
5 h' i+ j  b; F6 M2 ^1 y4 R7 e  B{
6 q" N) ~, }. N- f) ?9 CLPOLEOBJECT  lpObject=NULL;
; d' a5 N8 ~3 X' t0 n; }& K( kLPSTORAGE       lpStorage=NULL;2 ?: E5 ^. A# R
LPOLECLIENTSITE lpClientSite=NULL;
) @& v+ I0 |; @" D3 DLPLOCKBYTES  lpLockBytes = NULL;
1 y. t1 S$ ?9 k8 y0 F& \
HRESULT hr=S_OK;
# C: a+ I% X1 a* JCLSID clsid=CLSID_NULL;
6 f; A% v6 O6 c" Vdo{
) i2 ?( N) F# b9 Q( X& c0 M  hr= ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);
8 L" x& |3 |1 L& M  {' V: b6 _8 F  if (hr != S_OK || lpLockBytes==NULL) 9 {! l5 D. g! I' k
   break;
$ S! i: x5 `# g4 i8 k) U- K
  hr= ::StgCreateDocfileOnILockBytes(lpLockBytes, STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &lpStorage);
8 r  t/ a0 P; q, T5 F  if (hr!= S_OK||lpStorage==NULL)
- F0 Z# P4 m" }4 b  l, G   break;

; K( U+ `, X0 N) k, T! t  hr=lpRichEditOle->GetClientSite(&lpClientSite);3 O2 d, z1 w) A: z$ |# L: h
  if (hr!= S_OK||lpClientSite==NULL) - H  ?  V/ r  {0 M2 X+ \
   break;
9 r0 P, G6 d5 I$ g
  try
$ z) y% j3 `0 w  {
6 j0 M: U5 Z  e4 G: [8 _) d   HRESULT hr;+ P6 G( F# @. W9 e" }' J
   IGifAnimator *pGif  = NULL;6 `7 M+ G& H+ S" s% @, r9 J
   hr = CoCreateInstance(gif_clsid,NULL,CLSCTX_INPROC_SERVER , IID_IGifAnimator,(void **)&pGif);# B/ ?9 }$ v- N; c3 A
   if(FAILED(hr) || pGif == NULL)8 k* c: ~; v: j% z
    break ;
7 }  D3 f  d9 _
   _bstr_t bstrPath(gif_file);" H% z/ w6 @8 _. I0 O9 z
   pGif->LoadFromFile(bstrPath);& F0 p/ n( @) E& J4 k; S  q9 d8 ]
   if(FAILED(hr))
" N- _- }. `: C' ^; V. X   {
/ w( u8 X0 X5 @2 W    pGif->Release();
% q) U, {  I% ~' C1 E8 e    break ;7 B- q/ f) D$ b
   }

# ?2 v8 u$ b- j" D% T, s   hr = pGif->QueryInterface(IID_IOleObject, (void**)&lpObject);
6 z, y* O+ R' ?4 ?* W# K   if( FAILED(hr)||lpObject==NULL)
; y& c, r! _4 L* H8 N- M  m   {! ]' b6 W/ g4 X6 G5 Z
    pGif->Release();2 l7 c4 t1 K8 a( t4 H. _
    break ;) L) p6 p* ]) o. ?- D9 s
   }( s0 E# K4 g5 L6 r0 t: z5 B0 T
   # W# R6 j2 d. {% [. E1 M. d6 `
   hr=OleSetContainedObject(lpObject, TRUE);6 E' K' \) C+ h+ m! r/ X
   if( FAILED(hr) )
7 L1 H' g7 B$ Z  s0 _9 {* \   {6 A7 C1 v+ ^: a1 i# ^5 S- H
    pGif->Release();
; @+ ]1 N4 a2 O! l" Q" i9 s6 _    break ;
5 u8 g* ^  \) V   }
, m" c; o% O4 Z! |0 `+ @   hr=lpObject->GetUserClassID(&clsid);
0 q( b! m% K- h) L6 A" V7 w   if( FAILED(hr) )
# x' z' q8 c9 |7 ]. r   {& Y( c9 v4 [& v6 ~3 y' J1 h
    pGif->Release();
& B4 o# T- ?' O" ]$ R! Y' Y/ v    break ;
1 m& }4 _2 G( k' L   }

3 y1 k' w# s6 \3 X, N   REOBJECT reobject;% U% L4 v8 |6 W2 O5 _; j. {" h
   ZeroMemory(&reobject, sizeof(REOBJECT));
9 p; c9 u: y1 g2 A2 d3 w% r   reobject.cbStruct = sizeof(REOBJECT); 8 }) a: n  J2 L0 D
   reobject.clsid = clsid;+ M2 w* L& A+ k) Q! v! r' T
   reobject.cp = REO_CP_SELECTION;
1 T, ?/ F6 w! @. S& r* A   reobject.dvaspect = DVASPECT_CONTENT;
3 O5 \* R; W) B$ Q+ _   reobject.dwFlags = REO_BELOWBASELINE;
7 \9 a- p8 Q) H% o8 |1 r0 _" }; {/ l   reobject.dwUser = dwUser;
+ q' @0 D" W) e+ e$ E% Q+ a   reobject.poleobj = lpObject;) x9 X+ r& C* @2 `# Z
   reobject.polesite = lpClientSite;
1 b( D/ `% C, `' D   reobject.pstg = lpStorage;1 g+ {1 K) s" N6 H( T; \
   SIZEL sizel={0,0};. c/ f) `" |( \' k
   reobject.sizel = sizel;! w' T; Q2 N& S' J
   hr=lpRichEditOle->InsertObject(&reobject);' g) n, T5 B: d1 F: N
  }
7 ?$ f! |5 V9 {1 S  catch( _com_error &e )% h; f: |+ r6 X4 E
  {+ O$ D( l3 _( ~/ E  M$ c7 F
  }
) Q0 e+ J6 M& }2 \" M
}while(FALSE);
7 `9 a8 ?+ O. S/ Kif(lpLockBytes) lpObject->Release(); 1 g/ \/ ], Y5 H7 R( j7 J% J) e
if(lpLockBytes) lpLockBytes->Release();1 X7 X9 ~/ S1 @) m! j; a* i# i
if(lpClientSite) lpClientSite->Release();1 @% ~9 n( m9 [* N0 R. f
if(lpRichEditOle) lpRichEditOle->Release();" f! s3 p4 t8 @/ s8 G9 E
}
3 m) ^6 D' m$ D4 q- S0 K7 L
/ l" o3 M$ j8 h2 d* i. F) o) L4 T# k
//////////////////////////////////////////////////////////////////////
, C. @# j/ g% Z! b// Construction/Destruction9 w% g, \3 G; ]% N! n+ L3 j0 @
//////////////////////////////////////////////////////////////////////
. v, n& C8 C, }/ X) r) Mvoid CImageDataObject::SetBitmap(HBITMAP hBitmap)
6 C0 Z! F! Q: e* o" a{
5 D8 s1 m9 }; E% N6 ~
' o: u6 \) y* Z    STGMEDIUM stgm;1 u) R: g, P+ d2 P* ~/ {& N) J2 `* b
    stgm.tymed = TYMED_GDI;                    // Storage medium = HBITMAP handle        # l1 Y- A/ G* ~( s
    stgm.hBitmap = hBitmap;" x9 c1 I6 U$ j, N
    stgm.pUnkForRelease = NULL;                // Use ReleaseStgMedium
( ]3 S% P8 ?% p$ {    FORMATETC fm;
4 v" ^8 G$ M9 j# b" O# y# _    fm.cfFormat = CF_BITMAP;                // Clipboard format = CF_BITMAP
: J* C- f! n8 j2 r    fm.ptd = NULL;                            // Target Device = Screen* s: U: n0 }' w
    fm.dwAspect = DVASPECT_CONTENT;            // Level of detail = Full content; U0 _- f# T" y" z4 X7 S; E$ S: a
    fm.lindex = -1;                            // Index = Not applicaple1 v8 G. O$ m: y/ J
    fm.tymed = TYMED_GDI;                    // Storage medium = HBITMAP handle, |- B2 c6 L( y, K
    this->SetData(&fm, &stgm, TRUE);        
8 U0 O9 l( b9 u: g1 N}+ i* S1 p2 s! Z8 Y' z
IOleObject *CImageDataObject::GetOleObject(IOleClientSite *pOleClientSite, IStorage *pStorage); a8 M- s, x: x0 u6 e9 ]" m* z
{( ?! c2 I$ {$ t, ^( w& H5 M8 G

# O, W- u* @% n1 J) O2 e4 Q4 u% e    SCODE sc;
+ q  L8 b+ Y8 y% I( c2 R; ]    IOleObject *pOleObject;& l/ K7 n- k' e. K  |
    sc = ::OleCreateStaticFromData(this, IID_IOleObject, OLERENDER_FORMAT,
  {3 t+ N* b9 u9 O" H- O- X0 w1 ?            &m_fromat, pOleClientSite, pStorage, (void **)&pOleObject);
% O4 y" {2 g! f  K1 T    return pOleObject;
4 \9 N$ P* ~# W! s}
* E- _- u7 E! d4 f/////////////: X* q. [. y! s. J- m7 r8 O
  OK,下面是想RichEdit中插入bitmap的范例
/ u8 c1 N' g3 _2 _  CImageDataObject::InsertBitmap(m_sendRichEdit.GetOleInterface(),bmp.m_hBitmap,dwBitmapInfo);
2 W/ x( W2 D/ e( ~2 T  上面是m_sendRichEdit是一个RichEdit控件(这段代码是从一个WTL项目中提取出来的)。  t; {3 ]" x1 {
  注意:上面的dwBitmapInfo就是应用程序设置的与插入RichEdit中的Bitmap相关的信息。
& S% s5 O& a# G  _  2. 从EditRich中提取位图信息
* Q. n7 O/ B1 n! {7 a     下面是范例代码,其中原来就不多说了,看代码吧。% X% {1 k2 O* h; l4 J+ T* ^2 R
    //获取RichEdit中有几个bitmap,这里假设RichEdit中有位图文件4 u( A5 ^/ J6 @3 q+ y( w
    int c = m_sendRichEdit.GetOleInterface()->GetObjectCount();     
2 h# X7 W* W' z3 p1 d5 O+ G% ?   for(int i = 0 ; i < c ; i++) //遍历位图
" G( q( }+ W( g/ s8 y, ]; @( l5 }   {
3 w- S) M, o5 |  I: y       REOBJECT object;  //位图信息存在这里( @4 f+ N5 X( |* y, q) d4 ^4 c' K
     memset(&object,0,sizeof(REOBJECT));
4 ]- m; n% X, P; j% R$ W! v/ C5 y     object.cbStruct = sizeof(REOBJECT);
/ b7 i, K2 n( @/ @" H* D  B4 o' _     m_sendRichEdit.GetOleInterface()->GetObject(i,&object,REO_GETOBJ_ALL_INTERFACES);$ k8 L, t" Q- l3 ^
     int pos = object.cp ; //位图的位置信息( l: w% L* i) ~! d2 V
     DWORD dwUSer  =object.dwUSer ; //位图的信息,之前应用程序设置的,应有程序当然知道什么意思了) r- {+ c0 t/ `4 ^- A4 I5 [
  }
* b0 m5 }' F& I/////////////////////////////////////////////////////
( f1 f/ k+ |. x  E, u- p, ~2 ROVER
8 x$ R1 R. d1 }1 s1 J////////////////////////////////////////////////////
. H1 B0 L* x- k) D2 i7 M3 U/ B# L1 m8 j  a* G3 m) ~8 H
  W3 `9 f/ {  L& k
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=391030
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-10-1 22:01 , Processed in 0.018282 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表