Przekazywanie komunikatów

Przekazywanie komunikatów
NO
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 13 lat
  • Postów:8
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
KR
  • Rejestracja:prawie 16 lat
  • Ostatnio:6 miesięcy
  • Postów:2514
0

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

Kopiuj
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
NO
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 13 lat
  • Postów:8
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
Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 12 lat
  • Postów:7923
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
NO
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 13 lat
  • Postów:8
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?

Misiekd
  • Rejestracja:ponad 21 lat
  • Ostatnio:ponad 12 lat
  • Postów:7923
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
0

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

SZ
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 6 lat
  • Postów:107
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.

olesio
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.
SZ
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ę.
NO
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 13 lat
  • Postów:8
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.