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

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. #include "stdafx.h"
  14. #include <RichOle.h>
  15. #include "ImageDataObject.h"
  16. #ifdef _DEBUG
  17. #undef THIS_FILE
  18. static char THIS_FILE[]=__FILE__;
  19. #define new DEBUG_NEW
  20. #endif
  21. //////////////////////////////////////////////////////////////////////
  22. // Static member functions
  23. //////////////////////////////////////////////////////////////////////
  24. void CImageDataObject::InsertBitmap(IRichEditOle* pRichEditOle, HBITMAP hBitmap)
  25. {
  26. SCODE sc;
  27. // Get the image data object
  28. //
  29. CImageDataObject *pods = new CImageDataObject;
  30. LPDATAOBJECT lpDataObject;
  31. pods->QueryInterface(IID_IDataObject, (void **)&lpDataObject);
  32. pods->SetBitmap(hBitmap);
  33. // Get the RichEdit container site
  34. //
  35. IOleClientSite *pOleClientSite = NULL;
  36. pRichEditOle->GetClientSite(&pOleClientSite);
  37. // Initialize a Storage Object
  38. //
  39. IStorage *pStorage;
  40. LPLOCKBYTES lpLockBytes = NULL;
  41. sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);
  42. if (sc != S_OK)
  43. AfxThrowOleException(sc);
  44. ASSERT(lpLockBytes != NULL);
  45. sc = ::StgCreateDocfileOnILockBytes(lpLockBytes,
  46. STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &pStorage);
  47. if (sc != S_OK)
  48. {
  49. VERIFY(lpLockBytes->Release() == 0);
  50. lpLockBytes = NULL;
  51. AfxThrowOleException(sc);
  52. }
  53. ASSERT(pStorage != NULL);
  54. // The final ole object which will be inserted in the richedit control
  55. //
  56. IOleObject *pOleObject; 
  57. pOleObject = pods->GetOleObject(pOleClientSite, pStorage);
  58. // all items are "contained" -- this makes our reference to this object
  59. //  weak -- which is needed for links to embedding silent update.
  60. OleSetContainedObject(pOleObject, TRUE);
  61. // Now Add the object to the RichEdit 
  62. //
  63. REOBJECT reobject;
  64. ZeroMemory(&reobject, sizeof(REOBJECT));
  65. reobject.cbStruct = sizeof(REOBJECT);
  66. CLSID clsid;
  67. sc = pOleObject->GetUserClassID(&clsid);
  68. if (sc != S_OK)
  69. AfxThrowOleException(sc);
  70. reobject.clsid = clsid;
  71. reobject.cp = REO_CP_SELECTION;
  72. reobject.dvaspect = DVASPECT_CONTENT;
  73. reobject.poleobj = pOleObject;
  74. reobject.polesite = pOleClientSite;
  75. reobject.pstg = pStorage;
  76. // Insert the bitmap at the current location in the richedit control
  77. //
  78. pRichEditOle->InsertObject(&reobject);
  79. // Release all unnecessary interfaces
  80. //
  81. pOleObject->Release();
  82. pOleClientSite->Release();
  83. pStorage->Release();
  84. lpDataObject->Release();
  85. }
  86. //////////////////////////////////////////////////////////////////////
  87. // Construction/Destruction
  88. //////////////////////////////////////////////////////////////////////
  89. void CImageDataObject::SetBitmap(HBITMAP hBitmap)
  90. {
  91. ASSERT(hBitmap);
  92. STGMEDIUM stgm;
  93. stgm.tymed = TYMED_GDI; // Storage medium = HBITMAP handle
  94. stgm.hBitmap = hBitmap;
  95. stgm.pUnkForRelease = NULL; // Use ReleaseStgMedium
  96. FORMATETC fm;
  97. fm.cfFormat = CF_BITMAP; // Clipboard format = CF_BITMAP
  98. fm.ptd = NULL; // Target Device = Screen
  99. fm.dwAspect = DVASPECT_CONTENT; // Level of detail = Full content
  100. fm.lindex = -1; // Index = Not applicaple
  101. fm.tymed = TYMED_GDI; // Storage medium = HBITMAP handle
  102. this->SetData(&fm, &stgm, TRUE);
  103. }
  104. IOleObject *CImageDataObject::GetOleObject(IOleClientSite *pOleClientSite, IStorage *pStorage)
  105. {
  106. ASSERT(m_stgmed.hBitmap);
  107. SCODE sc;
  108. IOleObject *pOleObject;
  109. sc = ::OleCreateStaticFromData(this, IID_IOleObject, OLERENDER_FORMAT, 
  110. &m_fromat, pOleClientSite, pStorage, (void **)&pOleObject);
  111. if (sc != S_OK)
  112. AfxThrowOleException(sc);
  113. return pOleObject;
  114. }