Files
Work/common/PUREMENU.CPP
2024-08-07 09:09:36 -04:00

171 lines
4.6 KiB
C++

#include <common/puremenu.hpp>
#include <common/purebmp.hpp>
PureMenu &PureMenu::operator=(const String &menuName)
{
destroyMenu();
mhPureMenu=::LoadMenu(::GetModuleHandle(0),(char*)(String&)menuName);
mDisposition=Delete;
return *this;
}
PureMenu &PureMenu::operator=(const PureMenu &somePureMenu)
{
WORD itemEntries;
UINT itemID;
if(!somePureMenu.isOkay())return *this;
itemEntries=somePureMenu.size();
mMenuStyle=somePureMenu.mMenuStyle;
createMenu();
for(short itemIndex=0;itemIndex<itemEntries;itemIndex++)
{
String itemString;
itemID=somePureMenu.menuItemID(itemIndex);
itemString=somePureMenu.menuItemString(itemIndex);
appendMenu(itemID,itemString);
}
return *this;
}
PureMenu &PureMenu::operator=(HMENU hMenu)
{
if((HMENU)*this==hMenu)return *this;
destroyMenu();
mhPureMenu=hMenu;
mDisposition=Keep;
return *this;
}
BOOL PureMenu::getSubMenu(int menuItemPos,PureMenu &subMenu)const
{
HMENU hSubMenu;
if(!isOkay())return FALSE;
hSubMenu=::GetSubMenu(mhPureMenu,menuItemPos);
if(!hSubMenu)return FALSE;
subMenu=hSubMenu;
return TRUE;
}
WORD PureMenu::trackPopupMenu(HWND hParentWnd,const GDIPoint &trackPoint,DWORD trackFlags)const
{
if(!isOkay())return FALSE;
if(trackPoint==GDIPoint())::GetCursorPos(&((POINT&)trackPoint));
return ::TrackPopupMenu(mhPureMenu,trackFlags,trackPoint.x(),trackPoint.y(),0,hParentWnd,0);
}
WORD PureMenu::size(void)const
{
if(!isOkay())return FALSE;
return ::GetMenuItemCount(mhPureMenu);
}
void PureMenu::createMenu(void)
{
destroyMenu();
if(PopupMenu==mMenuStyle)mhPureMenu=::CreatePopupMenu();
else mhPureMenu=::CreateMenu();
mDisposition=Delete;
}
void PureMenu::destroyMenu(void)
{
if(!mhPureMenu)return;
if(::IsMenu(mhPureMenu)&&Delete==mDisposition)::DestroyMenu(mhPureMenu);
mhPureMenu=0;
mDisposition=Invalid;
}
String PureMenu::menuItemString(UINT menuItem,PositionFlags positionFlags)const
{
String menuItemString;
if(!isOkay()||!size())return menuItemString;
::GetMenuString(mhPureMenu,menuItem,(LPSTR)menuItemString,String::MaxString,positionFlags);
menuItemString.removeTokens("&\t");
return menuItemString;
}
UINT PureMenu::menuItemStringPos(const String &strMenuHeading)const
{
UINT menuItems(size());
String strMenuItem;
for(int menuItem=0;menuItem<menuItems;menuItem++)
{
strMenuItem=menuItemString(menuItem);
strMenuItem.removeTokens("&");
if(strMenuItem==strMenuHeading)return menuItem;
}
return 0;
}
bool PureMenu::checkMenuItem(UINT menuItem,UINT flags)const
{
if(!isOkay()||!size())return FALSE;
return 0xFFFFFFFF==::CheckMenuItem(mhPureMenu,menuItem,flags)?false:true;
}
UINT PureMenu::getMenuState(UINT menuItem,PositionFlags positionFlags)const
{
if(!isOkay()||!size())return FALSE;
return ::GetMenuState(mhPureMenu,menuItem,(UINT)positionFlags);
}
PureMenu::MenuType PureMenu::getMenuItemType(UINT menuItem,PositionFlags positionFlags)const
{
MENUITEMINFO menuItemInfo;
if(!isOkay())return (MenuType)0;
::memset(&menuItemInfo,0,sizeof(MENUITEMINFO));
menuItemInfo.cbSize=sizeof(MENUITEMINFO);
menuItemInfo.fMask=MIIM_TYPE;
::GetMenuItemInfo(mhPureMenu,menuItem,positionFlags,&menuItemInfo);
return (MenuType)menuItemInfo.fType;
}
WORD PureMenu::enableMenuItem(UINT menuItem,PositionFlags positionFlags,InsertFlags insertFlags)const
{
if(!isOkay()||!size())return FALSE;
return ::EnableMenuItem(mhPureMenu,menuItem,(UINT)positionFlags|(UINT)insertFlags);
}
WORD PureMenu::appendMenu(Block<MenuItem> &menuItems)const
{
WORD itemCount(menuItems.size());
if(!isOkay())return FALSE;
for(short itemIndex=0;itemIndex<itemCount;itemIndex++)
appendMenu(menuItems[itemIndex].itemID(),menuItems[itemIndex].itemString());
return TRUE;
}
BOOL PureMenu::insertMenu(UINT position,InsertFlags insertFlags,UINT itemID,const String &itemString)const
{
if(!isOkay())return FALSE;
return ::InsertMenu(mhPureMenu,position,insertFlags|ItemString,itemID,itemString);
}
BOOL PureMenu::insertMenu(UINT position,const PureMenu &pureMenu,const String &itemString)const
{
if(!isOkay()||!pureMenu.isOkay())return FALSE;
return ::InsertMenu(mhPureMenu,position,ItemEnabled|ItemPopup|ItemString,(UINT)(HMENU)pureMenu,itemString);
}
BOOL PureMenu::insertMenu(UINT position,const PureMenu &pureMenu,PureBitmap &somePureBitmap)const
{
if(!isOkay()||!pureMenu.isOkay())return FALSE;
return ::InsertMenu(mhPureMenu,position,ItemEnabled|ItemBitmap|ItemPopup,(UINT)(HMENU)pureMenu,(LPCTSTR)(HBITMAP)somePureBitmap);
}
WORD PureMenu::isMenuItem(UINT itemID)const
{
WORD itemCount(size());
for(short itemIndex=0;itemIndex<itemCount;itemIndex++)if(itemID==menuItemID(itemIndex))return TRUE;
return FALSE;
}