138 lines
3.7 KiB
C++
138 lines
3.7 KiB
C++
#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__)
|