Files
envi-code/SourceCode/Code2026/EarthWormMain/KTMenuPopup.h
T
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

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__)