2

我正在尝试创建 VScroll 控件的子类并拦截WM_VSCROLL消息以做一些事情。在 msdn 和无数文章/论坛上,WM_VSCROLL应该是0x115,即使在 windows 头文件中也是如此。然而等待0x115不会带来任何东西。我意识到它是通过 as0x2115而不是,甚至这篇文章也使用它作为0x2115. 关于它为什么会来的任何原因/解释0x2115?是因为它是一个 WinForms 控件吗?

谢谢

4

1 回答 1

3

是的,这在 Windows GUI 类库中是相当标准的,Winforms 也不例外。本机 Windows 控件(在您的情况下为 ScrollBar)向其父级发送通知。毕竟,它们的设计目的是让他们的父母根据通知采取行动,而不是他们自己。或者换句话说,您希望父窗口滚动。

然而,这与控件类的概念不太兼容,您可以通过覆盖其消息处理和生成来修改其行为。或者就 .NET 中的事件概念而言,任何人都可以订阅 Scroll 事件,而不仅仅是父事件。

这带来了很多好处,但是必须做一些事情才能将 WM_VSCROLL 消息从父级返回到控件。这就是 Winforms 管道处理的问题。它发回消息,但更改消息编号以表明它是反射消息,而不是原始消息。它添加了 0x2000。Winforms 源代码中(假)WM_REFLECT 消息的值。

于 2012-04-26T01:00:24.073 回答