Jak przechwycić w formie zdarzenia kliknięcia dzieci ? Chodzi mi jednak o to by nie dodawać funkcji zdarzeń rodzica do zdarzeń dziecka.
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ć.
wow , zbyt skomplikowane , myślałem że da się prościej trochę
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
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:
- wydaje mi się, że wszystkie kontrolki w .net mają własne wndproc, więc nie będą przekazywać komunikatów "w górę"
- 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.