Як позбутися від нав'язливого мерехтіння?
Добридень! Наваял свій компонент - нащадок 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. Зазделегідь дякую.
Спробуй перехопити повідомлення wm_erasebkgnd.
У конструкторі постав
DoubleBuffered: = True
Справа все не в цьому.
Ось, наприклад, рядок
>> 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;
Я навів код для методу .Paint
Спасибочки Dimka Maslov.
Здається спрацювало!