Сохранение и восстановление Canvas-> Состояние пера

#c builder

#конструктор c

Вопрос:

Я пытаюсь сохранить текущее состояние Canvas-> Перо, затем восстановить его, но это не работает, и все функции 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;
  

Старое перо никогда не восстанавливается, почему?

Ответ №1:

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

Вы просто сохраняете указатель на внутренний 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);
  

Комментарии:

1. Спасибо за разъяснения и решение, я буду использовать 2-й вариант

2. 2-й вариант SaveDC / RestoreDC не работает, 1-й работает