【VC开源代码栏目提醒】:网学会员--在 VC开源代码编辑为广大网友搜集整理了:UndoStack.cpp绩等信息,祝愿广大网友取得需要的信息,参考学习。
// UndoStack.cpp: implementation of the CUndoStack class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SimpleEdit.h"
#include "UndoStack.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CUndoStack::CUndoStack()
{
//将开始位置和结束位置均初始化为0
m_Begin = 0;
m_End = 0;
for (int i = 0; i < UndoStackLen; i++)
{
m_List[i].LB = 0;
m_List[i].lpData = NULL;
}
}
CUndoStack::~CUndoStack()
{
//清空堆栈中的数据并释放内存
Clear();
}
bool CUndoStack::IsEmpty()
{
//如果m_Begin和m_End相等则认为堆栈为空
return m_Begin == m_End;
}
bool CUndoStack::IsFull()
{
//因为本
程序使用了循环的方式使用内存空间,
//即在m_End等于UndoStackLen - 1时压栈会覆盖0这个位置,
//同时m_Begin会加1,详细内容参考Push函数中的注释
return ((m_End == UndoStackLen - 1) && (m_Begin == 0)) ||
(m_End == m_Begin - 1);
}
void CUndoStack::Push(CUndoItem * ui)
{
//堆栈为满
if (IsFull())
{
//m_Begin和m_End都需要加1
m_Begin++;
m_End++;
//循环使用堆栈的存储空间
if (m_Begin >= UndoStackLen)
m_Begin = 0;
else if (m_End >= UndoStackLen)
m_End = 0;
//因为被覆盖,所以需要释放堆栈中原来的数据
//根据不同的类别选择不同的释放方式
//字符串类型按数组的方式来释放
//LOGFONT类型直接释放
if ((m_List[m_Begin].LB == 0) && (m_List[m_Begin].lpData))
{
delete [] LPTSTR(m_List[m_Begin].lpData);
m_List[m_Begin].lpData = NULL;
}
else if (m_List[m_Begin].lpData)
{
delete m_List[m_Begin].lpData;
m_List[m_Begin].lpData = NULL;
}
if ((m_List[m_End].LB == 0) && (m_List[m_End].lpData))
{
delete [] m_List[m_End].lpData;
m_List[m_End].lpData = NULL;
}
else if (m_List[m_End].lpData)
{
delete m_List[m_End].lpData;
m_List[m_End].lpData = NULL;
}
}
//堆栈为空
else
{
m_End++;
if (m_End >= UndoStackLen)
m_End = 0;
}
m_List[m_End].LB = ui->LB;
//存储的是字符串
if (m_List[m_End].LB == 0)
{
//如果有数据,先释放
if (m_List[m_End].lpData)
{
delete [] LPTSTR(m_List[m_End].lpData);
m_List[m_End].lpData = NULL;
}
//重新分配空间
m_List[m_End].lpData = new CHAR[strlen((LPSTR)(ui->lpData)) + 1];
//复制字符串,用于保存
strcpy((LPTSTR)(m_List[m_End].lpData), (LPSTR)(ui->lpData));
}
//存储的是字体
else
{
//如果有数据,先释放
if (m_List[m_End].lpData)
{
delete m_List[m_End].lpData;
m_List[m_End].lpData = NULL;
}
//重新分配空间
m_List[m_End].lpData = new LOGFONT;
//复制字体,用于保存
((LOGFONT *)(m_List[m_End].lpData))->lfHeight = ((LOGFONT *)(ui->lpData))->lfHeight;
((LOGFONT *)(m_List[m_End].lpData))->lfWidth = ((LOGFONT *)(ui->lpData))->lfWidth;
((LOGFONT *)(m_List[m_End].lpData))->lfEscapement = ((LOGFONT *)(ui->lpData))->lfEscapement;
((LOGFONT *)(m_List[m_End].lpData))->lfOrientation = ((LOGFONT *)(ui->lpData))->lfOrientation;
((LOGFONT *)(m_List[m_End].lpData))->lfWeight = ((LOGFONT *)(ui->lpData))->lfWeight;
((LOGFONT *)(m_List[m_End].lpData))->lfItalic = ((LOGFONT *)(ui->lpData))->lfItalic;
((LOGFONT *)(m_List[m_End].lpData))->lfUnderline = ((LOGFONT *)(ui->lpData))->lfUnderline;
((LOGFONT *)(m_List[m_End].lpData))->lfStrikeOut = ((LOGFONT *)(ui->lpData))->lfStrikeOut;
((LOGFONT *)(m_List[m_End].lpData))->lfCharSet = ((LOGFONT *)(ui->lpData))->lfCharSet;
((LOGFONT *)(m_List[m_End].lpData))->lfOutPrecision = ((LOGFONT *)(ui->lpData))->lfOutPrecision;
((LOGFONT *)(m_List[m_End].lpData))->lfClipPrecision = ((LOGFONT *)(ui->lpData))->lfClipPrecision;
((LOGFONT *)(m_List[m_End].lpData))->lfQuality = ((LOGFONT *)(ui->lpData))->lfQuality;
((LOGFONT *)(m_List[m_End].lpData))->lfPitchAndFamily = ((LOGFONT *)(ui->lpData))->lfPitchAndFamily;
strcpy(((LOGFONT *)(m_List[m_End].lpData))->lfFaceName, ((LOGFONT *)(ui->lpData))->lfFaceName);
}
}
bool CUndoStack::Pop(CUndoItem *ui)
{
//如果堆栈为空或者用户没有传入用于保存Pop结果的结构指针,返回false
if (IsEmpty() || ui == NULL)
return fa