[ Dejan Stojanovic @ 31.03.2009. 07:56 ] @
Kada dodajem kontrole na formu ili radim refresh, sadrzaj forme blinkne (misim da svi znaju na sta mislim).
Da li postoji nacin da se to izbegne ?

Koristio sam pre LockWindowUpdate api poziv i to je super radilo na framework-u 1.1, ali sad sa 3.0 ne dobijam nista (kad uradim LockWindowUpdate(0) da otkljucam update prozora, ceo prozor zajedno sa kontrolama blinkne).
[ mmix @ 31.03.2009. 08:58 ] @
Nema tu mnogo mudrosti, ako form repaint proces traje duze od jednog screen refresh ciklusa, imaces "blink" ;) i resenje univerzalno za to nemas jer to zavisi od mnogo faktora (OS, CPU, memorija, itd) Sa lockWindowsUpdate si ti samo suspendovao WM_PAINT da dodavanje novih kontrola ne bi izazivalo repaint, ali nisi niti mozes da ubrzas sam repaint cele forme koji ce se na kraju desiti.
Eventualno predji na Vistu, njen GDI renderuje u memory DC i koristi double-buffering sto bi u teoriji trebalo da resi tvoj problem.

[ deerbeer @ 31.03.2009. 09:22 ] @
Ima jos jedna caka koju moze da proba :
Da u WndProc svoje forme prvo uradi capture WM_ERASEBKGND poruke i da joj prosledi null u msg parametru strukture MSG
sto ce spreciti prvo brisanje cele forme pa zatim u sledecem prolazu WM_PAINT poruke
da upotrebi win32 Api f-ju ValidateRect kojom ce osveziti samo deo forme koje ga interesuje
tj . na onaj deo na koji se dodaju nove kontrole.

[ X Files @ 31.03.2009. 09:38 ] @
^
Zabranjeno je koristiti C/C++ fazone ;) Salim se...


Miljane, (ovo pitam cisto informativno, jer ne znam kako je reseno u C#) zar ne postoji neki vec ugradjeni genericki mehanizam za Double Buffering u C#/.NET ?

Kod VCL-a postoji DoubleBuffered za sve TWinControl, sto uglavnom resava problem jer u pozadini dolazi do kreiranja "in memory" bitmape. Za ozbiljnije stvari, treba ipak rucno implementirati Double Buffer mehanizam.


Na brzinu sam pogledao na netu:
http://stackoverflow.com/quest...-buffer-net-controls-on-a-form
http://www.bobpowell.net/doublebuffer.htm

Interesuje me ovaj deo koda:
ControlStyles.AllPaintingInWmPaint
ControlStyles.UserPaint
ControlStyles.DoubleBuffer

Da libi to resilo problem... ili mozda da Dejan pokusa tih nekoliko ponudjenih varijanti pa da javi kakvi su rezultati.
[ Dejan Stojanovic @ 31.03.2009. 09:45 ] @
hm, mislim da onaj deo sa windows message pozivom nece da prodje, ali da ne pricam napamet, probacu pa cu javiti da li nesto resava ovaj problem
[ mmix @ 31.03.2009. 09:55 ] @
Odlican find, iskreno nisam ni znao da ovo moze.

Mada bi ja i dalje batalio manuelni double buffering za forme i ostavio posao GDI-u (tj presao na vistu ako bas ne podnosi taj treptaj). Bas o tome pisu na drugom linku koji si poslao a tice se terminal services. GDI instrukcije se salju TS-om onako kako se renderuju, sto ce reci ako koristis double-buffer onda svaki paint salje formu kao screenDC bitmapu (bitblt over tcp/ip) sto je uvek vece nego skup GDI instrukcija i cini aplikaciju neupotrebljivom na TS-u. Al opet, to je moje licno vidjenje stvari, nikad nisam dozivljavao winforms kao canvas za animacije niti mu brojao FPS.


[ deerbeer @ 31.03.2009. 10:01 ] @
http://msdn.microsoft.com/en-u...ms.control.doublebuffered.aspx
Ovo nisam primetio dosad
Izgleda da je dovoljno samo da se setuje DoubleBuffered property u inherited formi.
Kad budem imao vremena probacu da li stvarno radi posao.

Citat:
X Files: ^
Zabranjeno je koristiti C/C++ fazone Salim se...

Obecavam da se nece ponoviti na .NET forumu

Evo nadjoh link na codeproject-u koji radi ovo sto sam opisao (doduse sa ListView kontrolom),
pa pogledajte u komentarima dole jedan se javio i rekao je da mu radi sa DoubleBuffer propertyijem.
http://www.codeproject.com/KB/...;view=Quick&select=1502455
[ X Files @ 31.03.2009. 10:17 ] @
^
Slažem se sa oba prethodna posta.

U par navrata u prošlosti sam morao da se pozabavim DoubleBuffering-om, jer je interfejs izgledao nepodnošljivo očajno (radilo se o nekakvom crtanju preko bitmape u pozadini + štošta još). Jednom mi je već ugrađeni mehanizam pomogao, a jednom nije.

Verovatno su ugradjeni DoubleBuffering mehanizmi tu tek da završe posao za opšte slučajeve, a za ozbilnije stvari treba implementirati konkretnu logiku ili koristiti propisnu GDI tehnologiju.
[ mkaras @ 31.03.2009. 11:32 ] @
Pre osvežavanja forme lepo je zaključaš,odradiš šta treba i otključaš formu. Nema neprijatnog treptanja i ostalih neprijatnih vizuelnih efekata.



[Ovu poruku je menjao mkaras dana 01.04.2009. u 02:33 GMT+1]
[ mmix @ 31.03.2009. 11:46 ] @
To je vec uradio (LockWindowUpdate). Problem je sto njegov ceo form redraw ciklus traje duze od refresh rate-a.
[ mkaras @ 31.03.2009. 12:09 ] @
Treba koristiti ono što je već ugrađeno u samu formu a to je form.locked svojstvo. Ništa više i sve lepo radi.

[Ovu poruku je menjao mkaras dana 01.04.2009. u 02:32 GMT+1]
[ mmix @ 31.03.2009. 12:26 ] @
Mislim da si promasio forum i temu, .NET forms nemaju locked property, to je Office (Access/Excel/Word) property.
[ mmix @ 31.03.2009. 13:26 ] @
a) Locked nije Form property, iako ti lici da jeste, to je property koji je extendovan u form-u od strane VS dizajnera i ne postoji van VS-a u runtime-u i forma ga uopste ne koristi ni za sta (vidi b). Metadata info za Forms klasu imas ovde gde mozes i videti da nema locked property-a.

b) Taj property uopste nema veze sa suspendovanjem redraw-a niti sa bilo kojim internim procesima u formi. Taj property jednostavno kazuje VS dizajneru da su pozicije i velicine forme i kontrola "fiksirane" dok je property true. Prebaci na true pa probaj da resizujes formu pa ces videti o cemu se radi.
[ Dejan Stojanovic @ 01.04.2009. 08:00 ] @
Probao sam native dubble buffering i za pojedine stvari radi kako treba ali za neke i dalje svicka.

Recimo kontrole koje sam napomenuo koje imaju gradient na sebi, kada menjam background, border i uradim refresh, ne javlja se svickanje, ali dodavanje samih kontrola i dalje ne izgleda mnogo dugacije.

Nisam imao mnogo vremena da ispitam sve primere koji su ovde postovani, neke koje sam isprobao nisu mi zavrsavali posao.

Isprobacu jos pa cu dati konacan odgovor kako ovaj problem za koji mislim da mnoge muci koji rade na interfejsu windows aplikacija.

U svakom slucaju hvala na upucivanju sta treba da trazim za resenje ;)