?? command.h
字號:
// Command.h: interface for the CCommand class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_COMMAND_H__413D14C5_DDA4_4F61_93D3_5405785E15FC__INCLUDED_)
#define AFX_COMMAND_H__413D14C5_DDA4_4F61_93D3_5405785E15FC__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// 使用STL列表
#include <list>
using namespace std;
/////////////////////////////////////////////////////////////////////
//
// CCommand 類
//
// 這是一個純虛類,必須由其子類實現其虛擬方法后才可用
// 相當于一個接口
//
class CCommand
{
public:
// 用于清理資源
virtual ~CCommand(){ };
// 用于執行命令
virtual bool Execute() = 0;
// 用于恢復命令
virtual bool Unexecute() = 0;
};
/////////////////////////////////////////////////////////////////////
//
// CCommandManagerT 類
//
// 這是一個命令管理類,用于管理所有的命令集合
//
template <class T = CCommand>
class CCommandManagerT
{
// 數據成員
private:
typedef list<T*> CommandList; // 命令列表定義
CommandList m_undoList; // 回退命令列表
CommandList m_redoList;
int m_nUndoLevel;
int m_nCleanCount;
// 構造與析構方法
public:
CCommandManagerT(int nUndoLevel = 100) :
m_nUndoLevel(nUndoLevel),
m_nCleanCount(0)
{ }
~CCommandManagerT()
{
Clear(); // 清空所有m_undoList與m_redoList內容
}
// 屬性
public:
bool CanUndo() const
{
return (m_undoList.size() > 0);
}
bool CanRedo() const
{
return (m_redoList.size() > 0);
}
int getUndoLevel() const
{
return m_nUndoLevel;
}
void setUndoLevel(int newValue)
{
m_nUndoLevel = newValue;
}
bool IsDirty() const
{
return (m_nCleanCount != 0);
}
T* getLastUndoCommand() const
{
return m_undoList.back();
}
T* getLastRedoCommand() const
{
return m_redoList.back();
}
// 個部接口方法
public:
void DoCommand(T* pCommand)
{
// 清空redo列表
ClearRedoList();
// 執行命令并將其加入Undo列表
if (pCommand->Execute())
AddUndo(pCommand);
}
void Undo()
{
if (CanUndo())
{
m_nCleanCount--;
T* pCommand = m_undoList.back();
m_undoList.pop_back();
if (pCommand->Unexecute())
AddRedo(pCommand);
else
delete pCommand;
}
}
void Redo()
{
if (CanRedo())
{
m_nCleanCount++;
T* pCommand = m_redoList.back();
m_redoList.pop_back();
if (pCommand->Execute())
AddUndo(pCommand);
else
delete pCommand;
}
}
void Clear()
{
ClearUndoList();
ClearRedoList();
}
void SetClean()
{
m_nCleanCount = 0;
}
void AddUndo(T* pCommand)
{
if (m_undoList.size() >= m_nUndoLevel)
{
delete m_undoList.front();
m_undoList.pop_front();
}
m_undoList.push_back(pCommand);
if (m_nCleanCount < 0 && m_redoList.size() > 0)
m_nCleanCount = m_undoList.size() + m_redoList.size() + 1;
else
m_nCleanCount++;
}
void AddRedo(T* pCommand)
{
m_redoList.push_back(pCommand);
}
void ClearUndoList()
{
ClearCommandList(&m_undoList);
}
void ClearRedoList()
{
ClearCommandList(&m_redoList);
}
void ClearCommandList(CommandList* pList)
{
CommandList::iterator it;
for (it = pList->begin(); it != pList->end(); it++)
delete *it;
pList->erase(pList->begin(), pList->end());
}
};
typedef CCommandManagerT<> CommandManager;
#endif // !defined(AFX_COMMAND_H__413D14C5_DDA4_4F61_93D3_5405785E15FC__INCLUDED_)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -