Jak przechwycić w formie zdarzenia klikniecia dzieci ?

0

Jak przechwycić w formie zdarzenia kliknięcia dzieci ? Chodzi mi jednak o to by nie dodawać funkcji zdarzeń rodzica do zdarzeń dziecka.

0

Jeśli piszesz w winforms, to na CodeProject jest ciekawe rozwiązanie: http://www.codeproject.com/Articles/13216/Broadcasting-Events-through-a-Control-Hierarchy Ale ja bym na Twoim miejscu się przede wszystkim upewnił, czy faktycznie trzeba tak komplikować życie, czy może da się prościej okienko zaprojektować.

0

wow , zbyt skomplikowane , myślałem że da się prościej trochę

0

Witam

Wg mnie pewnie da się jeszcze to zrobić za pomocą WinApi

w formie przeciążyć metodę WndProc i sprawdzać czy dany message danego typu wędruje do danego dziecka, jeśli tak to należy go wyłapać i obsłużyć. Wg mnie to rozwiązanie powinno być łatwiejsze niż kombinowanie z relflection.Emit

0
oh_oh_oh napisał(a)

Witam

Wg mnie pewnie da się jeszcze to zrobić za pomocą WinApi

w formie przeciążyć metodę WndProc i sprawdzać czy dany message danego typu wędruje do danego dziecka, jeśli tak to należy go wyłapać i obsłużyć. Wg mnie to rozwiązanie powinno być łatwiejsze niż kombinowanie z relflection.Emit

Dzięki! Kiedyś głowiłem się nad takim samym problemem (w końcu przebudowałem trochę (uprościłem) logikę i nie potrzebowałem kombinować, ale mniejsza o to) i właśnie mi uświadomiłeś, że można to zrobić faktycznie dużo prościej:

  1. wydaje mi się, że wszystkie kontrolki w .net mają własne wndproc, więc nie będą przekazywać komunikatów "w górę"
  2. Ale jest taki fajny komunikat, który się nazywa WM_PARENTNOTIFY (=0x0210) . Czyli, jeśli wystarczy reakcja na L/R/MBUTTONDOWN, to taki kod
        const int WM_PARENTNOTIFY = 0x0210;
        const int WM_LBUTTONDOWN = 0x0201;

        // dwie poniższe funkcje ukradzione z http://www.codeproject.com/Forums/1649/Csharp.aspx?select=635353&tid=635328
        public static short LoWord(int n)
        {
            return (short)(n & 0xffff);
        }
        public static short HiWord(int n)
        {
            return (short)((n >> 16) & 0xffff);
        }

        protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case WM_PARENTNOTIFY:
                    int submsg = LoWord(m.WParam.ToInt32());
                    int x = LoWord(m.LParam.ToInt32()),
                        y = HiWord(m.LParam.ToInt32());
                    if (KONTROLKA_RODZIC == GetChildAtPoint(new Point(x, y)))
                    {
                        //tu reakcja
                    }
                    break;
            }
            base.WndProc(ref m);
        }

w kodzie rodzica tej kontrolki "najniżej", do której mają docierać komunikaty, załatwia sprawę. Naturalnie, jeśli nie możesz z jakichś powodów modyfikować kodu kontrolki (tzn. nadpisać wndproc), to zawsze możesz użyć SetWindowLong/GetWindowLong.

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