保存和恢复 Canvas->Penn State

Saving and restoring Canvas->Pen State

我正在尝试保存 Canvas->Pen 的当前状态然后恢复它,但它不起作用并且所有 GDI 函数在恢复后都使用新的笔

    TPen * OldPen, * newpen;
    OldPen = Canvas->Pen;
    newpen = new TPen;
    newpen->Color = clPurple;
    newpen->Width = 2;
    Canvas->Pen = newpen;
// draw with the new pen...
    Canvas->Pen = OldPen;
    delete newpen;

Oldpen 从未恢复,为什么?

你实际上并没有保存和恢复任何东西。

您只是将 指针 保存到 Canvas 拥有的内部 TPen 对象。当您随后将新的 TPen 对象分配给 Canvas->Pen 属性 时,您根本没有交换对象,您只是从 newpen 复制 属性 值] 对象到 Canvas->Pen 对象 - oldpen 指向的同一对象。当您随后尝试 "restore" oldpen 时,您只是将 属性 值从原始(修改后的)TPen 复制回自身,这是一个空操作。

要执行您正在尝试的操作,您需要复制 Canvas->Pen 对象,然后将其复制回来,如下所示:

TPen *OldPen = new TPen;
OldPen->Assign(Canvas->Pen);
Canvas->Pen->Color = clPurple;
Canvas->Pen->Width = 2;
// draw with the new pen...
Canvas->Pen->Assign(OldPen);
delete OldPen;

或者,使用 GDI 自己的内置 save + restore functionality 代替:

int oldstate = ::SaveDC(Canvas->Handle);
Canvas->Pen->Color = clPurple;
Canvas->Pen->Width = 2;
// draw with the new pen...
::RestoreDC(Canvas->Handle, oldstate);