什么是较低级别的事件



>假设有一个简单的窗口,其中包含用高级语言(如 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 事件。

一方面 - 是的,ButtonClick 事件是消息循环和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# 事件只不过是一个回调例程 - 你注册一个回调,实现类在发生有趣的事情时调用它。

相关内容

  • 没有找到相关文章

最新更新