>假设有一个简单的窗口,其中包含用高级语言(如 C#)创建的单个按钮。此按钮具有具有关联处理程序的 onClick 事件。一旦编译完成,幕后会发生什么?在基本层面上,它是否生成一个 Windows 消息循环,该循环调用 GetMessage 函数,解码和读取它,然后处理/重新路由它?类似于以下 MFC 示例?
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) {
if (bRet == -1) {
// handle the error and possibly exit
}
else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Windows GUI 的所有事件是否只是WM_样式消息的解码和修改版本?
编辑:很抱歉造成混乱,我试图将其理解为操作系统级别的级别。
有两个部分 - CLR(又名 C#)事件与 Windows 消息相比如何,以及Button
如何实现 CLR 事件。
一方面 - 是的,Button
的 Click
事件是消息循环和WM_
消息的包装器:
protected override void WndProc(ref Message m) {
switch (m.Msg) {
case NativeMethods.WM_REFLECT + NativeMethods.WM_COMMAND:
if (NativeMethods.Util.HIWORD(m.WParam) == NativeMethods.BN_CLICKED) {
Debug.Assert(!GetStyle(ControlStyles.UserPaint), "Shouldn't get BN_CLICKED when UserPaint");
if (!ValidationCancelled) {
OnClick(EventArgs.Empty);
}
}
break;
case NativeMethods.WM_ERASEBKGND:
DefWndProc(ref m);
break;
default:
base.WndProc(ref m);
break;
}
}
另一方面,CLR 事件与消息循环和WM_消息无关 - 它之所以如此,只是因为您正在 WinForms 上下文中查看它,WinForms 选择将 WM 消息公开为 C# 事件。
C# 事件只不过是一个回调例程 - 你注册一个回调,实现类在发生有趣的事情时调用它。