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

113 lines
3.0 KiB
C++

#if !defined(__ARXCMDGROUP_H__)
#define __ARXCMDGROUP_H__
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ARX命令集管理,它封装了ARX的addCommand函数,使用MFC
// 风格,使用时从它派生新类,添加ARX命令成员函数
// 例子:MyArxCmdGroup.h
// class CMyArxCmdGroup : public ArxCmdGroup
// {
// DECLARE_DYNCREATE(ArxCmdGroup);
// ...
// //{{AFX_AEC_ARX_CMD(ArxCmdGroup)
// afx_arxcmd int MyTestCmd();
// ...
// //}}AFX_AEC_ARX_CMD
// DECLARE_AEC_ARXCMD_MAP(CMyArxCmdGroup);
// ...
// };
// MyArxCmdGroup.cpp
// IMPLEMENT_DYNCREATE(CMyArxCmdGroup, ArxCmdGroup);
// ...
// BEGIN_AEC_ARXCMD_MAP(CMyArxCmdGroup, MyTestGroup)
// //{{AFX_AEC_ARX_CMD(CMyArxCmdGroup)
// ON_AEC_ARXCMD(Test, Test, ACRX_CMD_TRANSPARENT | ACRX_CMD_USEPICKSET, MyTestCmd)
// ...
// //}}AFX_AEC_ARX_CMD
// END_AEC_ARXCMD_MAP(CMyArxCmdGroup)
// ...
// wyg--2005-04-05
class ArxCmdGroup;
class ArxEntryApp;
#define afx_arxcmd
typedef int (ArxCmdGroup::*lpFnArxCmdPtr)(void);
typedef struct
{
LPCTSTR pszGroup;
LPCTSTR pszInter;
LPCTSTR pszLocal;
long lFlags;
lpFnArxCmdPtr pFnCmd;
int iFunCode;
int idLocal;
}ArxCmdInfo;
#define DECLARE_AEC_ARXCMD_MAP(CLASS) \
private: \
friend void MAINPROCOF##CLASS(); \
static CLASS* m_pThis##CLASS; \
static ArxCmdInfo m_p##CLASSCmdInfo[]; \
virtual LPCTSTR OnGetGroupName(); \
virtual AcRxFunctionPtr OnGetMainProc(); \
virtual int OnGetCmdEntrySize(); \
virtual ArxCmdInfo* OnGetCmdEntry() \
#define BEGIN_AEC_ARXCMD_MAP(CLASS, GroupName) \
CLASS* CLASS::m_pThis##CLASS = NULL; \
LPCTSTR CLASS::OnGetGroupName() { \
return _T(#GroupName);} \
void MAINPROCOF##CLASS() { \
CLASS::m_pThis##CLASS->OnInvkSubCommand();} \
AcRxFunctionPtr CLASS::OnGetMainProc() { \
m_pThis##CLASS = this; \
return MAINPROCOF##CLASS;} \
ArxCmdInfo* CLASS::OnGetCmdEntry() { \
return m_p##CLASSCmdInfo;} \
ArxCmdInfo CLASS::m_p##CLASSCmdInfo[] = { \
#define ON_AEC_ARXCMD(Inter, Local, lFlags, pFnCmd) \
{NULL, _T(#Inter), _T(#Local), lFlags, (lpFnArxCmdPtr)&pFnCmd, 0, -1}, \
#define ON_AEC_ARXCMD_EX(Inter, lFlags, pFnCmd, idLocal) \
{NULL, _T(#Inter), NULL, lFlags, (lpFnArxCmdPtr)&pFnCmd, 0, idLocal}, \
#define END_AEC_ARXCMD_MAP(CLASS) }; \
int CLASS::OnGetCmdEntrySize() { \
return (sizeof(m_p##CLASSCmdInfo) / sizeof((m_p##CLASSCmdInfo)[0]));} \
class ArxCmdGroup : public CObject
{
DECLARE_DYNAMIC(ArxCmdGroup);
public:
ArxCmdGroup();
virtual ~ArxCmdGroup();
protected:
virtual void OnAddCommands();
virtual void OnRemoveCommands();
virtual void OnInvkSubCommand();
// if local id is used, you must override this
// virtual function to load string from Resource
virtual LPCTSTR GetStringFromId(int iID);
private:
virtual LPCTSTR OnGetGroupName() = 0;
virtual int OnGetCmdEntrySize() = 0;
virtual AcRxFunctionPtr OnGetMainProc() = 0;
virtual ArxCmdInfo* OnGetCmdEntry() = 0;
ArxEntryApp* m_pArxEntryApp;
friend class ArxEntryApp;
};
#endif // __ArxCmdGroup_H__