为ATL 或者BaseCtl 写的CPictureHolder

 导读:
  写 ActiveX 控件有时会实现一些 Picture 类型的属性,或者在方法中传递 Picture 类型的参数。在 MFC 里,有一个名为 CPictureHolder 的类可以很方便的帮助程序员做这些工作,但是如果你使用 ATL 或者 BaseCtl 框架开发,则需要自己动手。故把 MFC 里的?CPictureHolder 类抽了出来,使之没有对 MFC 的依赖,以供来者用之。文件名为 picholder.h。
  1.   #ifndef __PICHOLDER_H__ 
  2. #define __PICHOLDER_H__ 
  3. /* 
  4. Demo code: 
  5. 1. IDL code 
  6. [id(1)] HRESULT GetPicture([out, retval] LPPICTUREDISP *pVal); 
  7. [id(2)] HRESULT SetPicture([in] LPPICTUREDISP newVal); 
  8. 2. C++ code 
  9. CPictureHolder m_pic; 
  10. STDMETHOD(GetPicture)(LPPICTUREDISP *pVal) 
  11. LPPICTUREDISP pPic = m_pic.GetPictureDispatch(); 
  12. if(pPic != NULL) 
  13. *pVal = pPic; 
  14. return pPic ? S_OK : E_FAIL; 
  15. STDMETHOD(SetPicture)(LPPICTUREDISP newVal) 
  16. m_pic.SetPictureDispatch(newVal); 
  17. return S_OK; 
  18. Note: 
  19. When you compile an .idl file with IFontDisp or IPictureDisp as parameters 
  20. of methods in Visual C++ 5.0 or Visual C++ 6.0, you get a MIDL2039 warning. 
  21. This is due to a bug in Ocidl.idl source. You must add the dual attribute 
  22. to the interface declarations for IFontDisp and IPictureDisp. 
  23. Microsoft has confirmed this to be a bug. 
  24. This problem was corrected in Microsoft Visual C++ .NET. 
  25. // */ 
  26. #ifndef ASSERT 
  27. #ifdef ATLASSERT 
  28. #define ASSERT ATLASSERT 
  29. #else 
  30. #define ASSERT sizeof 
  31. #endif // ATLASSERT 
  32. #endif // ASSERT 
  33. __inline 
  34. DWORD _Release(LPUNKNOWN* lplpUnknown) 
  35. ASSERT(lplpUnknown != NULL); 
  36. if(*lplpUnknown != NULL) 
  37. DWORD dwRef = (*lplpUnknown)->Release(); 
  38. *lplpUnknown = NULL; 
  39. return dwRef; 
  40. return 0; 
  41. #define RELEASE(lpUnk) _Release((LPUNKNOWN*)&lpUnk) 
  42. class CPictureHolder 
  43. public
  44. LPPICTURE m_pPict; 
  45. public
  46. CPictureHolder() : m_pPict(NULL) 
  47. ~CPictureHolder() 
  48. RELEASE(m_pPict); 
  49. BOOL CreateEmpty() 
  50. RELEASE(m_pPict); 
  51. PICTDESC pdesc; 
  52. pdesc.cbSizeofstruct = sizeof(pdesc); 
  53. pdesc.picType = PICTYPE_NONE; 
  54. return SUCCEEDED(::OleCreatePictureIndirect(&pdesc, IID_IPicture, FALSE, (LPVOID*)&m_pPict)); 
  55. BOOL CreateFromBitmap(HBITMAP hbm, HPALETTE hpal = NULL, BOOL bTransferOwnership = FALSE) 
  56. RELEASE(m_pPict); 
  57. PICTDESC pdesc; 
  58. pdesc.cbSizeofstruct = sizeof(pdesc); 
  59. pdesc.picType = PICTYPE_BITMAP; 
  60. pdesc.bmp.hbitmap = hbm; 
  61. pdesc.bmp.hpal = hpal; 
  62. return SUCCEEDED(::OleCreatePictureIndirect(&pdesc, IID_IPicture, bTransferOwnership, (LPVOID*)&m_pPict)); 
  63. BOOL CreateFromMetafile(HMETAFILE hmf, int xExt, int yExt, BOOL bTransferOwnership = FALSE) 
  64. RELEASE(m_pPict); 
  65. PICTDESC pdesc; 
  66. pdesc.cbSizeofstruct = sizeof(pdesc); 
  67. pdesc.picType = PICTYPE_METAFILE; 
  68. pdesc.wmf.hmeta = hmf; 
  69. pdesc.wmf.xExt = xExt; 
  70. pdesc.wmf.yExt = yExt; 
  71. return SUCCEEDED(::OleCreatePictureIndirect(&pdesc, IID_IPicture, bTransferOwnership, (LPVOID*)&m_pPict)); 
  72. BOOL CreateFromIcon(HICON hIcon, BOOL bTransferOwnership = FALSE) 
  73. RELEASE(m_pPict); 
  74. PICTDESC pdesc; 
  75. pdesc.cbSizeofstruct = sizeof(pdesc); 
  76. pdesc.picType = PICTYPE_ICON; 
  77. pdesc.icon.hicon = hIcon; 
  78. return SUCCEEDED(::OleCreatePictureIndirect(&pdesc, IID_IPicture, bTransferOwnership, (LPVOID*)&m_pPict)); 
  79. LPPICTUREDISP GetPictureDispatch() 
  80. LPPICTUREDISP pPictDisp = NULL; 
  81. if((m_pPict != NULL) &&SUCCEEDED(m_pPict->QueryInterface(IID_IPictureDisp, (LPVOID*)&pPictDisp))) 
  82. ASSERT(pPictDisp != NULL); 
  83. return pPictDisp; 
  84. void SetPictureDispatch(LPPICTUREDISP pDisp) 
  85. LPPICTURE pPict = NULL; 
  86. if(m_pPict != NULL) 
  87. m_pPict->Release(); 
  88. if((pDisp != NULL) &&SUCCEEDED(pDisp->QueryInterface(IID_IPicture, (LPVOID*)&pPict))) 
  89. ASSERT(pPict != NULL); 
  90. m_pPict = pPict; 
  91. else 
  92. m_pPict = NULL; 
  93. void Render(HDC hdc, const RECT& rcRender, const RECT& rcWBounds) 
  94. if(m_pPict != NULL) 
  95. long hmWidth; 
  96. long hmHeight; 
  97. m_pPict->get_Width(&hmWidth); 
  98. m_pPict->get_Height(&hmHeight); 
  99. m_pPict->Render(hdc, rcRender.left, rcRender.top, 
  100. rcRender.right - rcRender.left, rcRender.bottom - rcRender.top, 0, hmHeight-1, 
  101. hmWidth, -hmHeight, &rcWBounds); 
  102. short GetType() 
  103. short sPicType = (short)PICTYPE_UNINITIALIZED; 
  104. if(m_pPict != NULL) 
  105. m_pPict->get_Type(&sPicType); 
  106. return sPicType; 
  107. }; 
  108. #endif // __PICHOLDER_H__ 

 

 

本文转自
http://sluttery.spaces.live.com/blog/cns!3569FEA80C717FD4!173.entry

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值