找回密码
 注册
搜索
查看: 11069|回复: 0

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

[复制链接]
发表于 2006-12-11 22:33:14 | 显示全部楼层 |阅读模式
  利用RichEdit制作表情控件是,首先需要向RichEdit中插入图片(Bitmap)或GIF动画,然后需要从RichEdit中获取Bitmap/GIF的信息,以便向远端传送。4 s; ^; B/ k4 a$ \4 s
  本人对RichEdit了解很有限。下面是本人根据网上找到的资料,以通过看MSDN整理出来的实现在RichEdit中插入Bitmap与/GIF的方法,在这里共享给大家。RichEdit方面的高手不要取笑。, g  x+ r6 k' O* @- A$ u; i9 g
  1.在RichEdit中插入Bitmap/GIF的方法5 ^8 V& X0 I8 l" U
  下面的代码是从网上找来的,我稍微作了一点修改(代码中红色部分是我改过的)。- B4 r+ b2 x) M0 O4 E
ImageDataObect.h
8 i# M4 n! @+ n4 |* J====================================================2 Q$ W; y: v6 C! o" P3 [$ x+ j
#ifndef IMAGE_DATA_OBJECT__H
) E9 H. [. U- l6 N#define IMAGE_DATA_OBJECT__H
% k6 |$ d& E6 V3 ~3 W4 D: V# Y#include <Richedit.h># J0 Y5 N4 o" a
#include <objidl.h.>
1 t  f, s' O9 A/ N, s% u8 }7 U#include <Richole.h>
6 F; k/ R) I) O( ]$ ?class CImageDataObject : IDataObject
% @& V( v/ ]8 D% @9 \# G{
( N& Z" w5 j5 jpublic:
* k4 j/ I( m- S8 J6 q# c. X    // This static fumction accepts those parameters:2 s% G& \) V0 P& x. M$ W2 F
    // IRichEditOle* : a pointer to IRochEditOle interface for the RichEdit Control
% h/ t( h- Z1 N" y* B    // HBITMAP : the bitmap handle.
$ o9 {- Q* p7 W/ l" w  `. Y    //DWORD dwUser - 位图相关的信
! M! G5 G+ Q4 j, u: T3 |( h    // After calling the function, it inserts the image in the current
. ?. ^3 A4 J, j+ q' O' z    //    position of the RichEdit
* C; ^) {! o7 C, |; X    //% \: ]+ K& N: k% v+ ]9 d
    static void InsertBitmap(IRichEditOle* pRichEditOle, HBITMAP hBitmap,DWORD dwUser);
: N5 i" K0 z. ^) O    static void InsertGif(IRichEditOle *pRichEditOle,const char *gif_file,DWORD dwUser);

( X5 ^# q9 |# [7 R4 }4 [% W) Yprivate:
* x; p6 ?/ l+ v# Y    ULONG    m_ulRefCnt;8 W0 V3 o( V3 V) B
    BOOL    m_bRelease;
" q. r9 m4 V6 ^* j9 A# {    // The data being bassed to the richedit
$ y/ @; h! v( [; {" C* g+ V/ c    //) |6 A' M9 r) ]3 f& C
    STGMEDIUM m_stgmed;
3 J( Z3 v" a) Z5 ?& t    FORMATETC m_fromat;0 W6 {; E# P  t1 \  f
public:& c0 j7 ^+ m2 D* v' O7 g1 z
    CImageDataObject() : m_ulRefCnt(0)5 b% V5 r0 S6 u
    {
8 J% V% c7 z$ {0 T7 ^        m_bRelease = FALSE;% ^8 Y/ W3 h3 t) Q; r* b; O# }( W
    }8 v. J5 r) U" P& r2 }- D) @( [0 _
    ~CImageDataObject()# `+ `$ c9 {4 [4 o0 j! }
    {
3 G0 t4 d4 r/ u        if (m_bRelease)& T2 v8 i) r# F3 i& C+ |- D
            ::ReleaseStgMedium(&m_stgmed);* X5 z% Y* a/ o4 A9 L4 ^
    }
: V- z* w7 A. y( q+ `    // Methods of the IUnknown interface
& d" w: D' e( p6 l    // ; S$ u1 e6 y9 Z4 n
    STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject)) c3 ]- ?6 Q/ ?5 I4 ^
    {
% p% w4 {$ I$ V, X& W* J        if (iid == IID_IUnknown || iid == IID_IDataObject)
5 s4 N! m3 G. Y# L$ o        {3 c$ L/ {  ^- o9 n
            *ppvObject = this;8 M) N( B" Q1 ]6 s! w& Y
            AddRef();# x5 I6 T: D2 x
            return S_OK;
! b/ C  R+ j) f' T; T6 o! }        }6 H1 t% \6 {& R* _+ y
        else
* ]8 v1 h3 a. q2 c3 S% S            return E_NOINTERFACE;
7 v' B! k9 Z9 @& c) K    }
1 j$ ?. g0 d& L! u) h0 D0 V' ]# x    STDMETHOD_(ULONG, AddRef)(void)9 t; [& c8 s" t' S
    {3 I: w, o4 o" m/ q# I# _
        m_ulRefCnt++;
2 [' A: P, z3 f! w; {! l8 v        return m_ulRefCnt;
  \$ ^& V3 Y$ d/ E: P- r    }
1 u/ u, C# f+ C) m% c- X8 V    STDMETHOD_(ULONG, Release)(void)/ a# o" T8 ?$ V  s; `
    {
4 o0 {6 U# H& y- E" |9 ?' p        if (--m_ulRefCnt == 0)
+ e7 m' w: W% r  ~5 C4 R7 {        {
  m- v$ y5 z$ v. G2 X2 x            delete this;
# j# I: f  k* W  c6 e1 n        }% i8 D/ ^1 H& V
        return m_ulRefCnt;
1 e$ c) X% K' F. @. K( x( q    }4 \2 Z% t8 C+ d: E2 D! b- B+ W
    // Methods of the IDataObject Interface( i& s, y8 e: T4 X# Y  h# F
    //
  k/ }4 v( i, U2 f: d    STDMETHOD(GetData)(FORMATETC *pformatetcIn, STGMEDIUM *pmedium) {
8 G* T$ E( H9 u: g) D        HANDLE hDst;1 l5 ~8 g2 d6 j& M& L
        hDst = ::OleDuplicateData(m_stgmed.hBitmap, CF_BITMAP, NULL);( \0 ]4 y( `5 w; T
        if (hDst == NULL)% C" `: S* Y; \- `1 B* [' x9 I
        {
, u  w6 B* X  \& E5 Y% T8 M4 b            return E_HANDLE;6 V: V% X, x; ~5 Q
        }4 u7 |$ t3 @# Q6 b$ U9 r- y
        pmedium->tymed = TYMED_GDI;
& X( b! b' N4 W6 a        pmedium->hBitmap = (HBITMAP)hDst;
3 l9 p5 z; @- q* ]. K        pmedium->pUnkForRelease = NULL;: ]8 z& x4 d- k7 K# S! W7 r
        return S_OK;
; U) y/ `3 }8 _% m8 t" `    }" ?4 Z1 R0 p7 `0 c) k( i' T
    # N: G3 q3 a4 ]( @3 B# A. K
    STDMETHOD(GetDataHere)(FORMATETC* pformatetc, STGMEDIUM*  pmedium )
! o) i3 a$ e7 q5 `5 w( N    {: j/ @3 Y% T+ [5 m$ R
        return E_NOTIMPL;- L1 L) m/ }! \
    }
) b; M+ d9 M) H# r    ( d- n  ]1 i9 g. K- z- \  x4 t
    STDMETHOD(QueryGetData)(FORMATETC*  pformatetc ) : l& A! D- M" G$ D3 W& L; F
    {$ O- H% l9 r# m0 q! C' P( o" n
        return E_NOTIMPL;1 I4 j1 I8 x- d* H
    }
& E; Q- |, H/ g0 t2 C( ~$ b3 }7 U   
5 m: I0 }7 o; x: o: f# g/ G5 ]* k    STDMETHOD(GetCanonicalFormatEtc)(FORMATETC*  pformatectIn ,FORMATETC* pformatetcOut )     
& d3 \. ]! S* l9 f3 F, O    {
/ C1 u2 R# O1 a' H- j/ J        return E_NOTIMPL;" Z  I* G6 q8 q# s) ?  O7 y5 }
    }8 z* J" k2 K6 u* Y, f  R. r+ j$ d8 j( o
   
: e9 M% m1 Q- V$ V- q    STDMETHOD(SetData)(FORMATETC* pformatetc , STGMEDIUM*  pmedium , BOOL  fRelease )
$ q: ^! L( e1 w# l9 n. B, G    {9 S; z- e5 q: `1 ]; z/ q- _6 r
        m_fromat = *pformatetc;
# k2 |/ C! ]9 G9 E2 @# d8 |0 |" ?        m_stgmed = *pmedium;
# T- c" \0 Q9 O  w$ o- H        return S_OK;% A$ p% {0 n! x  h/ |9 I  U, I: j
    }1 w& j4 B. P9 Y3 L+ q
   
, j+ Y6 s1 h) H/ H8 Q    STDMETHOD(EnumFormatEtc)(DWORD  dwDirection , IEnumFORMATETC**  ppenumFormatEtc ) : `" O6 k7 r; w% ^
    {
7 R" ~3 @" i& K5 `0 T        return E_NOTIMPL;7 b  X, L& y# T& y% n# Z
    }) X. ]) n5 k# v8 y- j
   
5 P8 ]( f$ p% n    STDMETHOD(DAdvise)(FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink,
4 j$ @* l7 ^, }, }1 M        DWORD *pdwConnection)
8 M0 C5 U+ O$ i% O    {
$ w+ U8 ~& h+ a* R; M        return E_NOTIMPL;
) x( W1 ~- {$ m7 P    }5 h/ q1 }7 q5 K8 C2 ~6 ^4 E
    . T' H% Z: ~: a) {0 |
    STDMETHOD(DUnadvise)(DWORD dwConnection)
  u+ C  c  C' G! a; F    {5 U; `! J/ B, E" L
        return E_NOTIMPL;$ z' h  c' z) c( y9 h& |! S
    }
" u0 _" J- A4 y  z    ) }& m: K7 [! m' j- p
    STDMETHOD(EnumDAdvise)(IEnumSTATDATA **ppenumAdvise) 9 s$ p/ y; e. Q3 w# T
    {  }3 C3 x8 @7 \
        return E_NOTIMPL;( @/ h3 L2 C5 i, S! W' S
    }
! p5 Q! I) j9 ?( h+ `5 \2 s    // Some Other helper functions
/ `! q/ ]# g  O7 ^' `  ~' W    //) K  f  d4 m0 Q9 |# [( x# A
    void SetBitmap(HBITMAP hBitmap);$ x2 a2 n' ?7 h# c7 u5 Z  d
    IOleObject *GetOleObject(IOleClientSite *pOleClientSite, IStorage *pStorage);
2 ~& Y6 j6 f. @" p* H* {, E8 F};% K- Z- R& C# K2 F- `: e* u
#endif // IMAGE_DATA_OBJECT__H
3 R9 ^1 m# S- k# s4 j/ C===========================
6 C2 y/ U; z4 Q7 r2 F: z/ ]ImageDataObject.cpp
0 G4 \4 R( d& q' [#include "stdafx.h"  //我很不喜欢这个头文件,这个程序只能在windows下运行,就留着吧. c: I. U* T) Y5 z! |1 [" _, Y
#include "ImageDataObject.h"+ x! j% [- T6 M; y* ^
#import "ImageOle.dll" raw_interfaces_only, raw_native_types, no_namespace, named_guids, auto_search
" M, U+ p+ u; P( U0 ?+ ustatic CLSID const gif_clsid = { 0x6ADA938, 0xFB0, 0x4BC0, { 0xB1, 0x9B, 0xA, 0x38, 0xAB, 0x17, 0xF1, 0x82 } };

$ A* k2 W4 x5 m7 N+ p: y* Z. T, Lvoid CImageDataObject::InsertBitmap(IRichEditOle* pRichEditOle, HBITMAP hBitmap,DWORD dwUser)
! A  M$ G) c( c8 b{. f: N! G4 I7 C& w7 y8 J6 L  ?
    SCODE sc;
: b! D+ O, A$ _6 E' c    // Get the image data object9 q; y6 j9 \7 ]5 W; s& Z
    //+ m% I; ^# ?- b0 m& K; ?
    CImageDataObject *pods = new CImageDataObject;9 v: e2 V3 c9 {+ A: |
    LPDATAOBJECT lpDataObject;
; U# G6 _$ r, S( m    pods->QueryInterface(IID_IDataObject, (void **)&lpDataObject);. r6 r( Q1 j7 t+ h! o) F
    pods->SetBitmap(hBitmap);
! B+ n2 B8 H, x+ u& h    // Get the RichEdit container site2 [4 [1 P& D  Z; G0 L. h9 E- m
    /// d, W3 O" Z4 {/ ^: f3 m7 C- H
    IOleClientSite *pOleClientSite;    2 Q1 [0 i  X  x) L
   
% M2 u& O3 I/ x( R: u    pRichEditOle->GetClientSite(&pOleClientSite);
& k8 N# i# Y9 H; c$ D5 ^    // Initialize a Storage Object8 L& f% [. X7 e7 {9 @
    /// ^( c/ l% Q0 V' ~
    IStorage *pStorage;   
2 J$ `& U* m& m2 _" H+ m' ]+ _+ W    LPLOCKBYTES lpLockBytes = NULL;
  i) X, F) l% {4 x8 k5 C2 J$ e. O    sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);) K$ J( q# @9 S8 C9 k& D  M! t
    7 F% |- t3 X1 A' `
    sc = ::StgCreateDocfileOnILockBytes(lpLockBytes,7 K  j% n% d- D: r4 r
        STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &pStorage);
4 `  H8 @$ ~2 h7 `" O# |7 o; M: a
    // The final ole object which will be inserted in the richedit control
* @+ o- h9 J; E$ ?0 G  ~% V    //6 J4 H, N  v+ v( t: T
    IOleObject *pOleObject;
& ^- n' w4 x+ A% B# q! V: v    pOleObject = pods->GetOleObject(pOleClientSite, pStorage);5 Y- j9 u+ \0 n% U9 f7 m6 h: |9 t( j
    // all items are "contained" -- this makes our reference to this object
; S! Z9 O# b, B. ^    //  weak -- which is needed for links to embedding silent update.7 c- Q6 i- ^& [: W; D0 q- {" Y+ T
    OleSetContainedObject(pOleObject, TRUE);
: Z* f& \4 s  ]& i% D$ l    // Now Add the object to the RichEdit
6 O$ M: K  v* g6 q8 Y    //
" `( L. I, n- P4 V$ b, Z    REOBJECT reobject;! O, r& l4 v. k* I' P
    ZeroMemory(&reobject, sizeof(REOBJECT));
, M9 J$ ~2 y7 M8 [/ E9 Q( T! B    reobject.cbStruct = sizeof(REOBJECT);7 L& J4 V% X5 I! j" A, x/ B
   
0 P6 m: j% q+ x/ S/ C! D$ i    CLSID clsid;
. `6 z& |8 g, N, G    sc = pOleObject->GetUserClassID(&clsid);
' T8 T! u1 P) u  G) P" d
& F5 q5 ?9 J, n3 A    reobject.clsid = clsid;  O  @4 R7 ^- F2 G# F, J; B" c4 p* T
    reobject.cp = REO_CP_SELECTION;
$ ^" k* A) Q/ n, L& G    reobject.dvaspect = DVASPECT_CONTENT;8 k3 V% ~9 M1 _/ W2 E
    reobject.poleobj = pOleObject;: |: h; Y  c# x4 V2 g8 L  ?
    reobject.polesite = pOleClientSite;
: S! P0 C. e' }- c9 Y) L6 b    reobject.pstg = pStorage;
. F8 Y2 @! m. \/ Ireobject.dwUser = dwUser;: Z1 M' S% ?' R6 _
    // Insert the bitmap at the current location in the richedit control
5 J8 O% d0 G( c7 @" \    //) S! q: t. q- X9 _
    pRichEditOle->InsertObject(&reobject);
- x5 R9 w, Z. E! |$ ?) R    // Release all unnecessary interfaces
  B2 u% w+ f/ |6 w    //  Q+ |* ]5 s7 F: q+ l
    pOleObject->Release();
+ x6 h7 G" [3 [: @) D% B; @; ]    pOleClientSite->Release();
# \- p2 ]6 E8 X2 f5 n    pStorage->Release();
- @  R# R+ \7 ^+ V4 O% t. ^    lpDataObject->Release();
4 |& \* w2 M9 I/ n$ D% m: [) @}( k4 M: |# |( y2 ^: ?7 u* q8 I
void CImageDataObject::InsertGif(IRichEditOle *lpRichEditOle,const char *gif_file,DWORD dwUser)
' e5 O0 \, a+ |8 t7 l{* N+ [- C- J/ H2 G2 ^
LPOLEOBJECT  lpObject=NULL;% l0 J% k" Q3 v. w6 n5 _
LPSTORAGE       lpStorage=NULL;
$ C3 J- G$ j' h. ELPOLECLIENTSITE lpClientSite=NULL;
/ i3 N9 ^4 H( M; _# QLPLOCKBYTES  lpLockBytes = NULL;
7 E" Z3 L7 q. j: [. c4 u1 ]1 H
HRESULT hr=S_OK;
& `  S6 [! q9 L! zCLSID clsid=CLSID_NULL;
5 W% _: j5 b) j/ V; Y1 K  @# gdo{3 f9 O) Y3 L" _6 y: R
  hr= ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);* S& C, X& v. R$ A
  if (hr != S_OK || lpLockBytes==NULL)
( N5 `0 v4 D0 t- Y& S4 u8 L0 R) |   break;

) B5 f$ C2 \1 M6 O4 T  V  hr= ::StgCreateDocfileOnILockBytes(lpLockBytes, STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &lpStorage);5 E& I9 i3 n% J& l( S/ C
  if (hr!= S_OK||lpStorage==NULL) 5 b2 A/ c4 T& {
   break;
& ~0 X$ C' }9 C% i
  hr=lpRichEditOle->GetClientSite(&lpClientSite);2 l1 m) n6 R5 K/ t# U( s. R
  if (hr!= S_OK||lpClientSite==NULL) $ k( M4 m0 Q( n# h4 A# @
   break;
7 l+ h3 B3 u3 ]( {& v, \- V
  try! M; f) `/ r+ L$ c/ R
  {
3 h6 p% o8 K6 P6 E, F   HRESULT hr;* w8 S( R6 V. m: e
   IGifAnimator *pGif  = NULL;
: I5 M" r5 X! U% T   hr = CoCreateInstance(gif_clsid,NULL,CLSCTX_INPROC_SERVER , IID_IGifAnimator,(void **)&pGif);
3 m' a6 L5 v% _: @. e! M1 k   if(FAILED(hr) || pGif == NULL)0 I0 a2 \6 Z0 U
    break ;

: u. V7 g( b4 l: R5 {4 n   _bstr_t bstrPath(gif_file);' z1 R- T6 W/ y$ ]5 a& Y
   pGif->LoadFromFile(bstrPath);& U$ [4 |: b0 l- q; k
   if(FAILED(hr))
: d/ [' j2 q5 {3 Q& k+ Q' E   {8 n. ^. G9 A# T1 @$ X" Q3 A
    pGif->Release();
7 n% q8 q8 O1 v- q( H    break ;
5 c2 I, G0 J( o+ t   }
- A; r7 z% a9 ~4 t" d9 c
   hr = pGif->QueryInterface(IID_IOleObject, (void**)&lpObject);$ ^" N7 b% O- R; h- n' l
   if( FAILED(hr)||lpObject==NULL) 2 \0 \) {- e! F4 V
   {; c6 W: O  H+ K( y
    pGif->Release();# U3 [+ k' W: r) Z9 ^: b, Z
    break ;5 J7 G0 Y; n7 p* g9 J. U4 f
   }
! D+ Q, \( ]! s" K. ^- z2 ]+ \  Z9 O   
( ]& _3 Y- |7 e1 f. o. D9 b   hr=OleSetContainedObject(lpObject, TRUE);
7 s3 \$ z) ]8 f9 w4 @$ w5 l0 J   if( FAILED(hr) )
1 I/ @2 ?3 L5 V9 {8 O- q8 t   {
9 A: g7 Y/ ]  o& v    pGif->Release();
1 X: v2 h2 ]# O% z% m    break ;
3 y+ U* A$ x: d. O$ R$ `   }: P. P7 P6 X& L# ^. W
   hr=lpObject->GetUserClassID(&clsid);4 r% j7 G+ q# L' }: p; J
   if( FAILED(hr) )
. a# }5 f3 w$ c6 Q2 ^* C   {
7 s$ G8 I0 y" |8 Z# S4 C    pGif->Release();; ^  E: L! Z+ c4 a
    break ;+ d' Y* ?7 v: C/ P" i
   }

" H8 U1 C1 p1 [: L9 |4 q9 [0 J   REOBJECT reobject;
- w7 k! I3 @% k# T$ K% j6 J* w   ZeroMemory(&reobject, sizeof(REOBJECT));8 @; s$ ^, ]) ?8 h
   reobject.cbStruct = sizeof(REOBJECT); + |6 A8 G$ |" p8 {" j# u
   reobject.clsid = clsid;
3 u! h( U: K" \   reobject.cp = REO_CP_SELECTION;
1 F; X; Y/ _& _' w0 o: e4 C: q   reobject.dvaspect = DVASPECT_CONTENT;
  n$ r( K; J- `, ^4 N   reobject.dwFlags = REO_BELOWBASELINE;, V" _1 q( R/ i3 X
   reobject.dwUser = dwUser;
  s5 F5 Q- H- O7 L- d   reobject.poleobj = lpObject;# K# g4 X" d: H( K+ S2 w' L. s
   reobject.polesite = lpClientSite;
5 ^# O2 H1 b; z, V7 F8 J   reobject.pstg = lpStorage;
$ m2 R9 P3 O+ u- K* k   SIZEL sizel={0,0};. [- N, n* Y3 Z$ u$ u- h! p, q! s
   reobject.sizel = sizel;
) ]2 f! m9 z. J- M6 d   hr=lpRichEditOle->InsertObject(&reobject);
7 z! S$ P0 ^) m' Z2 _  }, A% E+ R" h* V. B  @3 p" I- `0 y3 R
  catch( _com_error &e )& a9 F# D- p8 r: C: p& d
  {
1 I9 F/ f  X- W8 P! J5 C( @  }
. {2 Z) F- n# {' m2 S; K
}while(FALSE);/ p- I/ h+ G, Y
if(lpLockBytes) lpObject->Release();
7 s4 U5 h4 u( l1 D! yif(lpLockBytes) lpLockBytes->Release();
. J; Z+ F  m% u) x) `if(lpClientSite) lpClientSite->Release();: ~8 p0 F! |, E: C( _& x( @9 [
if(lpRichEditOle) lpRichEditOle->Release();. w( x. v- l) _* @. o' j
}
1 O  [) C: i: G; x8 _4 U* Q
3 Y; J5 Z8 b- ~* k: ], L
//////////////////////////////////////////////////////////////////////
4 g0 h, t! V! o  K9 q& {// Construction/Destruction
8 A, A5 o9 J$ g4 F# f- N% @; x& J7 Z/////////////////////////////////////////////////////////////////////// H. T8 n8 T0 b5 ^! N2 U  l7 N) D
void CImageDataObject::SetBitmap(HBITMAP hBitmap)$ l: G" B+ O" r4 P+ Q7 t
{
3 ?& y! s7 x: P; w# p$ h; i( [& r& S5 w. p5 l
    STGMEDIUM stgm;: F2 u) q6 f% R  ?7 s
    stgm.tymed = TYMED_GDI;                    // Storage medium = HBITMAP handle        
" \8 h4 y3 W/ j% a6 A    stgm.hBitmap = hBitmap;+ t: q5 w- E1 [8 V0 J+ v5 I
    stgm.pUnkForRelease = NULL;                // Use ReleaseStgMedium
. f0 Z' V' {3 a, b    FORMATETC fm;
% Q6 |" ^* z# L% w( b: b    fm.cfFormat = CF_BITMAP;                // Clipboard format = CF_BITMAP
5 p% }1 |+ Z3 _3 F$ t' {    fm.ptd = NULL;                            // Target Device = Screen
0 U, Z# b% j- w+ X1 f6 n2 q8 w    fm.dwAspect = DVASPECT_CONTENT;            // Level of detail = Full content
$ S5 A6 r, ^7 X& ~0 q2 {* w) h    fm.lindex = -1;                            // Index = Not applicaple
1 Z/ T  ]! y( T" P    fm.tymed = TYMED_GDI;                    // Storage medium = HBITMAP handle3 B7 J) U3 a, x# Y
    this->SetData(&fm, &stgm, TRUE);        
' p) @, S- e  J" r4 u}, _2 _" a; a1 y( Z/ F8 s
IOleObject *CImageDataObject::GetOleObject(IOleClientSite *pOleClientSite, IStorage *pStorage)7 V  T  U/ m/ O+ o: x0 D, R2 _
{7 D0 y" j4 M3 g8 r0 S. [' A

7 i( v5 _* j) m' g' }    SCODE sc;
0 A7 [) G, f9 m9 F    IOleObject *pOleObject;) w# F; o( ]) N% Z
    sc = ::OleCreateStaticFromData(this, IID_IOleObject, OLERENDER_FORMAT,
6 [, O0 {. T# s) _            &m_fromat, pOleClientSite, pStorage, (void **)&pOleObject);
9 p$ _+ L7 u/ a% a" C    return pOleObject;
* k! p/ _6 z4 j: h; ]7 M}
9 a  s! v6 u) o: P4 k! C/////////////: F3 k4 z) K# X1 f1 K
  OK,下面是想RichEdit中插入bitmap的范例
: T( a1 j! I% H7 }( \6 t- l  CImageDataObject::InsertBitmap(m_sendRichEdit.GetOleInterface(),bmp.m_hBitmap,dwBitmapInfo); 7 j( h# J- }5 T, i5 c
  上面是m_sendRichEdit是一个RichEdit控件(这段代码是从一个WTL项目中提取出来的)。& W0 s! Z, a$ M  |( P
  注意:上面的dwBitmapInfo就是应用程序设置的与插入RichEdit中的Bitmap相关的信息。. ~' a* }. S0 ]' }; x
  2. 从EditRich中提取位图信息
7 w: N. b; X" z4 Z7 E' X     下面是范例代码,其中原来就不多说了,看代码吧。' `' `) f- p* Y0 ]4 f  c
    //获取RichEdit中有几个bitmap,这里假设RichEdit中有位图文件
3 ^7 F" A8 ^' y5 _) c0 T    int c = m_sendRichEdit.GetOleInterface()->GetObjectCount();     : {) ]8 A, L  r$ e5 E8 {3 e0 X
   for(int i = 0 ; i < c ; i++) //遍历位图
- ^1 |: r2 z. {7 m   {
, b& Z  C" B. p: B# p  n- ~       REOBJECT object;  //位图信息存在这里
% @+ {3 d6 `% j     memset(&object,0,sizeof(REOBJECT));
, ~  s+ v" }: u( J     object.cbStruct = sizeof(REOBJECT);
: ~" ]* B0 X) d' U. H; h# h; S$ S     m_sendRichEdit.GetOleInterface()->GetObject(i,&object,REO_GETOBJ_ALL_INTERFACES);
& c: _% B. ^+ T7 Z! p) H, s     int pos = object.cp ; //位图的位置信息$ T( I0 r! f6 V0 n0 o9 w! H
     DWORD dwUSer  =object.dwUSer ; //位图的信息,之前应用程序设置的,应有程序当然知道什么意思了
5 r" q5 p  w* M1 P6 x  X5 h0 O2 ~  }
( ]& }& t# s9 H) _7 ?/////////////////////////////////////////////////////( g* J! Y8 O) f, `" l4 B4 u8 R
OVER7 P% O- a" o* j6 X
////////////////////////////////////////////////////$ i2 i8 g  j  r

4 N8 c) A: f5 N) W( u6 R" v$ p0 a! p$ V) T
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=391030
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 10:09 , Processed in 0.018261 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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