118 lines
3.3 KiB
C++
118 lines
3.3 KiB
C++
// class VIPopupMenu
|
|
// interface to manipulate easily popup menu
|
|
|
|
#pragma once
|
|
#include "XHashTable.h"
|
|
|
|
class AFX_EXT_CLASS VIPopupMenu
|
|
{
|
|
public:
|
|
enum { VPF_VALID = 0x00000001,
|
|
VPF_LAST_ADDED_ITEM_IS_SEPARATOR = 0x00000002,
|
|
|
|
}VIPOPUPMENUFLAG;
|
|
|
|
VIPopupMenu(CWnd * parent);
|
|
VIPopupMenu(CMenu * menu);
|
|
VIPopupMenu();
|
|
virtual ~VIPopupMenu();
|
|
|
|
// Adds an item to the menu
|
|
HRESULT AddItem(CString name,UINT commandID,BOOL subMenu=FALSE,BOOL checked=FALSE,BOOL grayed=FALSE,CMenu** createdmenu=NULL);
|
|
HRESULT AddItemToSubMenu(UINT subMenucommandID,CString name,UINT commandID,BOOL subMenu=FALSE,BOOL checked=FALSE,BOOL grayed=FALSE,CMenu** createdmenu=NULL);
|
|
|
|
// Adds a separator
|
|
HRESULT AddSeparator();
|
|
HRESULT AddSeparatorToSubMenu(UINT commandID);
|
|
|
|
// Inserts an item to the menu
|
|
HRESULT InsertItem(int pos,CString name,UINT commandID,BOOL subMenu=FALSE,BOOL checked=FALSE,BOOL grayed=FALSE,CMenu** createdmenu=NULL);
|
|
HRESULT InsertItemToSubMenu(UINT subMenucommandID,int pos,CString name,UINT commandID,BOOL subMenu=FALSE,BOOL checked=FALSE,BOOL grayed=FALSE,CMenu** createdmenu=NULL);
|
|
|
|
// Inserts a separator
|
|
HRESULT InsertSeparator(int pos);
|
|
HRESULT InsertSeparatorToSubMenu(int pos,UINT commandID);
|
|
|
|
// Removes item at the specified position
|
|
HRESULT RemoveItemAt(int pos);
|
|
|
|
// Removes all item having the specified name from menu
|
|
HRESULT RemoveItem(CString name);
|
|
|
|
// Removes all item having the specified command ID from menu
|
|
HRESULT RemoveItem(UINT commandID);
|
|
|
|
// Removes all items
|
|
HRESULT Empty();
|
|
|
|
// Attach menu to a window or a menu resource
|
|
HRESULT Attach(CWnd* wnd);
|
|
HRESULT Attach(UINT resourceID);
|
|
HRESULT Attach(CMenu* menu);
|
|
HRESULT Detach();
|
|
|
|
//get main CMenu*
|
|
CMenu* GetCMenu();
|
|
|
|
//get sub menu by command id
|
|
CMenu* GetSubMenu(int commandID);
|
|
|
|
//show the menu at the current mouse position
|
|
void ShowAtMouse();
|
|
|
|
//show the menu at the specified position
|
|
//this func is virtual in order to be able to pause something, for instance pause CK engine in a derived class
|
|
virtual HRESULT Show(long x,long y);
|
|
|
|
//get menu item count
|
|
int GetMenuItemCount();
|
|
|
|
//get sub menu item count.
|
|
int GetSubMenuItemCount(UINT subMenucommandID);
|
|
|
|
//get menu string. Return value: char copied count,0 means not string / not found
|
|
int GetMenuString(UINT position,CString &str,UINT flags=MF_BYPOSITION);
|
|
|
|
//get sub menu string. Return value: char copied count,0 means not string / not found
|
|
int GetSubMenuString(UINT subMenucommandID,UINT position,CString &str,UINT flags=MF_BYPOSITION);
|
|
|
|
void DetachAndDeleteAllSubMenu();
|
|
void DestroyAndDeleteAllSubMenu();
|
|
|
|
BOOL IsLastItemAddedSeparator();
|
|
|
|
//flags access
|
|
DWORD GetFlags(){return m_CtrlFlags;}
|
|
void SetFlags(DWORD f) {m_CtrlFlags=f;}
|
|
void ModifyFlags(DWORD added=0,DWORD removed=0) {m_CtrlFlags&=~removed;m_CtrlFlags|=added;}
|
|
|
|
protected:
|
|
|
|
//DATAS
|
|
// the menu
|
|
// if it is to have icons, then must derive from CMenu
|
|
// and must have an image list somewhere (best to have it in CMenu
|
|
// derived class)
|
|
// later
|
|
//MAIN MENU
|
|
CMenu m_menu;
|
|
CMenu* m_pMenu;
|
|
|
|
//SUB MENU LIST <key> is the commandID
|
|
XHashTable<CMenu*,int> m_subMenuList;
|
|
|
|
//the window to which menu is attached
|
|
CWnd* m_pWnd;
|
|
|
|
//last item added was a separator ?
|
|
BOOL m_bLastAddedItemIsSeparator;
|
|
|
|
//Flags
|
|
DWORD m_CtrlFlags;
|
|
|
|
//FUNCTIONS
|
|
virtual void Init();
|
|
void DestroySubMenuList();
|
|
void ForceInsertCMenuInMap(CMenu* menu);
|
|
};
|