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