- UID
- 215174
- 积分
- 286
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2005-1-29
- 最后登录
- 1970-1-1
|
发表于 2006-5-29 08:28:46
|
显示全部楼层
转贴:论坛里有人发过这样一个贴子,看看对你是否有帮助:
准确的说法应该是:要知道被调用命令何时结束,然后在其结束后作其他工作。
处理这个问题可以这样:
从AcEditorReactor派生一个类,重写其中的commandCancelled、commandEnded及commandFailed三个与命令结束有关的函数,在函数中监视特定命令的结束,若监视到,则可以通过内部回调或其他方式通知外部处理器进行处理。
思路说的应该比较清楚了,试着实现一下吧:)
下面是我的实现,参考一下:
#include <list>
#include <string>
#include <algorithm>
using namespace std;
//命令执行状态枚举
typedef enum
{
cmdEnded,
cmdCancelled,
cmdFailed
}cmdStatus;
typedef void (*cmdCallBack)(cmdStatus stat);
//命令执行跟踪器
class CCmdTracker: public AcEditorReactor
{
public:
CCmdTracker()
{
acedEditor->addReactor(this);
}
~CCmdTracker()
{
acedEditor->removeReactor(this);
}
void addCommand(const char *lpszCmd,cmdCallBack pfnCallback,BOOL bAutoRelease=TRUE)
{
if(lpszCmd!=NULL &&
lpszCmd[0]!=0 &&
pfnCallback!=NULL &&
FindCmd(lpszCmd)==m_Cmds.end())
{
cmdItem Item;
Item.strCmd=lpszCmd;
Item.pfnCallback=pfnCallback;
Item.bAutoRelease=bAutoRelease;
m_Cmds.push_back(Item);
}
}
void removeCommand(const char *lpszCmd)
{
cmdItemIter pos;
if(lpszCmd!=NULL &&
lpszCmd[0]!=0 &&
(pos=FindCmd(lpszCmd))!=m_Cmds.end())
m_Cmds.erase(pos);
}
protected:
virtual void commandCancelled(const char* cmdStr)
{
ProcessCmd(cmdStr,cmdCancelled);
}
virtual void commandEnded(const char* cmdStr)
{
ProcessCmd(cmdStr,cmdEnded);
}
virtual void commandFailed(const char* cmdStr)
{
ProcessCmd(cmdStr,cmdFailed);
}
private:
typedef struct
{
string strCmd;
cmdCallBack pfnCallback;
BOOL bAutoRelease;
}cmdItem;
typedef list<cmdItem> cmdItems;
typedef cmdItems::iterator cmdItemIter;
cmdItems m_Cmds;
cmdItemIter FindCmd(const char *lpszCmd)
{
cmdItemIter iter;
for(iter=m_Cmds.begin();iter!=m_Cmds.end();++iter)
{
if( lstrcmpi((*iter).strCmd.c_str(),lpszCmd)==0 )
break;
}
return iter;
}
void ProcessCmd(const char *cmdStr,cmdStatus stat)
{
cmdItemIter pos=FindCmd(cmdStr);
if(pos!=m_Cmds.end())
{
(*pos).pfnCallback(stat);
if( (*pos).bAutoRelease )
m_Cmds.erase(pos);
}
}
};
把在指定命令后要执行的代码做成一个函数,然后把此函数和命令追加到命令跟踪器中就可以了。这样,当指定命令结束后与其关联的后调函数会自动被调用。
应该明白了吧! |
|