Cum să scapi de pâlpâirea obsesională

Cum să scapi de pâlpâirea obsesională?

Bună ziua! Navayal componenta sa - un descendent al BitBtn, în care imaginea se schimbă cu diferite evenimente ale mouse-ului. De exemplu, mă îndrept spre el, apoi îl îndepărtăm - imaginea se schimbă. Implementează proprietatea






FImageList: TImageList; iar procedura de schimbare a imaginii arată astfel:
procedura TAFVActiveButton.SetImage (index: integer);
începe
dacă nu este Atribuit (FImageList), atunci ieșiți;
dacă Index = -1 atunci ieșiți;
dacă Index> FImageList.Count-1 ieșiți;
cu Glyph să înceapă
Lățime: = FImageList.Width;
Înălțime: = FImageList.Height;
Canvas.FillRect (Rect (0,0, Lățime, Înălțime));
FImageList.GetBitmap (index, glif);
se încheie;
se încheie;
Când terminați evenimentul, întregul buton clipește. Nu știu dacă este posibil să reduci acest pâlpâire sau cel puțin să flick doar la Glyph. Vă mulțumim anticipat.

Încercați să interceptați mesajul wm_erasebkgnd.







În designer, pus
DoubleBuffered: = Adevărat

Nu este așa.
Aici, de exemplu, linia
>> Canvas.FillRect (Rect (0,0, Lățime, Înălțime));

Sugestiv. Aceasta este, după cum am înțeles, metoda TAFVActiveButton.SetImage este apelată în metoda .Paint.
Aceasta înseamnă că de fiecare dată când componenta este redesenată (forțată sau apelată de sistem), se întâmplă (așa cum am înțeles):

1. Curățarea pânzei (aici se aprinde intermitent)
2. Transferul de imagini din ImageList "a, etc.

Pe scurt, vorbind, se face astfel:

Mai întâi, totul este desenat pe pânza bitmapului temporar, apoi (la sfârșitul final) imaginea din acest bitmap este transferată pe panza dvs.


.
Var TempBmp: TBitmap;
.
încerca
TempBmp: = TBitmap.Create;
Cu TempBmp.Canvas face
începe

/// totul se face aici care trebuie să fie desenat pe pânza ta
/// este posibil și în metoda dvs. să inserați transferul parametrilor
/// panza pentru desen și transfer acolo panza
/// TempBmp.Canvas

se încheie;
// Și acum, în sfârșit, ne desenează pe panza noastră
Self.Canvas.Draw (0.0, TempBmp)
în cele din urmă
TempBmp.Free;
se încheie;

Am dat codul pentru metoda .Paint

Mulțumesc lui Dimka Maslov.
Se pare că a funcționat!







Articole similare

Trimiteți-le prietenilor: