先是结果:
现在我每次把一张空图最先存储在stack中
然后每次LButtonUp draw完后 就调用一次RecorBmp(XXX)函数
即把当前图像保存
每次点击撤销按钮就将要显示的位图的指针进行复制
就是 m_CurBmp = Stack.Undo();(我已经在此步之后重绘)
问题是貌似链栈存储混乱 以下是顺序:
初始为空图 , 图一 , 图二 ,按撤销显示的还是图二,再按撤销为图一,再按为空图,
图三,图四,按撤销为图四,再按撤销为图三,再按撤销又变回图四
不知道哪儿错了
// CStack 成员函数先是利用获取的位图指针 新建一副位图 拷贝 最后存储
其中ClearReDo操作是将cur指针之后的链元素清楚(模拟撤销后再画图 重复按键就不能再用)
void CStack::ClearReDo()
{
if(bottom == NULL || cur->next == NULL )
return;
Node *temp;
temp = cur->next;
while(temp)
{
Node *flag;
flag = temp->next;
delete temp->data;
delete temp;
temp = flag;
}
cur->next = NULL;
}
下边这个就是存储位图指针
void CStack::RecordBmp(CBitmap *bmp)
{
ClearReDo(); CBitmap *bit;
bit = new CBitmap;

//位图信息
BITMAP bm;
bmp->GetBitmap(&bm);
bit->CreateBitmapIndirect(&bm);
//拷贝一份位图

CDC dc;
CDC dcmem;
dc.CreateCompatibleDC(NULL);
dc.SelectObject(bit);
dcmem.CreateCompatibleDC(NULL);
dcmem.SelectObject(bmp);
dc.BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dcmem,0,0,SRCCOPY);
Node *temp;
temp = new Node;
if(bottom == NULL)
{
cur = bottom = temp;
temp->next = NULL;
temp->previous = NULL;
temp->data = bit;
}
else
{
temp->data = bit;
temp->next = NULL;
temp->previous = cur;
cur->next = temp;
cur = temp;
}
}
下边是撤销操作
BOOL CStack::IsNull()
{
if(cur == bottom)
return true;
else return false;
}
CBitmap* CStack::UnDo()
{
if(!IsNull())
cur = cur->previous;
return cur->data;
}
//////////////////////////////////现在我每次把一张空图最先存储在stack中
然后每次LButtonUp draw完后 就调用一次RecorBmp(XXX)函数
即把当前图像保存
每次点击撤销按钮就将要显示的位图的指针进行复制
就是 m_CurBmp = Stack.Undo();(我已经在此步之后重绘)
问题是貌似链栈存储混乱 一下是顺序:
初始为空图 , 图一 , 图二 ,按撤销显示的还是图二,再按撤销为图一,再按为空图,
图三,图四,按撤销为图四,再按撤销为图三,再按撤销又变回图四
不知道哪儿错了