Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

242 lines
5.1 KiB

  1. //
  2. // lbmenu.cpp
  3. //
  4. #include "private.h"
  5. #include "lbmenu.h"
  6. #include "xstring.h"
  7. #include "helpers.h"
  8. //////////////////////////////////////////////////////////////////////////////
  9. //
  10. // CCicLibMenuItem
  11. //
  12. //////////////////////////////////////////////////////////////////////////////
  13. //+---------------------------------------------------------------------------
  14. //
  15. // dtor
  16. //
  17. //----------------------------------------------------------------------------
  18. CCicLibMenuItem::~CCicLibMenuItem()
  19. {
  20. if (_pSubMenu)
  21. _pSubMenu->Release();
  22. if (_hbmp)
  23. {
  24. DeleteObject(_hbmp);
  25. _hbmp = NULL;
  26. }
  27. if (_hbmpMask)
  28. {
  29. DeleteObject(_hbmpMask);
  30. _hbmpMask = NULL;
  31. }
  32. SysFreeString(_bstr);
  33. }
  34. //+---------------------------------------------------------------------------
  35. //
  36. // Init
  37. //
  38. //----------------------------------------------------------------------------
  39. BOOL CCicLibMenuItem::Init(UINT uId, DWORD dwFlags, HBITMAP hbmp, HBITMAP hbmpMask, const WCHAR *pch, ULONG cch, CCicLibMenu *pSubMenu)
  40. {
  41. _uId = uId;
  42. _dwFlags = dwFlags;
  43. _bstr = SysAllocStringLen(pch, cch);
  44. if (!_bstr && cch)
  45. return FALSE;
  46. _pSubMenu = pSubMenu;
  47. _hbmp = CreateBitmap(hbmp);
  48. _hbmpMask = CreateBitmap(hbmpMask);
  49. if (hbmp)
  50. DeleteObject(hbmp);
  51. if (hbmpMask)
  52. DeleteObject(hbmpMask);
  53. return TRUE;
  54. }
  55. //+---------------------------------------------------------------------------
  56. //
  57. // CreateBitmap
  58. //
  59. //----------------------------------------------------------------------------
  60. HBITMAP CCicLibMenuItem::CreateBitmap(HBITMAP hbmp)
  61. {
  62. if (!hbmp)
  63. return NULL;
  64. HDC hdcTmp = CreateDC("DISPLAY", NULL, NULL, NULL);
  65. if (!hdcTmp)
  66. return NULL;
  67. HBITMAP hbmpOut = NULL;
  68. BITMAP bmp;
  69. GetObject(hbmp, sizeof(bmp), &bmp);
  70. HBITMAP hbmpOldSrc = NULL;
  71. HDC hdcSrc = CreateCompatibleDC(hdcTmp);
  72. if (hdcSrc)
  73. {
  74. hbmpOldSrc = (HBITMAP)SelectObject(hdcSrc, hbmp);
  75. }
  76. HBITMAP hbmpOldDst = NULL;
  77. HDC hdcDst = CreateCompatibleDC(hdcTmp);
  78. if (hdcDst)
  79. {
  80. hbmpOut = CreateCompatibleBitmap(hdcTmp , bmp.bmWidth, bmp.bmHeight);
  81. hbmpOldDst = (HBITMAP)SelectObject(hdcDst, hbmpOut);
  82. }
  83. BitBlt(hdcDst, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcSrc, 0, 0, SRCCOPY);
  84. if (hbmpOldSrc)
  85. SelectObject(hdcSrc, hbmpOldSrc);
  86. if (hbmpOldDst)
  87. SelectObject(hdcDst, hbmpOldDst);
  88. DeleteDC(hdcTmp);
  89. if (hdcSrc)
  90. DeleteDC(hdcSrc);
  91. if (hdcDst)
  92. DeleteDC(hdcDst);
  93. return hbmpOut;
  94. }
  95. //////////////////////////////////////////////////////////////////////////////
  96. //
  97. // CCicLibMenu
  98. //
  99. //////////////////////////////////////////////////////////////////////////////
  100. //+---------------------------------------------------------------------------
  101. //
  102. // IUnknown
  103. //
  104. //----------------------------------------------------------------------------
  105. STDAPI CCicLibMenu::QueryInterface(REFIID riid, void **ppvObj)
  106. {
  107. *ppvObj = NULL;
  108. if (IsEqualIID(riid, IID_IUnknown) ||
  109. IsEqualIID(riid, IID_ITfMenu))
  110. {
  111. *ppvObj = SAFECAST(this, ITfMenu *);
  112. }
  113. if (*ppvObj)
  114. {
  115. AddRef();
  116. return S_OK;
  117. }
  118. return E_NOINTERFACE;
  119. }
  120. STDAPI_(ULONG) CCicLibMenu::AddRef()
  121. {
  122. return ++_cRef;
  123. }
  124. STDAPI_(ULONG) CCicLibMenu::Release()
  125. {
  126. long cr;
  127. cr = --_cRef;
  128. Assert(cr >= 0);
  129. if (cr == 0)
  130. {
  131. delete this;
  132. }
  133. return cr;
  134. }
  135. //+---------------------------------------------------------------------------
  136. //
  137. // ctor
  138. //
  139. //----------------------------------------------------------------------------
  140. CCicLibMenu::CCicLibMenu()
  141. {
  142. _cRef = 1;
  143. }
  144. //+---------------------------------------------------------------------------
  145. //
  146. // dtor
  147. //
  148. //----------------------------------------------------------------------------
  149. CCicLibMenu::~CCicLibMenu()
  150. {
  151. int i;
  152. for (i = 0; i < _rgItem.Count(); i++)
  153. {
  154. CCicLibMenuItem *pItem = _rgItem.Get(i);
  155. delete pItem;
  156. }
  157. }
  158. //+---------------------------------------------------------------------------
  159. //
  160. // AddMenuItem
  161. //
  162. //----------------------------------------------------------------------------
  163. STDAPI CCicLibMenu::AddMenuItem(UINT uId, DWORD dwFlags, HBITMAP hbmp, HBITMAP hbmpMask, const WCHAR *pch, ULONG cch, ITfMenu **ppMenu)
  164. {
  165. CCicLibMenuItem *pMenuItem;
  166. CCicLibMenu *pSubMenu = NULL;
  167. if (ppMenu)
  168. *ppMenu = NULL;
  169. if (dwFlags & TF_LBMENUF_SUBMENU)
  170. {
  171. if (!ppMenu)
  172. return E_INVALIDARG;
  173. pSubMenu = CreateSubMenu();
  174. }
  175. pMenuItem = CreateMenuItem();
  176. if (!pMenuItem)
  177. return E_OUTOFMEMORY;
  178. if (!pMenuItem->Init(uId, dwFlags, hbmp, hbmpMask, pch, cch, pSubMenu))
  179. return E_FAIL;
  180. if (ppMenu && pSubMenu)
  181. {
  182. *ppMenu = pSubMenu;
  183. (*ppMenu)->AddRef();
  184. }
  185. CCicLibMenuItem **ppItem = _rgItem.Append(1);
  186. *ppItem = pMenuItem;
  187. return S_OK;
  188. }