#if !defined(__ADSCMDGROUP_H__) #define __ADSCMDGROUP_H__ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // ADS命令集管理,它封装了ARX的acedDefun函数,使用MFC // 风格,使用时从它派生新类,添加ADS命令成员函数 // 例子:MyAdsCmdGroup.h // class CMyAdsCmdGroup : public AdsCmdGroup // { // DECLARE_DYNCREATE(AdsCmdGroup); // ... // //{{AFX_AEC_ADS_CMD(AdsCmdGroup) // afx_adscmd int MyTestCmd(); // ... // //}}AFX_AEC_ADS_CMD // DECLARE_AEC_ADSCMD_MAP(CMyAdsCmdGroup); // ... // }; // MyAdsCmdGroup.cpp // IMPLEMENT_DYNCREATE(CMyAdsCmdGroup, AdsCmdGroup); // ... // BEGIN_AEC_ADSCMD_MAP(CMyAdsCmdGroup, MyTestGroup) // //{{AFX_AEC_ADS_CMD(CMyAdsCmdGroup) // ON_AEC_ADSCMD(Test, MyTestCmd) // ... // //}}AFX_AEC_ADS_CMD // END_AEC_ADSCMD_MAP(CMyAdsCmdGroup) // ... // wyg--2005-04-05 class AdsCmdGroup; class ArxEntryApp; #define afx_adscmd typedef int (AdsCmdGroup::*lpFnAdsCmdPtr)(); typedef struct { LPCTSTR pszName; lpFnAdsCmdPtr pFnCmd; int iFunCode; BOOL bRegFunc; BOOL bRenderCmd; }AdsCmdInfo; #define DECLARE_AEC_ADSCMD_MAP(CLASS) \ protected: \ virtual int OnGetCmdEntrySize(); \ virtual AdsCmdInfo* OnGetCmdEntry(); \ static AdsCmdInfo m_p##CLASSCmdInfo[]; \ #define BEGIN_AEC_ADSCMD_MAP(CLASS) \ AdsCmdInfo* CLASS::OnGetCmdEntry() { \ return m_p##CLASSCmdInfo;} \ AdsCmdInfo CLASS::m_p##CLASSCmdInfo[] = { \ #define ON_AEC_ADSCMD(Name, pFnCmd) \ {#Name, (lpFnAdsCmdPtr)&pFnCmd, 0, FALSE, FALSE}, \ #define ON_AEC_ADSCMD_EX(Name, pFnCmd, bRegFunc, bRenderCmd) \ {#Name, (lpFnAdsCmdPtr)&pFnCmd, 0, bRegFunc, bRenderCmd}, \ #define END_AEC_ADSCMD_MAP(CLASS) }; \ int CLASS::OnGetCmdEntrySize() { \ return (sizeof(m_p##CLASSCmdInfo) / sizeof((m_p##CLASSCmdInfo)[0]));} \ class AdsCmdGroup : public CObject { DECLARE_DYNAMIC(AdsCmdGroup); public: AdsCmdGroup(); virtual ~AdsCmdGroup(); protected: virtual void OnAddCommands(); virtual void OnRemoveCommands(); virtual void OnInvkSubCommand(); private: virtual int OnGetCmdEntrySize() = 0; virtual AdsCmdInfo* OnGetCmdEntry() = 0; ArxEntryApp* m_pArxEntryApp; friend class ArxEntryApp; }; #endif // __AdsCmdGroup_H__