#if !defined(__KTMENUPOPUP_H__) #define __KTMENUPOPUP_H__ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "KTMenuBase.h" #define KTMENU_ITEM_CMDFRAME 0xD001 #define KTMENU_ITEM_STARTID 0xD002 #define KTMENU_ITEM_ENDID 0xDFFF #define KTMENU_ITEM_LASTID KTMenuPopup::m_nLastID #define KTMENU_OWNERDRAW 1 #define KTICON_SIZE_X 16 #define KTICON_SIZE_Y 15 #define KTICON_BKCOLOR RGB(192, 192, 192) class KTMenuCtrl; class KTMenuPopup : public KTMenuBase { DECLARE_SERIAL(KTMenuPopup) public: // 析构与构造 KTMenuPopup(); virtual ~KTMenuPopup(); // 清除菜单 void Clean(); // 序列化 virtual void Serialize(CArchive& ar); // 通过菜单文件文本行创建相关子项 virtual KTMenuBase* CreateItem(CString& sLine); KTMenuBase* CreateItem(CString& sLine, LPCTSTR pszName); // 取得菜单组名 KTMenuCtrl* GetMenuCtrl(); // 创建菜单 const CMenu* CreateMenu() {return OnCreateMenu(KTMENU_ITEM_LASTID);} const CMenu* OnCreateMenu(UINT& nStartId); // 更新菜单ID void UpdateCmdID() {if (m_menuPopup.GetSafeHmenu() != NULL) OnUpdateCmdID(m_menuPopup.m_hMenu);} void OnUpdateCmdID(HMENU hMenu); // 下拉菜单名称 CString m_sName; // 上级菜单 KTMenuPopup* m_pParent; // 子菜单[KTMenuItem] CPtrArray m_arpItem; KTMenuCtrl * m_pMenuCtrl; // 实际自画菜单 #ifdef KTMENU_OWNERDRAW class KTMenu : public CMenu { public: virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct); } m_menuPopup; #else CMenu m_menuPopup; #endif // KTMENU_OWNERDRAW // 菜单ID static UINT m_nLastID; }; class KTMenuItem : public CObject { DECLARE_SERIAL(KTMenuItem) public: KTMenuItem() : m_pParent(NULL), m_pPopup(NULL), m_dwData(0l) {} ~KTMenuItem() {if (m_pPopup != NULL) delete m_pPopup;} // 格式规律:ResID [Popup{Status/State}Title]Action/Control // 资源串 子菜单 状态值或命令 标题 控件名或动作命令 BOOL IsPopupItem() {return (m_pPopup != NULL);} BOOL IsStatusItem() {return (m_sStatus.Find(_T("~=")) == 0);} BOOL IsCheckItem() {return (m_sStatus.Find(_T("!=")) == 0);} BOOL IsToolBarItem() {return (m_sStatus.Find(_T("@=")) == 0);} BOOL IsCtrlItem() {return (m_sStatus.Find(_T("#=")) == 0);} BOOL IsMRUFileItem() {return (m_sStatus.Find(_T("$=MRUFILE")) == 0);} BOOL IsWindowItem() {return (m_sStatus.Find(_T("$=WINDOW")) == 0);} BOOL IsSwitchItem() {return (m_sText == _T("*SWITCH*"));} BOOL IsSeparator() {return (m_sText == _T("--"));} // 弹出菜单 BOOL TrackPopupMenu(UINT nFlags, int iX, int iY, CWnd* pWnd); // 格式:{~=StatusProc}/{!=StatusProc}/{#=StatusProc} BOOL GetStatusProc(CString& sStatus); // nDockType停靠类型:0--浮动,1--上边,2--下边,3--左边,4--右边 // 浮动格式:{@=Show, 0, xPos, yPos, Row} // 停靠格式:{@=Show, 0, rowPos, colPos} BOOL GetToolBarState(BOOL& bShow, UINT& nDockType, CPoint& ptPos, UINT& nRow); static void GetToolBarState(CString& sState, BOOL bShow, UINT nDockType, CPoint ptPos, UINT nRow); BOOL GetCtrlName(CString& sCtrl); CSize GetCtrlSize(); // 取得无加速键的文本 CString GetBareText(); // 取得加速键信息 BOOL GetAccelerator(); public: CString m_sResource; // 当为Switch时为"*SWITCH*";当为Separator时为"--" CString m_sText; // 当为Switch时,作为当前Status的Resource;当为工具条控件时,作为控件名,宽度,高度 CString m_sAction; // 当为Switch时,作为当前Status的Text;当为工具条控件时,作为控件状态 CString m_sStatus; // 加速键 CString m_sAccel; ACCEL m_accel; // 其它数据 DWORD m_dwData; // 上级菜单 KTMenuPopup* m_pParent; // 下级菜单 KTMenuPopup* m_pPopup; }; #endif // !defined(__KTMENUPOPUP_H__)