C ++ Builder - проблема с компонентом TShape - PullRequest
0 голосов
/ 27 октября 2010

У меня есть этот кусок кода:

TShape* T[256];

/* Other code ... */

for (int i = 255; i > 0; i--) {
     T[i]->Brush->Color = T[i - 1]->Brush->Color;
     T[i]->Pen->Color = T[i - 1]->Pen->Color;
};

Цикл выполняется TTimer каждые 100 миллисекунд, а цвет первого TShape меняется каждые 100 миллисекунд.

Во время этого цикла я вижу мигающие белые горизонтальные линии, потому что перед получением цвета другого TShape каждый TShape становится недействительным и становится белым.

Есть ли способ избежать такого поведения? Может быть, я должен переопределить какой-то метод?

Ответы [ 2 ]

0 голосов
/ 29 октября 2010

TShape аннулирует себя каждый раз, когда вы изменяете его свойства Brush и Pen, поэтому ваш цикл делает двойной аннулирование каждого TShape. В качестве обходного пути попробуйте временно удалить обработчики событий OnChange, которые TShape назначает внутренне, а затем Invalidate () TShape только один раз после его обновления. Например:

for (int i = 255; i > 0; i--)
{ 
    TNotifyEvent OldBrushChange = T[i]->Brush->OnChange;
    T[i]->Brush->OnChange = NULL;

    TNotifyEvent OldPenChange = T[i]->Pen->OnChange;
    T[i]->Pen->OnChange = NULL;

    T[i]->Brush->Color = T[i - 1]->Brush->Color; 
    T[i]->Pen->Color = T[i - 1]->Pen->Color; 

    T[i]->Brush->OnChange = OldBrushChange;
    T[i]->Pen->OnChange = OldPenChange;
    T[i]->Invalidate();
}; 
0 голосов
/ 27 октября 2010

Я думаю, что двойная буферизация является ключом к вашей проблеме. Если вы используете C ++ Builder 2009 или более позднюю версию, вероятно, будет достаточно установить свойство Controls :: TWinControl :: DoubleBuffered для текущего кадра.

...