1*f6dc9357SAndroid Build Coastguard Worker // Windows/Menu.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_WINDOWS_MENU_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_WINDOWS_MENU_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyWindows.h" 7*f6dc9357SAndroid Build Coastguard Worker #include "../Common/MyString.h" 8*f6dc9357SAndroid Build Coastguard Worker 9*f6dc9357SAndroid Build Coastguard Worker #include "Defs.h" 10*f6dc9357SAndroid Build Coastguard Worker 11*f6dc9357SAndroid Build Coastguard Worker namespace NWindows { 12*f6dc9357SAndroid Build Coastguard Worker 13*f6dc9357SAndroid Build Coastguard Worker #ifndef MIIM_STRING 14*f6dc9357SAndroid Build Coastguard Worker #define MIIM_STRING 0x00000040 15*f6dc9357SAndroid Build Coastguard Worker #endif 16*f6dc9357SAndroid Build Coastguard Worker /* 17*f6dc9357SAndroid Build Coastguard Worker #ifndef MIIM_BITMAP 18*f6dc9357SAndroid Build Coastguard Worker #define MIIM_BITMAP 0x00000080 19*f6dc9357SAndroid Build Coastguard Worker #endif 20*f6dc9357SAndroid Build Coastguard Worker */ 21*f6dc9357SAndroid Build Coastguard Worker #ifndef MIIM_FTYPE 22*f6dc9357SAndroid Build Coastguard Worker #define MIIM_FTYPE 0x00000100 23*f6dc9357SAndroid Build Coastguard Worker #endif 24*f6dc9357SAndroid Build Coastguard Worker 25*f6dc9357SAndroid Build Coastguard Worker struct CMenuItem 26*f6dc9357SAndroid Build Coastguard Worker { 27*f6dc9357SAndroid Build Coastguard Worker UString StringValue; 28*f6dc9357SAndroid Build Coastguard Worker UINT fMask; 29*f6dc9357SAndroid Build Coastguard Worker UINT fType; 30*f6dc9357SAndroid Build Coastguard Worker UINT fState; 31*f6dc9357SAndroid Build Coastguard Worker UINT wID; 32*f6dc9357SAndroid Build Coastguard Worker HMENU hSubMenu; 33*f6dc9357SAndroid Build Coastguard Worker HBITMAP hbmpChecked; 34*f6dc9357SAndroid Build Coastguard Worker HBITMAP hbmpUnchecked; 35*f6dc9357SAndroid Build Coastguard Worker ULONG_PTR dwItemData; 36*f6dc9357SAndroid Build Coastguard Worker // LPTSTR dwTypeData; 37*f6dc9357SAndroid Build Coastguard Worker // UINT cch; 38*f6dc9357SAndroid Build Coastguard Worker // HBITMAP hbmpItem; IsStringCMenuItem39*f6dc9357SAndroid Build Coastguard Worker bool IsString() const { return (fMask & (MIIM_TYPE | MIIM_STRING)) != 0; } IsSeparatorCMenuItem40*f6dc9357SAndroid Build Coastguard Worker bool IsSeparator() const { return (fType == MFT_SEPARATOR); } CMenuItemCMenuItem41*f6dc9357SAndroid Build Coastguard Worker CMenuItem(): fMask(0), fType(0), fState(0), wID(0), 42*f6dc9357SAndroid Build Coastguard Worker hSubMenu(NULL), hbmpChecked(NULL), hbmpUnchecked(NULL), dwItemData(0) {} 43*f6dc9357SAndroid Build Coastguard Worker }; 44*f6dc9357SAndroid Build Coastguard Worker 45*f6dc9357SAndroid Build Coastguard Worker class CMenu 46*f6dc9357SAndroid Build Coastguard Worker { 47*f6dc9357SAndroid Build Coastguard Worker HMENU _menu; 48*f6dc9357SAndroid Build Coastguard Worker public: CMenu()49*f6dc9357SAndroid Build Coastguard Worker CMenu(): _menu(NULL) {} HMENU()50*f6dc9357SAndroid Build Coastguard Worker operator HMENU() const { return _menu; } Attach(HMENU menu)51*f6dc9357SAndroid Build Coastguard Worker void Attach(HMENU menu) { _menu = menu; } 52*f6dc9357SAndroid Build Coastguard Worker Detach()53*f6dc9357SAndroid Build Coastguard Worker HMENU Detach() 54*f6dc9357SAndroid Build Coastguard Worker { 55*f6dc9357SAndroid Build Coastguard Worker const HMENU menu = _menu; 56*f6dc9357SAndroid Build Coastguard Worker _menu = NULL; 57*f6dc9357SAndroid Build Coastguard Worker return menu; 58*f6dc9357SAndroid Build Coastguard Worker } 59*f6dc9357SAndroid Build Coastguard Worker Create()60*f6dc9357SAndroid Build Coastguard Worker bool Create() 61*f6dc9357SAndroid Build Coastguard Worker { 62*f6dc9357SAndroid Build Coastguard Worker _menu = ::CreateMenu(); 63*f6dc9357SAndroid Build Coastguard Worker return (_menu != NULL); 64*f6dc9357SAndroid Build Coastguard Worker } 65*f6dc9357SAndroid Build Coastguard Worker CreatePopup()66*f6dc9357SAndroid Build Coastguard Worker bool CreatePopup() 67*f6dc9357SAndroid Build Coastguard Worker { 68*f6dc9357SAndroid Build Coastguard Worker _menu = ::CreatePopupMenu(); 69*f6dc9357SAndroid Build Coastguard Worker return (_menu != NULL); 70*f6dc9357SAndroid Build Coastguard Worker } 71*f6dc9357SAndroid Build Coastguard Worker Destroy()72*f6dc9357SAndroid Build Coastguard Worker bool Destroy() 73*f6dc9357SAndroid Build Coastguard Worker { 74*f6dc9357SAndroid Build Coastguard Worker if (!_menu) 75*f6dc9357SAndroid Build Coastguard Worker return false; 76*f6dc9357SAndroid Build Coastguard Worker return BOOLToBool(::DestroyMenu(Detach())); 77*f6dc9357SAndroid Build Coastguard Worker } 78*f6dc9357SAndroid Build Coastguard Worker GetItemCount()79*f6dc9357SAndroid Build Coastguard Worker int GetItemCount() const 80*f6dc9357SAndroid Build Coastguard Worker { 81*f6dc9357SAndroid Build Coastguard Worker #ifdef UNDER_CE 82*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0;; i++) 83*f6dc9357SAndroid Build Coastguard Worker { 84*f6dc9357SAndroid Build Coastguard Worker CMenuItem item; 85*f6dc9357SAndroid Build Coastguard Worker item.fMask = MIIM_STATE; 86*f6dc9357SAndroid Build Coastguard Worker if (!GetItem(i, true, item)) 87*f6dc9357SAndroid Build Coastguard Worker return (int)i; 88*f6dc9357SAndroid Build Coastguard Worker } 89*f6dc9357SAndroid Build Coastguard Worker #else 90*f6dc9357SAndroid Build Coastguard Worker return GetMenuItemCount(_menu); 91*f6dc9357SAndroid Build Coastguard Worker #endif 92*f6dc9357SAndroid Build Coastguard Worker } 93*f6dc9357SAndroid Build Coastguard Worker GetSubMenu(int pos)94*f6dc9357SAndroid Build Coastguard Worker HMENU GetSubMenu(int pos) const { return ::GetSubMenu(_menu, pos); } 95*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE 96*f6dc9357SAndroid Build Coastguard Worker /* 97*f6dc9357SAndroid Build Coastguard Worker bool GetItemString(UINT idItem, UINT flag, CSysString &result) 98*f6dc9357SAndroid Build Coastguard Worker { 99*f6dc9357SAndroid Build Coastguard Worker result.Empty(); 100*f6dc9357SAndroid Build Coastguard Worker int len = ::GetMenuString(_menu, idItem, 0, 0, flag); 101*f6dc9357SAndroid Build Coastguard Worker int len2 = ::GetMenuString(_menu, idItem, result.GetBuf(len + 2), len + 1, flag); 102*f6dc9357SAndroid Build Coastguard Worker if (len > len2) 103*f6dc9357SAndroid Build Coastguard Worker len = len2; 104*f6dc9357SAndroid Build Coastguard Worker result.ReleaseBuf_CalcLen(len + 2); 105*f6dc9357SAndroid Build Coastguard Worker return (len != 0); 106*f6dc9357SAndroid Build Coastguard Worker } 107*f6dc9357SAndroid Build Coastguard Worker */ GetItemID(int pos)108*f6dc9357SAndroid Build Coastguard Worker UINT GetItemID(int pos) const { return ::GetMenuItemID(_menu, pos); } GetItemState(UINT id,UINT flags)109*f6dc9357SAndroid Build Coastguard Worker UINT GetItemState(UINT id, UINT flags) const { return ::GetMenuState(_menu, id, flags); } 110*f6dc9357SAndroid Build Coastguard Worker #endif 111*f6dc9357SAndroid Build Coastguard Worker GetItemInfo(UINT itemIndex,bool byPosition,LPMENUITEMINFO itemInfo)112*f6dc9357SAndroid Build Coastguard Worker bool GetItemInfo(UINT itemIndex, bool byPosition, LPMENUITEMINFO itemInfo) const 113*f6dc9357SAndroid Build Coastguard Worker { return BOOLToBool(::GetMenuItemInfo(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); } SetItemInfo(UINT itemIndex,bool byPosition,LPMENUITEMINFO itemInfo)114*f6dc9357SAndroid Build Coastguard Worker bool SetItemInfo(UINT itemIndex, bool byPosition, LPMENUITEMINFO itemInfo) 115*f6dc9357SAndroid Build Coastguard Worker { return BOOLToBool(::SetMenuItemInfo(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); } 116*f6dc9357SAndroid Build Coastguard Worker AppendItem(UINT flags,UINT_PTR newItemID,LPCTSTR newItem)117*f6dc9357SAndroid Build Coastguard Worker bool AppendItem(UINT flags, UINT_PTR newItemID, LPCTSTR newItem) 118*f6dc9357SAndroid Build Coastguard Worker { return BOOLToBool(::AppendMenu(_menu, flags, newItemID, newItem)); } 119*f6dc9357SAndroid Build Coastguard Worker Insert(UINT position,UINT flags,UINT_PTR idNewItem,LPCTSTR newItem)120*f6dc9357SAndroid Build Coastguard Worker bool Insert(UINT position, UINT flags, UINT_PTR idNewItem, LPCTSTR newItem) 121*f6dc9357SAndroid Build Coastguard Worker { return BOOLToBool(::InsertMenu(_menu, position, flags, idNewItem, newItem)); } 122*f6dc9357SAndroid Build Coastguard Worker 123*f6dc9357SAndroid Build Coastguard Worker #ifndef UNDER_CE InsertItem(UINT itemIndex,bool byPosition,LPCMENUITEMINFO itemInfo)124*f6dc9357SAndroid Build Coastguard Worker bool InsertItem(UINT itemIndex, bool byPosition, LPCMENUITEMINFO itemInfo) 125*f6dc9357SAndroid Build Coastguard Worker { return BOOLToBool(::InsertMenuItem(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); } 126*f6dc9357SAndroid Build Coastguard Worker #endif 127*f6dc9357SAndroid Build Coastguard Worker RemoveItem(UINT item,UINT flags)128*f6dc9357SAndroid Build Coastguard Worker bool RemoveItem(UINT item, UINT flags) { return BOOLToBool(::RemoveMenu(_menu, item, flags)); } RemoveAllItemsFrom(UINT index)129*f6dc9357SAndroid Build Coastguard Worker void RemoveAllItemsFrom(UINT index) { while (RemoveItem(index, MF_BYPOSITION)); } RemoveAllItems()130*f6dc9357SAndroid Build Coastguard Worker void RemoveAllItems() { RemoveAllItemsFrom(0); } 131*f6dc9357SAndroid Build Coastguard Worker 132*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE GetItemInfo(UINT itemIndex,bool byPosition,LPMENUITEMINFOW itemInfo)133*f6dc9357SAndroid Build Coastguard Worker bool GetItemInfo(UINT itemIndex, bool byPosition, LPMENUITEMINFOW itemInfo) const 134*f6dc9357SAndroid Build Coastguard Worker { return BOOLToBool(::GetMenuItemInfoW(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); } InsertItem(UINT itemIndex,bool byPosition,LPMENUITEMINFOW itemInfo)135*f6dc9357SAndroid Build Coastguard Worker bool InsertItem(UINT itemIndex, bool byPosition, LPMENUITEMINFOW itemInfo) 136*f6dc9357SAndroid Build Coastguard Worker { return BOOLToBool(::InsertMenuItemW(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); } SetItemInfo(UINT itemIndex,bool byPosition,LPMENUITEMINFOW itemInfo)137*f6dc9357SAndroid Build Coastguard Worker bool SetItemInfo(UINT itemIndex, bool byPosition, LPMENUITEMINFOW itemInfo) 138*f6dc9357SAndroid Build Coastguard Worker { return BOOLToBool(::SetMenuItemInfoW(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); } 139*f6dc9357SAndroid Build Coastguard Worker bool AppendItem(UINT flags, UINT_PTR newItemID, LPCWSTR newItem); 140*f6dc9357SAndroid Build Coastguard Worker #endif 141*f6dc9357SAndroid Build Coastguard Worker 142*f6dc9357SAndroid Build Coastguard Worker bool GetItem(UINT itemIndex, bool byPosition, CMenuItem &item) const; 143*f6dc9357SAndroid Build Coastguard Worker bool SetItem(UINT itemIndex, bool byPosition, const CMenuItem &item); 144*f6dc9357SAndroid Build Coastguard Worker bool InsertItem(UINT itemIndex, bool byPosition, const CMenuItem &item); 145*f6dc9357SAndroid Build Coastguard Worker Track(UINT flags,int x,int y,HWND hWnd)146*f6dc9357SAndroid Build Coastguard Worker int Track(UINT flags, int x, int y, HWND hWnd) { return ::TrackPopupMenuEx(_menu, flags, x, y, hWnd, NULL); } 147*f6dc9357SAndroid Build Coastguard Worker CheckRadioItem(UINT idFirst,UINT idLast,UINT idCheck,UINT flags)148*f6dc9357SAndroid Build Coastguard Worker bool CheckRadioItem(UINT idFirst, UINT idLast, UINT idCheck, UINT flags) 149*f6dc9357SAndroid Build Coastguard Worker { return BOOLToBool(::CheckMenuRadioItem(_menu, idFirst, idLast, idCheck, flags)); } 150*f6dc9357SAndroid Build Coastguard Worker CheckItem(UINT id,UINT uCheck)151*f6dc9357SAndroid Build Coastguard Worker DWORD CheckItem(UINT id, UINT uCheck) { return ::CheckMenuItem(_menu, id, uCheck); } CheckItemByID(UINT id,bool check)152*f6dc9357SAndroid Build Coastguard Worker DWORD CheckItemByID(UINT id, bool check) { return CheckItem(id, MF_BYCOMMAND | (check ? MF_CHECKED : MF_UNCHECKED)); } 153*f6dc9357SAndroid Build Coastguard Worker EnableItem(UINT uIDEnableItem,UINT uEnable)154*f6dc9357SAndroid Build Coastguard Worker BOOL EnableItem(UINT uIDEnableItem, UINT uEnable) { return EnableMenuItem(_menu, uIDEnableItem, uEnable); } 155*f6dc9357SAndroid Build Coastguard Worker }; 156*f6dc9357SAndroid Build Coastguard Worker 157*f6dc9357SAndroid Build Coastguard Worker class CMenuDestroyer 158*f6dc9357SAndroid Build Coastguard Worker { 159*f6dc9357SAndroid Build Coastguard Worker CMenu *_menu; 160*f6dc9357SAndroid Build Coastguard Worker public: CMenuDestroyer(CMenu & menu)161*f6dc9357SAndroid Build Coastguard Worker CMenuDestroyer(CMenu &menu): _menu(&menu) {} CMenuDestroyer()162*f6dc9357SAndroid Build Coastguard Worker CMenuDestroyer(): _menu(NULL) {} ~CMenuDestroyer()163*f6dc9357SAndroid Build Coastguard Worker ~CMenuDestroyer() { if (_menu) _menu->Destroy(); } Attach(CMenu & menu)164*f6dc9357SAndroid Build Coastguard Worker void Attach(CMenu &menu) { _menu = &menu; } Disable()165*f6dc9357SAndroid Build Coastguard Worker void Disable() { _menu = NULL; } 166*f6dc9357SAndroid Build Coastguard Worker }; 167*f6dc9357SAndroid Build Coastguard Worker 168*f6dc9357SAndroid Build Coastguard Worker } 169*f6dc9357SAndroid Build Coastguard Worker 170*f6dc9357SAndroid Build Coastguard Worker #endif 171