Files
Work/common/Puremenu.hpp
2024-08-07 09:09:36 -04:00

184 lines
5.4 KiB
C++

#ifndef _COMMON_PUREMENU_HPP_
#define _COMMON_PUREMENU_HPP_
#ifndef _COMMON_WINDOWS_HPP_
#include <common/windows.hpp>
#endif
#ifndef _COMMON_WINDOW_HPP_
#include <common/window.hpp>
#endif
#ifndef _COMMON_DWINDOW_HPP_
#include <common/dwindow.hpp>
#endif
#ifndef _COMMON_STRING_HPP_
#include <common/string.hpp>
#endif
#ifndef _COMMON_GDIPOINT_HPP_
#include <common/gdipoint.hpp>
#endif
#ifndef _COMMON_MENUITEM_HPP_
#include <common/menuitem.hpp>
#endif
#ifndef __FLAT__
#ifndef TPM_BOTTOMALIGN
#define TPM_BOTTOMALIGN 0x0020
#endif
#ifndef TPM_TOPALIGN
#define TPM_TOPALIGN 0x0000
#endif
#ifndef TPM_RETURNCMD
#define TPM_RETURNCMD 0x0100
#endif
#endif
class PureBitmap;
class PureMenu
{
public:
enum InsertFlags{ItemBitmap=MF_BITMAP,ItemOwnerDraw=MF_OWNERDRAW,ItemString=MF_STRING,
ItemChecked=MF_CHECKED,ItemDisabled=MF_DISABLED,ItemEnabled=MF_ENABLED,
ItemGrayed=MF_GRAYED,ItemMenuBarBreak=MF_MENUBARBREAK,ItemMenuBreak=MF_MENUBREAK,
ItemPopup=MF_POPUP,ItemSeparator=MF_SEPARATOR,ItemUnchecked=MF_UNCHECKED,
ItemMouseSelect=MF_MOUSESELECT,ItemHilite=MF_HILITE,ItemSysMenu=MF_SYSMENU};
enum PositionFlags{ByCommand=MF_BYCOMMAND,ByPosition=MF_BYPOSITION};
enum TrackFlags{RightAlign=TPM_RIGHTALIGN,CenterAlign=TPM_CENTERALIGN,LeftAlign=TPM_LEFTALIGN,
BottomAlign=TPM_BOTTOMALIGN,TopAlign=TPM_TOPALIGN,ReturnCommand=TPM_RETURNCMD,
LeftButton=TPM_LEFTBUTTON,RightButton=TPM_RIGHTBUTTON};
enum MenuType{TypeBitmap=MFT_BITMAP,TypeMenuBarBreak=MFT_MENUBARBREAK,TypeMenuBreak=MFT_MENUBREAK,
TypeOwnerDraw=MFT_OWNERDRAW,TypeRadioCheck=MFT_RADIOCHECK,TypeSeparator=MFT_SEPARATOR,
TypeString=MFT_STRING,TypeRightJustify=MFT_RIGHTJUSTIFY};
enum MenuStyle{PopupMenu,BarMenu};
PureMenu(void);
PureMenu(MenuStyle menuStyle);
PureMenu(HMENU hMenu);
PureMenu(const PureMenu &somePureMenu);
virtual ~PureMenu();
operator HMENU(void)const;
PureMenu &operator=(const PureMenu &somePureMenu);
PureMenu &operator=(const String &menuName);
PureMenu &operator=(HMENU hMenu);
BOOL operator==(const PureMenu &somePureMenu)const;
BOOL getSubMenu(int menuItemPos,PureMenu &subMenu)const;
String menuItemString(UINT menuItem,PositionFlags positionFlags=ByPosition)const;
UINT menuItemStringPos(const String &strMenuHeading)const;
WORD enableMenuItem(UINT menuItem,PositionFlags positionFlags,InsertFlags insertFlags)const;
bool checkMenuItem(UINT menuItem,UINT flags)const;
UINT getMenuState(UINT menuItem,PositionFlags positionFlags)const;
BOOL removeMenu(UINT position,PositionFlags positionFlags)const;
WORD appendMenu(UINT itemID,const String &itemString)const;
WORD appendMenu(Block<MenuItem> &menuItems)const;
WORD appendSeparator(void)const;
BOOL insertMenu(UINT position,InsertFlags insertFlags,UINT itemID,const String &itemString)const;
BOOL insertMenu(UINT position,const PureMenu &pureMenu,const String &itemString)const;
BOOL insertMenu(UINT position,const PureMenu &pureMenu,PureBitmap &somePureBitmap)const;
WORD trackPopupMenu(const Window &parentWindow,const GDIPoint &trackPoint,DWORD trackFlags=TopAlign|LeftAlign)const;
WORD trackPopupMenu(const DWindow &parentWindow,const GDIPoint &trackPoint,DWORD trackFlags=TopAlign|LeftAlign)const;
WORD trackPopupMenu(HWND hParentWnd,const GDIPoint &trackPoint,DWORD trackFlags=TopAlign|LeftAlign)const;
WORD isMenuItem(UINT itemID)const;
MenuType getMenuItemType(UINT menuItem,PositionFlags positionFlags)const;
WORD size(void)const;
BOOL isOkay(void)const;
private:
enum Disposition{Keep,Delete,Invalid};
UINT menuItemID(WORD menuItemIndex)const;
void createMenu(void);
void destroyMenu(void);
HMENU mhPureMenu;
Disposition mDisposition;
MenuStyle mMenuStyle;
};
inline
PureMenu::PureMenu(void)
: mhPureMenu(0), mDisposition(Delete), mMenuStyle(PopupMenu)
{
}
inline
PureMenu::PureMenu(MenuStyle menuStyle)
: mhPureMenu(0), mDisposition(Delete), mMenuStyle(menuStyle)
{
createMenu();
}
inline
PureMenu::PureMenu(const PureMenu &somePureMenu)
: mhPureMenu(0), mDisposition(Delete)
{
*this=somePureMenu;
}
inline
PureMenu::PureMenu(HMENU hMenu)
: mhPureMenu(hMenu), mDisposition(Keep)
{
}
inline
PureMenu::~PureMenu()
{
destroyMenu();
}
inline
PureMenu::operator HMENU(void)const
{
return mhPureMenu;
}
inline
BOOL PureMenu::operator==(const PureMenu &somePureMenu)const
{
return mhPureMenu==somePureMenu.mhPureMenu;
}
inline
BOOL PureMenu::removeMenu(UINT position,PositionFlags positionFlags)const
{
if(!isOkay())return FALSE;
return ::RemoveMenu(mhPureMenu,position,(UINT)positionFlags);
}
inline
WORD PureMenu::appendMenu(UINT itemID,const String &itemString)const
{
if(!isOkay())return FALSE;
return ::AppendMenu(mhPureMenu,ItemString|ItemEnabled,itemID,(LPSTR)itemString);
}
inline
WORD PureMenu::appendSeparator(void)const
{
if(!isOkay())return FALSE;
return ::AppendMenu(mhPureMenu,ItemSeparator,0,"");
}
inline
UINT PureMenu::menuItemID(WORD menuItemIndex)const
{
if(!isOkay())return FALSE;
if(!isOkay()||menuItemIndex>=size())return FALSE;
return ::GetMenuItemID(mhPureMenu,menuItemIndex);
}
inline
WORD PureMenu::trackPopupMenu(const Window &parentWindow,const GDIPoint &trackPoint,DWORD trackFlags)const
{
return trackPopupMenu((HWND)parentWindow,trackPoint,trackFlags);
}
inline
WORD PureMenu::trackPopupMenu(const DWindow &parentWindow,const GDIPoint &trackPoint,DWORD trackFlags)const
{
return trackPopupMenu((HWND)parentWindow,trackPoint,trackFlags);
}
inline
BOOL PureMenu::isOkay(void)const
{
return ::IsMenu(mhPureMenu);
}
#endif