diff options
Diffstat (limited to 'Src/Plugins/General/gen_ml/skinnedmenu.cpp')
-rw-r--r-- | Src/Plugins/General/gen_ml/skinnedmenu.cpp | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/Src/Plugins/General/gen_ml/skinnedmenu.cpp b/Src/Plugins/General/gen_ml/skinnedmenu.cpp new file mode 100644 index 00000000..f583dd49 --- /dev/null +++ b/Src/Plugins/General/gen_ml/skinnedmenu.cpp @@ -0,0 +1,81 @@ +#include "main.h" +#include "./skinnedmenu.h" +#include "./skinnedmenuwnd.h" + + +SkinnedMenu::SkinnedMenu() +{ + hwndOwner = NULL; + skinStyle = SMS_NORMAL; + hmlil = NULL; + width = 0; + + if (FAILED(SkinnedMenuThreadInfo::GetInstance(TRUE, &threadInfo))) + threadInfo = NULL; +} + +SkinnedMenu::~SkinnedMenu(void) +{ + if (NULL != threadInfo) + { + threadInfo->RemoveAttachHook(this); + threadInfo->Release(); + } +} + +HWND SkinnedMenu::WindowFromHandle(HMENU menu) +{ + HWND hwnd; + SkinnedMenuThreadInfo *threadInfo; + + if (S_OK != SkinnedMenuThreadInfo::GetInstance(FALSE, &threadInfo)) + return NULL; + + hwnd = threadInfo->FindMenuWindow(menu); + + threadInfo->Release(); + + return hwnd; +} + +BOOL SkinnedMenu::InitializeHook(HWND hwndOwner, UINT skinStyle, HMLIMGLST hmlil, INT width, MENUCUSTOMIZEPROC _customProc, ULONG_PTR customParam) +{ + if (NULL == threadInfo) + return FALSE; + + if (FALSE != threadInfo->IsAttachHookActive()) + return FALSE; + + this->hwndOwner = hwndOwner; + this->hmlil = hmlil; + this->width = width; + this->skinStyle = skinStyle; + this->customProc = _customProc; + this->customParam = customParam; + + return threadInfo->SetAttachHook(this); +} + +BOOL SkinnedMenu::TrackMenuPopupEx(HMENU hmenu, UINT fuFlags, INT x, INT y, HWND hwnd, LPTPMPARAMS lptpm, UINT skinStyle, + HMLIMGLST hmlil, INT width, MENUCUSTOMIZEPROC customProc, ULONG_PTR customParam) +{ + if (NULL == hwnd || + !InitializeHook(hwnd, skinStyle, hmlil, width, customProc, customParam)) + { + return FALSE; + } + + return TrackPopupMenuEx(hmenu, fuFlags, x, y, hwnd, lptpm); +} + +BOOL SkinnedMenu::AttachToHwnd(HWND hwndMenu) +{ + SkinnedMenuWnd *psw = new SkinnedMenuWnd(skinStyle, hmlil, width, customProc, customParam); + if (!psw || !psw->Attach(hwndMenu, hwndOwner)) + { + delete(psw); + return FALSE; + } + + return TRUE; +} |