Przekazywanie komunikatów

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.

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/

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.

0

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

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?

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

0

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

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.

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.

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