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