Сохранение и восстановление Canvas-> Pen State - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь сохранить текущее состояние 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 никогда не восстанавливается, почему

1 Ответ

4 голосов
/ 16 марта 2019

Вы на самом деле ничего не сохраняете и не восстанавливаете.

Вы просто сохраняете указатель во внутренний TPen объект, которым владеет Canvas. Когда вы затем назначаете новый объект TPen свойству Canvas->Pen, вы вообще не обмениваетесь объектами, вы просто копируете значения свойства из объекта newpen в объект Canvas->Pen - тот же самый объект, который oldpen указывает на. Затем, когда вы пытаетесь «восстановить» 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 функцию сохранения + восстановления вместо:

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