【发布时间】:2015-10-15 08:57:02
【问题描述】:
当我们单击鼠标并在 .NET 程序中触发 MouseClick 事件时,计算机如何知道我们单击了按钮边界中的正确点?
我的意思是幕后发生了什么,为什么我们不需要实现它?
【问题讨论】:
当我们单击鼠标并在 .NET 程序中触发 MouseClick 事件时,计算机如何知道我们单击了按钮边界中的正确点?
我的意思是幕后发生了什么,为什么我们不需要实现它?
【问题讨论】:
基本上这就是Windows UI framework named User32 为您做的事情。另见MSDN: Windows and Messages。
此框架通过让您的应用程序实现从 Windows 接收消息的“消息泵”来工作。消息可以是“鼠标刚刚移过这个窗口”或“鼠标按钮被按下”。请注意,“窗口”不仅仅是形式意义上的“窗口”,请务必阅读 MSDN 链接。一个按钮也是一个窗口。
所以:
现在 .NET 的 WinForms 为您包装了这个消息泵,并将消息公开为您可以订阅的事件。您可以通过overriding WndProc() on your control of coice 看到它的实际效果:
protected override void WndProc(ref Message m)
{
Console.WriteLine(m);
base.WndProc(ref m);
}
更深入地(来自MSDN: About Messages and Message Queues),Windows 消息使用句柄与窗口(或 WinForms 术语中的“控件”)相关联。此句柄唯一标识一个控件。
通过这种方式,WinForms 知道带有句柄 X 的 mouse message 是用于带有该句柄的控件 Y,因此它会在收到该消息时引发 MouseClick 或相关事件。
【讨论】:
跟踪鼠标位置和状态由操作系统本身处理,当鼠标移动/点击/等时,会有一大堆输入标志发送到应用程序。您将在 C++ 或 C 应用程序 (See Here) 中使用的相同窗口 WM_LBUTTONDOWN 和 WM_LBUTTONUP 事件被 .Net 框架拦截并转换为我们都知道和喜爱的单击事件。这一切都由框架本身处理,我不知道它以一种有效的方式将它们转换为“点击了这个特定按钮”的具体细节,但归根结底,这真的无关紧要。
您不需要实现它,因为 .Net Framework 及其 UI 元素的开发人员意识到每个人都需要为按钮实现该功能,我们也这样做了。
【讨论】:
Windows 使用消息传递模型。操作系统通过向其传递消息来与您的应用程序窗口进行通信。消息只是指定特定事件的数字代码。例如,如果用户按下鼠标左键,则窗口会收到一条带有以下消息代码的消息。
有些消息有与之关联的数据。例如,WM_LBUTTONDOWN 消息包含鼠标光标的 x 坐标和 y 坐标。
为了向窗口传递消息,操作系统调用为该窗口注册的窗口过程。 (现在你知道窗口过程是干什么用的了。),关于模式详情你可以阅读这篇文章,Window Messages
【讨论】: