[Koncepcja] Rysowanie po oknie

0

Witajcie, mam takie trochę teoretyczne pytanie. Zamierzam napisać odtwarzacz muzyki, oczywiście w pełni graficzny interfejs, wszystko rysowane bezpośrednio na oknie. I teraz wychodzi pytanie, w jaki sposób to rysowanie rozwiązać. Jak na razie stosowałem timer ustawiony na ok. 50 ms i w nim odmalowywanie całości, ale nie było to rozwiązanie rewelacyjne. Za mały interwał powodował czasem spowolnienie programu, przy zbyt dużym nie wyglądało to ładnie. Szczególnie jak okno programu zostanie przykryte przez coś innego, wtedy zostaje szary ślad (z windows media playerem nie ma takiego problemu). Nasuwa mi się pewne rozwiązanie, żeby większość grafiki rysować po otrzymaniu WM_PAINT, a jedynie dynamiczne elementy (analizator widma, wyświetlacze z przesuwającymi się napisami, czy przyciski, które zmieniły stan) odrysowywać co chwilę. Ale to chyba będzie dość trudne w implementacji i coś mi się wydaje, że grafika może migać (tak, jak bez podwójnego buforowania). Ostatnio czytałem też o 'layered windows' i zastanawiam się, czy nie skorzystać z tego, co one oferują. Mają parę fajnych bajerów, ale nie działają na starszych windach (z tym się jeszcze mogę pogodzić) i nie jestem pewien, czy w ogóle nadadzą się do takich zwyczajnych okienek (gdzieś chyba wyczytałem, że one są zawsze na wierzchu, ale głowy nie dam).

Dobra, koniec tych moich pomysłów i domysłów. Pytanie brzmi, jak to wszystko rozwiązać najlepiej? Proszę o jakieś dobre pomysły. Powinno to działać jak najszybciej i nie powodować żadnych efektów ubocznych typu miganie. Z góry dzięki za odpowiedzi :).

0

Może w obsłudze WM_PAINT odpalać GetUpdateRect i tylko ten fragment odmalowywać.
Natomiast aby zmusić do odmalowania fragmentu odpal ValidateRect z odpowiednim obszarem.

Jednak jeśli chodzi typowo o jakieś histogramy to timer jak najbardziej, gdyż jest to malowanie czegoś co ustalony interwał a nie zwykłe odmalowanie okna.

[do postu poniżej]
oczywiście ręczne podwójne buforowanie to podstawa - nie wspomniałem o tym, bo imo to oczywiste

0

Dobra, koniec tych moich pomysłów i domysłów. Pytanie brzmi, jak to wszystko rozwiązać najlepiej? Proszę o jakieś dobre pomysły. Powinno to działać jak najszybciej i nie powodować żadnych efektów ubocznych typu miganie.

W przypadku (własnych) kontrolek zawsze robię podwójne bufforowanie - cała kontrolka jest malowana na bitmapie, która później w handlerze WM_PAINT kopiowana jest do kontekstu okna (tylko ta część, która wymaga odmalowania). Dodatkowo 'blokuje' komunikat WM_ERASEBKGND co by błysków nie było ;). Przy takim rozwiązaniu nie musisz się martwić o odmalowanie okna podczas np. odsłaniania przez inne.

[do postu powyżej :P]
No nie jest to takie oczywiste - zauważ, że standardowe kontrolki nie są podwójnie buforowane (ot choćby ListView).

0

Spoko, dla mnie podwójne buforowanie to też podstawa ;). Dzięki za odpowiedzi, spróbuję to zastosować i zobaczymy, co z tego wyjdzie. Jak coś, to będę się skarżył, że nie działa :P.

1 użytkowników online, w tym zalogowanych: 0, gości: 1