ImageDataObject.h
上传用户:weimei12
上传日期:2022-08-11
资源大小:185k
文件大小:3k
源码类别:

Email客户端

开发平台:

Visual C++

  1. // ImageDataObject.h: Impementation for IDataObject Interface to be used 
  2. //      in inserting bitmap to the RichEdit Control.
  3. //
  4. // Author : Hani Atassi  (atassi@arabteam2000.com)
  5. //
  6. // How to use : Just call the static member InsertBitmap with 
  7. // the appropriate parrameters. 
  8. //
  9. // Known bugs :
  10. //
  11. //
  12. //////////////////////////////////////////////////////////////////////
  13. #if !defined(AFX_IMAGEDATAOBJECT_H__7E162227_62B8_49E3_A35B_FEC3F241A78F__INCLUDED_)
  14. #define AFX_IMAGEDATAOBJECT_H__7E162227_62B8_49E3_A35B_FEC3F241A78F__INCLUDED_
  15. #if _MSC_VER > 1000
  16. #pragma once
  17. #endif // _MSC_VER > 1000
  18. class CImageDataObject : IDataObject
  19. {
  20. public:
  21. // This static fumction accepts those parameters:
  22. // IRichEditOle* : a pointer to IRochEditOle interface for the RichEdit Control
  23. // HBITMAP : the bitmap handle.
  24. //
  25. // After calling the function, it inserts the image in the current 
  26. //    position of the RichEdit
  27. //
  28. static void InsertBitmap(IRichEditOle* pRichEditOle, HBITMAP hBitmap);
  29. private:
  30. ULONG m_ulRefCnt;
  31. BOOL m_bRelease;
  32. // The data being bassed to the richedit
  33. //
  34. STGMEDIUM m_stgmed;
  35. FORMATETC m_fromat;
  36. public:
  37. CImageDataObject() : m_ulRefCnt(0)
  38. {
  39. m_bRelease = FALSE;
  40. }
  41. ~CImageDataObject()
  42. {
  43. if (m_bRelease)
  44. ::ReleaseStgMedium(&m_stgmed);
  45. }
  46. // Methods of the IUnknown interface
  47. // 
  48. STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject)
  49. {
  50. if (iid == IID_IUnknown || iid == IID_IDataObject)
  51. {
  52. *ppvObject = this;
  53. AddRef();
  54. return S_OK;
  55. }
  56. else
  57. return E_NOINTERFACE;
  58. }
  59. STDMETHOD_(ULONG, AddRef)(void)
  60. {
  61. m_ulRefCnt++;
  62. return m_ulRefCnt;
  63. }
  64. STDMETHOD_(ULONG, Release)(void)
  65. {
  66. if (--m_ulRefCnt == 0)
  67. {
  68. delete this;
  69. }
  70. return m_ulRefCnt;
  71. }
  72. // Methods of the IDataObject Interface
  73. //
  74. STDMETHOD(GetData)(FORMATETC *pformatetcIn, STGMEDIUM *pmedium) {
  75. HANDLE hDst;
  76. hDst = ::OleDuplicateData(m_stgmed.hBitmap, CF_BITMAP, NULL);
  77. if (hDst == NULL)
  78. {
  79. return E_HANDLE;
  80. }
  81. pmedium->tymed = TYMED_GDI;
  82. pmedium->hBitmap = (HBITMAP)hDst;
  83. pmedium->pUnkForRelease = NULL;
  84. return S_OK;
  85. }
  86. STDMETHOD(GetDataHere)(FORMATETC* pformatetc, STGMEDIUM*  pmedium ) {
  87. return E_NOTIMPL;
  88. }
  89. STDMETHOD(QueryGetData)(FORMATETC*  pformatetc ) {
  90. return E_NOTIMPL;
  91. }
  92. STDMETHOD(GetCanonicalFormatEtc)(FORMATETC*  pformatectIn ,FORMATETC* pformatetcOut )  {
  93. return E_NOTIMPL;
  94. }
  95. STDMETHOD(SetData)(FORMATETC* pformatetc , STGMEDIUM*  pmedium , BOOL  fRelease ) {
  96. m_fromat = *pformatetc;
  97. m_stgmed = *pmedium;
  98. return S_OK;
  99. }
  100. STDMETHOD(EnumFormatEtc)(DWORD  dwDirection , IEnumFORMATETC**  ppenumFormatEtc ) {
  101. return E_NOTIMPL;
  102. }
  103. STDMETHOD(DAdvise)(FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink,
  104. DWORD *pdwConnection) {
  105. return E_NOTIMPL;
  106. }
  107. STDMETHOD(DUnadvise)(DWORD dwConnection) {
  108. return E_NOTIMPL;
  109. }
  110. STDMETHOD(EnumDAdvise)(IEnumSTATDATA **ppenumAdvise) {
  111. return E_NOTIMPL;
  112. }
  113. // Some Other helper functions
  114. //
  115. void SetBitmap(HBITMAP hBitmap);
  116. IOleObject *GetOleObject(IOleClientSite *pOleClientSite, IStorage *pStorage);
  117. };
  118. #endif // !defined(AFX_IMAGEDATAOBJECT_H__7E162227_62B8_49E3_A35B_FEC3F241A78F__INCLUDED_)