![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как избавиться от навязчивого мерцания? [D5, Win2k]
andrew_f © (2002-09-10 16:53:00)Добрый день! Наваял свой компонент - потомок BitBtn, в котором происходит смена изображения при различных событиях мыши. Например, навожу на него, потом убираю - меняеся картинка. Внедрил свойство
FImageList: TImageList; , а процедура смены картинки выглядит так:
procedure TAFVActiveButton.SetImage(Index: integer);
begin
if not Assigned(FImageList) then exit;
if Index = -1 then exit;
if Index > FImageList.Count-1 then exit;
with Glyph do begin
Width := FImageList.Width;
Height := FImageList.Height;
Canvas.FillRect(Rect(0,0, Width, Height));
FImageList.GetBitmap(Index, Glyph);
end;
end;
При отрабоке события мерцает вся кнопка. Не знаю, можно ли как нибудь уменьшить это мерцание или хотя бы мерцал только сам Glyph ? Зарание спасибо.
Andrew_f (2002-09-10 19:39:00) [1]Спасибочки Dimka Maslov !
Кажется сработало!
Вконец озверевший кадастрат (2002-09-10 19:16:00) [2]Я привел код для метода .Paint
Вконец озверевший кадастрат (2002-09-10 19:14:00) [3]Дело все не в этом.
Вот, например, строка
>>Canvas.FillRect(Rect(0,0, Width, Height));
Наводит на размышления. То есть, я так понимаю, в методTAFVActiveButton.SetImageвызывается в методе .Paint.
И значит, каждый раз при перерисовке компонента (принудительной или вызыванной системой) происходит (я так понимаю):
1. Очистка канваса (вот тут "мигает")
2. Перенос изображения из ImageList"а и т.п.
Короче, говоря, делается так:
Сначала все дело рисуется на канве временного битмэпа, потом (в самом конце)картинка с этого битмэпа переносится на твою канву.
...
var TempBmp: TBitmap;
...
try
TempBmp := TBitmap.Create;
With TempBmp.Canvas do
begin
/// тут делается все то, что нужно рисовать на твоей канве
/// можно и в твой метод вставить параметр, передающий
/// канву для рисования и передавать туда канву
/// TempBmp.Canvas
end;
// а теперь окончательно рисуем на своей канве
Self.Canvas.Draw (0,0,TempBmp)
finally
TempBmp.Free;
end;
Dimka Maslov (2002-09-10 16:59:00) [4]В конструкторе поставь
DoubleBuffered := True
Alx2 (2002-09-10 16:57:00) [5]Попробуй перехватить сообщение wm_erasebkgnd.