113 lines
3.0 KiB
C++
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__
|