Animowany MenuItem

0

Przyszedł mi do głowy pomysł aby zrobić animowany item w popupmenu.

Czy ktoś może wie w jaki sposób mogę w określonym intervale np co 1/10 sekundy przerysowywac itemka tak by grafika sie na nim zmieniala.

Probowalem z ownerdraw ukrasc ACanvas przez przypisanie go zmiennej globalnej AACanvas := ACanvas w onDrawMenuItem
i pozniej timerkiem przerysowac tak ukradziony canvas. Niestety konczy sie to access violationem.

Myslalem zeby podpiac pod timerka wiec przerysowywanie danego konretnego MenuItem gdy menu jest rozwiniete. Niestety nie potrafie tego zrobic. Nic mi nie przychodzi do glowy. Jedyne co to popupmenu1.popup Animacja niby jest ale to jest kompletnie bez sensu.

Prosze o pomoc.

0

W timerze powinieneś tylko nakazać przerysować kontrolkę, a OnDrawMenuItem powinno "wiedzieć", którą klatkę animacji teraz rysuje.

0

cos takiego
Animowana pozycja w menu

0

Witajcie. Korzystając z waszych rad muszę powiedzieć że już prawie mi się udało.

w ownerdraw DrawMenuItem dałem MirrorCanv := WindowFromDC(ACanvas.Handle);
A następnie w procedurze paint mojego obrazka (zmianiającego się dynamicznie dałem):

mcanv.Handle := GetDc(MirrorCanv); //(mcanv to jest TCanvas;)
mcanv.Draw(0,0,ScreenImage);

Wszystko się pięknie rysuje na okienku menu.

Ale niestety zaistniał dalszy problem.
WindowFromDC w DrawMenuItem zwraca 0 jeśli jest wykonywane podczas rysowanie poszczegolnych itemow.
(okienka menu jeszcze wtedy jak mysle nie ma - dlatego)
Natomiast zwraca wartosc okienka menu wtedy gdy jest wywolywane (przez wybór kursorem z menu) na narysowanym juz istniejacym menu .

Tak wiec gdy rozwinie sie okno menu - aplikacja nie dysponuje jego handlem i nie moze nic narysowac :(
dopiero gdy user wzbudzi menu tzn zacznie przesuwac po nim myszke aplikacja uzyskuje odpowiedni handle i wszystko od tej chwili az do zamkniecia menu (okienko sie gubi i handle jest niewlasciwy) dziala.

Czy da sie jakoś uzyskać handle okienka menu tuż po jego utworzeniu tak żeby nie było to powiązane z DrawMenuItem? Próbowałem zrobić to Timerkiem ale bez powodzenia. Może jest jakaś notyfikacja w windproc? Proszę pomóżcie

0

Daj wiecej kodu ....

to co przedstawilem dziala jak sie nie najedzie na dana pozycje menu. Jak masz ich wiecej (tych animowanych) to po prostu musisz wiecej elementow pilnowac.

A i uwaga, ze jak nie ma menu to albo sie lapie wyjatek, albo maluje samym WinApi (gdy blad to wypad z funkcji), albo klasa dziedziczac po TCanvas.

0

Wiem jak zmodyfikowac kod zeby osiagnac to co zamierzam - graficznie.

Najwiekszym moim problemem jest w tym momencie, i tu musze prosic was o pomoc.
Uzyskanie uchwytu do okienka menu w momencie gdy jest on wyswietlane na ekanie (tuz po utworzeniu okienka lub jego wyswietleniu)

Uzyskiwanie uchwytu po przez WindowFromDC(ACanvas.Handle) w procedurze onDrawMenuItem z OwnerDraw jest skuteczne tylko kiedy procka jest wywolywana na juz wyswietlonym menu, w momencie gdy jest wywolywana jeszcze podczas wstepnego rysowania elementow - menu nie ma jeszcze swojego okienka. Funkcja ta zwraca zero, skutecznie uniemozliwiajac narysowanie mojej grafiki na okienku menu.
Wyglada na to ze onDrawMenuItem wywolywane jest najpierw na sucho (gdy okienko jeszcze nie istnieje) i rysowane sa tam wszystkie elementy a dopiero pozniej okienko jest wyswietlane. Po jego wyswietleniu funkcja ta wywolywana jest tylko jesli uzytkownik wykona jakas operacje na menu (np. najechanie, klikniecie)

Chodzi mi w tym momencie o to w jaki sposob mozna uzyskac uchwyt okienka tuz po jego wyswietleniu tak by moc go przekazac do mojego watku rysujacego animacje.

Nic mi nie przychodzi do glowy wiec prosze was o pomoc. Warto rowniez dodac ze swoj efekt pragne uzyskac nie w mainmenu ale w popupmenu. Pozdrawiam

0

Piszesz znowu to samo ...

Podaj swoj scisle tajny kod, mozesz go okrojic (np aniamacja to zmiana kolorow).
Pokaz co tobie nie dziala.

Wyraznie napisalem, ze moze zajsc taka sytuacja, ze timer dziala a menu juz zniklo (dlatego lapie wyjatek - to najprostsza metoda a zarazem najbrzydsza).

Wybrobowalem ten kod z popupmenu, dziala. Uchwyt nie moze byc zly w ownerdraw (na sucho) bo to sie by mijalo z celem. Jak wyswietlasz to menu ? Co znaczy bez akcji usera? Ja nie musze nic robic aby animacja dzialal (najechac, kliknac).

Przedstaw swoj problem w jakies bardziej czytelnej formie (kodu i miejsca gdzie jes zle).

A i jescze
muskcp: OwnerDraw jest skuteczne tylko kiedy procka jest wywolywana na juz wyswietlonym menu

a jak ma byc skuteczna na niewidocznym/nieistniejacym menu? Mozesz to wyjasnic?

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