Mam dwa pytania.Metoda C# Override w Runtime
1) Znalazłem mały klejnot kodu dla how to make a control scroll smoothly.
Świetnie. Ale to nadpisuje metodę WndProc, więc aby z niej skorzystać, musiałem wyrwać FlowLayoutPanel, który upuściłem na formularzu w czasie projektowania, podklasę FlowLayoutPanel, a następnie w końcu utworzyć moją nową klasę i ręcznie utworzyć wszystkie właściwości i zmienić wszystkie odwołania do kontroli, aby to było. Controls ["ControlName"]. (Chyba mógłbym stworzyć zmienną na poziomie klasy, która jest zasadniczo tym, co pierwotnie było formantem, ale jak pozwalają na użycie intellisense, gdy nie jest nigdzie zadeklarowana?)
Więc teraz zastanawiam się, czy istniał sposób, aby to zrobić.
Czy mogę zrobić coś prostego, jak ten, gdzie MainPanel to nazwa kontrolą:
MainPanel = (SmoothScrollingFlowLayoutPanel)MainPanel
To nie może być takie proste, prawda? Mimo to, jest to denerwujące, ponieważ wciąż muszę mieć podklasę (co może być dobrą decyzją projektową, ale chciałbym mieć możliwość jednorazowego wykorzystania). Więc byłoby to możliwe, aby umieścić kod do rodzica coś FlowLayoutPanel tak:
private Delegate void WndProcHandler(ref Message m);
private WndProcHandler w;
public void SomeCode() {
w = MainPanel.WndProc; // get reference to existing wndproc method
MainPanel.WndProc = WndProcSmoothScroll; //replace with new method
}
private void WndProcSmoothScroll(ref Message m) { // make smooth scrolling work
if (
(m.Msg == WM_HSCROLL || m.Msg == WM_VSCROLL)
&& (((int)m.WParam & 0xFFFF) == 5)
) {
m.WParam = (IntPtr)(((int)m.WParam & ~0xFFFF) | 4);
}
if (w != null) { w(); }
base.WndProc(ref m);
}
Zdaję sobie sprawę, jest to chyba dość naiwny. Traktuję metodę WndProc tak, jak to jest wydarzenie, a nie jest.
2) Więc moje drugie pytanie brzmi: jeśli WndProc byłby wydarzenie zamiast metody, jak zrobiłbym to samo - przechowywać kopię oryginalnej listy procedur obsługi zdarzeń, zainstalować własne wydarzenie obsługi do uruchomienia, a następnie wywołanie wszystkich oryginalnych procedur obsługi zdarzeń?
TASTY BITS
W przypadku gdy ktoś jest zainteresowany zauważyłem optymalizację możliwe w gładkiej kodu przewijania:
//m.WParam = (IntPtr)(((int)m.WParam & ~0xFFFF) | 4);
m.WParam = (IntPtr)((int)m.WParam^1);
Ponieważ chcemy, aby włączyć ostatnie 16 bity od 5 do 4, my można po prostu odwrócić ostatni bit (XOR) zamiast AND, a następnie LUB.
Dziękuję Zach, ale już osiągnąłem sprawne przewijanie okien. Po prostu nienawidziłem tego, jak musiałem oderwać kontrolę od projektanta i robić wszystko dynamicznie. – ErikE
@Emtucifor: Nie ma problemu, chciałem tylko poinformować, że nie musicie dziedziczyć po 'FlowLayoutPanel', aby nadpisać jego' WndProc'. –
Och, teraz rozumiem. Dzięki. Przyznaję, że nie czytałem tak uważnie, jak powinienem. Jest to przydatne! W rzeczywistości masz 100% racji, to jest odpowiedź, której szukałem. (uderza czołem) – ErikE