У меня есть два вопроса.Метод переопределения C# в Runtime
1) Я нашел небольшой драгоценный камень кода для how to make a control scroll smoothly.
Отлично. Но он переопределяет метод WndProc, поэтому для его использования мне пришлось вырвать FlowLayoutPanel, который я сбросил на форму во время разработки, подкласс FlowLayoutPanel, а затем, наконец, создаст экземпляр нового класса и создаст все свойства вручную и изменим все ссылки для элемента управления this.Controls ["ControlName"]. (Или, я думаю, я мог бы сделать переменную уровня класса, которая по сути является тем, что первоначально был элементом управления, но как они позволяют вам использовать intellisense на нем, когда он не объявлен нигде?)
Так что теперь мне просто интересно, на самом деле это был способ выполнения.
Могу ли я сделать что-то простое, как это, где MainPanel это имя элемента управления:
MainPanel = (SmoothScrollingFlowLayoutPanel)MainPanel
Это не может быть так просто, не так ли? Тем не менее, это раздражает, потому что я все еще должен иметь подкласс (который может быть хорошим дизайнерским решением, но я бы хотел, чтобы он был свободен от него). Так было бы возможно поместить код в родителю FlowLayoutPanel что-то вроде этого:
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);
}
Я понимаю, что это, вероятно, довольно наивно. Я рассматриваю метод WndProc как событие, и это не так.
2) Итак мой второй вопрос, если WndProc было события вместо метода, как бы я сделать то же самое, сохранить копию исходного списка обработчиков для события, установить свое собственное событие обработчик для запуска сначала, а затем вызвать все исходные обработчики событий?
ВКУСНОГО BITS
В случае, если кто заинтересован я заметил оптимизацию возможной в гладкой коде прокрутки:
//m.WParam = (IntPtr)(((int)m.WParam & ~0xFFFF) | 4);
m.WParam = (IntPtr)((int)m.WParam^1);
Поскольку мы хотим превратить последние 16 бит от 5 до 4, мы может просто перевернуть последний бит (XOR), а не AND, а затем OR.
Спасибо, Зак, но я уже сделал, чтобы мои окна прокручивались плавно. Я просто ненавидел, как мне пришлось вырвать контроль над дизайнером и сделать все динамично. – ErikE
@Emtucifor: Нет проблем, я просто хотел сообщить вам, что вам не нужно наследовать от 'FlowLayoutPanel', чтобы переопределить его' WndProc'. –
О, теперь я понял. Благодарю. Признаюсь, я не читал так тщательно, как должен. Это полезно! На самом деле, вы на 100% прав, это ответ, который я искал. (ударяет лоб) – ErikE