Files
envi-code/SourceCode/Code2026/tg_shs/inc/Acad/TGArxCmdGroup.h
T
2026-09-28 15:28:50 +08:00

113 lines
3.0 KiB
C++

#if !defined(__TGARXCMDGROUP_H__)
#define __TGARXCMDGROUP_H__
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ARX命令集管理,它封装了ARX的addCommand函数,使用MFC
// 风格,使用时从它派生新类,添加ARX命令成员函数
// 例子:MyArxCmdGroup.h
// class CMyArxCmdGroup : public TGArxCmdGroup
// {
// DECLARE_DYNCREATE(TGArxCmdGroup);
// ...
// //{{AFX_TG_ARX_CMD(TGArxCmdGroup)
// afx_arxcmd int MyTestCmd();
// ...
// //}}AFX_TG_ARX_CMD
// DECLARE_TG_ARXCMD_MAP(CMyArxCmdGroup);
// ...
// };
// MyArxCmdGroup.cpp
// IMPLEMENT_DYNCREATE(CMyArxCmdGroup, TGArxCmdGroup);
// ...
// BEGIN_TG_ARXCMD_MAP(CMyArxCmdGroup, MyTestGroup)
// //{{AFX_TG_ARX_CMD(CMyArxCmdGroup)
// ON_TG_ARXCMD(Test, Test, ACRX_CMD_TRANSPARENT | ACRX_CMD_USEPICKSET, MyTestCmd)
// ...
// //}}AFX_TG_ARX_CMD
// END_TG_ARXCMD_MAP(CMyArxCmdGroup)
// ...
// wyg--2005-04-05
class TGArxCmdGroup;
class TGArxEntryApp;
#define afx_arxcmd
typedef int (TGArxCmdGroup::*lpFnArxCmdPtr)(void);
typedef struct
{
LPCTSTR pszGroup;
LPCTSTR pszInter;
LPCTSTR pszLocal;
long lFlags;
lpFnArxCmdPtr pFnCmd;
int iFunCode;
int idLocal;
}TGArxCmdInfo;
#define DECLARE_TG_ARXCMD_MAP(CLASS) \
private: \
friend void MAINPROCOF##CLASS(); \
static CLASS* m_pThis##CLASS; \
static TGArxCmdInfo m_p##CLASSCmdInfo[]; \
virtual LPCTSTR OnGetGroupName(); \
virtual AcRxFunctionPtr OnGetMainProc(); \
virtual int OnGetCmdEntrySize(); \
virtual TGArxCmdInfo* OnGetCmdEntry() \
#define BEGIN_TG_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;} \
TGArxCmdInfo* CLASS::OnGetCmdEntry() { \
return m_p##CLASSCmdInfo;} \
TGArxCmdInfo CLASS::m_p##CLASSCmdInfo[] = { \
#define ON_TG_ARXCMD(Inter, Local, lFlags, pFnCmd) \
{NULL, _T(#Inter), _T(#Local), lFlags, (lpFnArxCmdPtr)&pFnCmd, 0, -1}, \
#define ON_TG_ARXCMD_EX(Inter, lFlags, pFnCmd, idLocal) \
{NULL, _T(#Inter), NULL, lFlags, (lpFnArxCmdPtr)&pFnCmd, 0, idLocal}, \
#define END_TG_ARXCMD_MAP(CLASS) }; \
int CLASS::OnGetCmdEntrySize() { \
return (sizeof(m_p##CLASSCmdInfo) / sizeof((m_p##CLASSCmdInfo)[0]));} \
class TGArxCmdGroup : public CObject
{
DECLARE_DYNAMIC(TGArxCmdGroup);
public:
TGArxCmdGroup();
virtual ~TGArxCmdGroup();
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 TGArxCmdInfo* OnGetCmdEntry() = 0;
TGArxEntryApp* m_pArxEntryApp;
friend class TGArxEntryApp;
};
#endif // __TGARXCMDGROUP_H__