as je napisao(la):
Kako da na jednostavan nacin (i bez treperenja!!) u Delphiju dobijem rollover_image efekat? Znaci, kada misem dodjem na neku slicicu da se ona pretvori u drugu.
Hvala..
Promache mi ovaj post
Moze na nekoliko nacina, zavisi koliko si vican pisanju svojih komponenti. U principu, najbolje je da napravis svoje dugmence, recimo na osnovu TSpeedButtona ili direktno TGraphicControl kontrole.
Varijacije medju implementacijama se vode samo u tome gde se slicice drze i ko ih iscrtava:
1. da svaki takav rolloverbutton sadrzi dve slicice, jednu normalnu, a drugu rollover (ova verzija je elegantnije resenje)
2. da svaki takav rollover ima dva pointera ka TImageList klasama; jedna od njih da sadrzi normalne slicice, a druga rollover. Ovo nije elegantno zato sto komponenta zavisi od "spoljnih" klasa, pa treba voditi racuna da nisu nil, pa ako nisu, da se vodi racuna koji image ce se uzeti iz image liste, itd. Ovo jeste ok resenje, ali samo ako mislis da organizujes takve dugmice u neku listu, open array ili collection. Onda svaki od njih ima svoj Index property i koji mora da odgovara indexu slicice u listama. Primer ovakve organizacije je borlandova TToolbar komponenta sa TToolButton dugmicima.
Ono sta je zajednicko jeste nacin rollover efekta. Treba da napises event-handler za OnMouseMove za tu komponentu (trigeruje se kada je kursor iznad nje) -> najbolje da samo postavlja neki interni flag na true. Onda uzmes i uradis override Paint procedure (trigeruje se na svaki WM_PAINT message) i tu proveravas da li je RollFlag setovan ili ne (uzmi prvo false kao default vrednost), pa iscrtas jednu ili drugu slicku na Canvas podklasi (ukoliko radis sa TImageList klasama, koristi njihov metod Draw da bi iscrtao unutrasnjost dugmeta; RollFlag ti koristi samo da se odlucis koja od njih dve iscrtava). Da bi izbegao treperenje, mozes da stavis jos jedan private flag tipa painting ili updating, pa proveris pre samog iscrtavanja:
[code:1]
Procedure TRollButton.Paint;
begin
if not FPainting then
begin
FPainting := true;
// ovde iscrtavanje
FPainting := false;
end;
[/code:1]