#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-й работает