// // lbmenu.cpp // #include "private.h" #include "lbmenu.h" #include "xstring.h" #include "helpers.h" ////////////////////////////////////////////////////////////////////////////// // // CCicLibMenuItem // ////////////////////////////////////////////////////////////////////////////// //+--------------------------------------------------------------------------- // // dtor // //---------------------------------------------------------------------------- CCicLibMenuItem::~CCicLibMenuItem() { if (_pSubMenu) _pSubMenu->Release(); if (_hbmp) { DeleteObject(_hbmp); _hbmp = NULL; } if (_hbmpMask) { DeleteObject(_hbmpMask); _hbmpMask = NULL; } SysFreeString(_bstr); } //+--------------------------------------------------------------------------- // // Init // //---------------------------------------------------------------------------- BOOL CCicLibMenuItem::Init(UINT uId, DWORD dwFlags, HBITMAP hbmp, HBITMAP hbmpMask, const WCHAR *pch, ULONG cch, CCicLibMenu *pSubMenu) { _uId = uId; _dwFlags = dwFlags; _bstr = SysAllocStringLen(pch, cch); if (!_bstr && cch) return FALSE; _pSubMenu = pSubMenu; _hbmp = CreateBitmap(hbmp); _hbmpMask = CreateBitmap(hbmpMask); if (hbmp) DeleteObject(hbmp); if (hbmpMask) DeleteObject(hbmpMask); return TRUE; } //+--------------------------------------------------------------------------- // // CreateBitmap // //---------------------------------------------------------------------------- HBITMAP CCicLibMenuItem::CreateBitmap(HBITMAP hbmp) { if (!hbmp) return NULL; HDC hdcTmp = CreateDC("DISPLAY", NULL, NULL, NULL); if (!hdcTmp) return NULL; HBITMAP hbmpOut = NULL; BITMAP bmp; GetObject(hbmp, sizeof(bmp), &bmp); HBITMAP hbmpOldSrc = NULL; HDC hdcSrc = CreateCompatibleDC(hdcTmp); if (hdcSrc) { hbmpOldSrc = (HBITMAP)SelectObject(hdcSrc, hbmp); } HBITMAP hbmpOldDst = NULL; HDC hdcDst = CreateCompatibleDC(hdcTmp); if (hdcDst) { hbmpOut = CreateCompatibleBitmap(hdcTmp , bmp.bmWidth, bmp.bmHeight); hbmpOldDst = (HBITMAP)SelectObject(hdcDst, hbmpOut); } BitBlt(hdcDst, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcSrc, 0, 0, SRCCOPY); if (hbmpOldSrc) SelectObject(hdcSrc, hbmpOldSrc); if (hbmpOldDst) SelectObject(hdcDst, hbmpOldDst); DeleteDC(hdcTmp); if (hdcSrc) DeleteDC(hdcSrc); if (hdcDst) DeleteDC(hdcDst); return hbmpOut; } ////////////////////////////////////////////////////////////////////////////// // // CCicLibMenu // ////////////////////////////////////////////////////////////////////////////// //+--------------------------------------------------------------------------- // // IUnknown // //---------------------------------------------------------------------------- STDAPI CCicLibMenu::QueryInterface(REFIID riid, void **ppvObj) { *ppvObj = NULL; if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_ITfMenu)) { *ppvObj = SAFECAST(this, ITfMenu *); } if (*ppvObj) { AddRef(); return S_OK; } return E_NOINTERFACE; } STDAPI_(ULONG) CCicLibMenu::AddRef() { return ++_cRef; } STDAPI_(ULONG) CCicLibMenu::Release() { long cr; cr = --_cRef; Assert(cr >= 0); if (cr == 0) { delete this; } return cr; } //+--------------------------------------------------------------------------- // // ctor // //---------------------------------------------------------------------------- CCicLibMenu::CCicLibMenu() { _cRef = 1; } //+--------------------------------------------------------------------------- // // dtor // //---------------------------------------------------------------------------- CCicLibMenu::~CCicLibMenu() { int i; for (i = 0; i < _rgItem.Count(); i++) { CCicLibMenuItem *pItem = _rgItem.Get(i); delete pItem; } } //+--------------------------------------------------------------------------- // // AddMenuItem // //---------------------------------------------------------------------------- STDAPI CCicLibMenu::AddMenuItem(UINT uId, DWORD dwFlags, HBITMAP hbmp, HBITMAP hbmpMask, const WCHAR *pch, ULONG cch, ITfMenu **ppMenu) { CCicLibMenuItem *pMenuItem; CCicLibMenu *pSubMenu = NULL; if (ppMenu) *ppMenu = NULL; if (dwFlags & TF_LBMENUF_SUBMENU) { if (!ppMenu) return E_INVALIDARG; pSubMenu = CreateSubMenu(); } pMenuItem = CreateMenuItem(); if (!pMenuItem) return E_OUTOFMEMORY; if (!pMenuItem->Init(uId, dwFlags, hbmp, hbmpMask, pch, cch, pSubMenu)) return E_FAIL; if (ppMenu && pSubMenu) { *ppMenu = pSubMenu; (*ppMenu)->AddRef(); } CCicLibMenuItem **ppItem = _rgItem.Append(1); *ppItem = pMenuItem; return S_OK; }