Przekazywanie komunikatów

Odpowiedz Nowy wątek
2011-09-09 11:00
0

Witam
Mam problem ideowy jak odpowiednio uruchamiać event.
Zrobiłem własną klasę, która dziedziczy z TScrollBox i dodałem jej możliwość przesuwania skrolami za pomocą przytrzymania i puszczenia środkowego przycisku myszy na podobnej zasadzie jak przy przeglądaniu pdf (łapka).

Następnie do scrollboxa umieszczam kontrolki (odziedziczone po TPanel), którym na zdarzenie przyciśnięcia/puszczenia środkowego przycisku myszy wywołuje zdarzenie Perform dla Parent'a (czyli mojego TScrollBox'a), po to żeby przesuwanie za pomocą skrola myszki działało także gdy użytkownik ma myszkę nad moimi TPanelami, a nie tylko nad gołym TScrollBoxem.

Mam nadzieje, że to co napisałem jest zrozumiałe :).
Wszystko działa ok jak do tej pory, tylko teraz mam problem tej natury, że gdy do paneli dodam np. TLabel na całą powierzchnię mojego TPanel znajdującego się w TScrollBox, to kontrolka TLabel przechwyci zdarzenie kliknięcia środkowym przyciskiem myszy i nie odpali się macierzysty event TScrollBox'a.

Musiałbym zrobić dla TLabel to samo co zrobiłem z TPanel, ale to bez sensu, bo z każdą inna kontrolką, którą położyłbym na TPanel miałbym problem.

Jak takiej sytuacji zaradzić?

Uprzedzam, że nie chciałbym stosować przechwytywania eventu z TFrom, z tego względu, że TScrollBox ma być łatwy do implementacji i działać niezależnie. Wiem, że tak da się łatwo zrobić, ale ten sposób mnie nie interesuje, chce żeby mechanizm był zaimplementowany wewnątrz kontrolki.

edytowany 5x, ostatnio: nonameplum, 2011-09-09 11:02

Pozostało 580 znaków

2011-09-09 12:37
0

możesz spróbować dla każdego z dzieci odpalić:

OldWindowProc : Array of Pointer;
OldWindowProc[i] := Pointer(SetWindowLong(Components[i].Handle,
                                         GWL_WNDPROC,
                                         LongInt(@NewWindowProc)));

// i zdefiniowac nowa funkcje okna jako
function NewWindowProc(h:hWnd; msg: WParam; wp: WParam; lp: LParam): LongInt; stdcall;
begin
// cos sobie nadpisujesz
Result:=CallWindowProc(OldWindowProc[i(* 'i' musisz odczytac z jakies mapy uchwytow okien na nr w tablicy *)],h,msg,wp,lp);
end;

kontenery do delphi: http://sourceforge.net/projects/decal/


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 5x, ostatnio: krwq, 2011-09-09 12:42

Pozostało 580 znaków

2011-09-09 13:42
0

Nie do końca łapie ten sposób. Ale przestudiuje temat.

Znalazłem dość trywialny sposób na obejście tego problemu. Dla mojego nadpisanego TPanel'u ustawiam właściwość Enabled na False. Wtedy z automatu przesyłane są komunikaty od wszystkich dzieci wyłączonego komponentu do pierwszego macierzystego aktywnego komponentu, czyli mojego ScrollBoxa. Problem tylko, że chce mieć aktywny prawoklik dla mojego Panel'u, więc szukam innego rozwiązania.

Ale o taki dokładnie mechanizm mi chodzi właśnie, jak ten który działa w momencie gdy kontrolka ma ustawioną właściwość Enabled na False, przez co przesyła wszystkie komunikaty do kontrolki macierzystej.

edytowany 1x, ostatnio: nonameplum, 2011-09-09 13:58

Pozostało 580 znaków

2011-09-09 13:55
0

to może po prostu hook na mysze załóż


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-09-09 15:28
0
Misiekd napisał(a)

to może po prostu hook na mysze załóż

Ok założe hook'a i rozumiem, żeby przesłać komunikat WM_MBUTTONDOWN tylko do czego?

Pozostało 580 znaków

2011-09-09 15:46
0

nie do końca rozumiesz - jak założysz hooka (np. w konstruktorze kontrolki) to wtedy WSZYSTKIE komunikaty myszy (niezależnie czy jest nad formą czy nie) polecą do procedury obsługi tego hooka (w uproszczeniu). Tam sobie wyfiltrujesz czy jest środkowy wciśnięty i czy mysz jest nad kontrolką czy nie i odpowiednio zareagujesz


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-09-12 15:46
nonameplum
0

Dzięki, założenie hooka i odpowiednie przekazywanie komunikatów do mojego TScrollBox'a rozwiązało mój problem.

Pozostało 580 znaków

2011-09-21 21:05
0

Może też się przyłączę do tematu, gdyż mam podobny problem, a nie chciałbym zaśmiecać forum, zakładając nowe tematy.

Pytanie to kieruję głównie do autora tematu, chociaż jak ktoś inny będzie znał też odpowiedź to ok.
Też chciałbym w swoim własnym scrollboxie (podobnie jak Ty, dziedziczę po TScrollbox) zaimplementować moduł przewijania jak w pdf-ie. Tylko właśnie jak takie coś w miarę zgrabnie napisać?

Pozdrawiam.

nonameplum napisał "założenie hooka i odpowiednie przekazywanie komunikatów do mojego TScrollBox'a rozwiązało mój problem", także załóż globalnego hooka na myszkę, jak to zrobić znajdziesz na mńóstwie stron w google. - olesio 2011-09-21 21:13
hehe, właśnie nie chodziło mi o to, tylko o sam fakt, jak wykonać takie przewijanie na GOŁYM Scrollboxie, ale już jest temat nieaktualny, gdyż trochę pomyślałem i obsłużyłem odpowiednio zdarzenia OnMouseDown/Up/Move . Jak będę chciał wykryć te zdarzenia, nad innym kompoentem w scrollboxie, to sobie z tym poradzę. - Szymonss 2011-09-21 21:19

Pozostało 580 znaków

2011-10-18 12:29
0
Szymonss napisał(a)

Może też się przyłączę do tematu, gdyż mam podobny problem, a nie chciałbym zaśmiecać forum, zakładając nowe tematy.

Pytanie to kieruję głównie do autora tematu, chociaż jak ktoś inny będzie znał też odpowiedź to ok.
Też chciałbym w swoim własnym scrollboxie (podobnie jak Ty, dziedziczę po TScrollbox) zaimplementować moduł przewijania jak w pdf-ie. Tylko właśnie jak takie coś w miarę zgrabnie napisać?

Pozdrawiam.

Przepraszam, że tak późno odpisuję, ale nie zaglądałem na forum. Ale widzę, że już poradziłeś sobie z tematem :) Ja zrobiłem to też poprzez odpowiednie przeliczenia położenia myszki dzięki event'om MouseMove MouseUp i MouseDown :).

Gdybyś potrzebował pomocy z hookiem w celu otrzymania funkcjonalności, o której mowa w tym wątku to służę pomocą.
Pozdrawiam.

edytowany 1x, ostatnio: nonameplum, 2011-10-18 12:31

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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