【问题标题】:How will clr handle standard events in C# compared to c++ for windows controls?与 Windows 控件的 c++ 相比,clr 将如何处理 C# 中的标准事件?
【发布时间】:2011-12-11 19:22:45
【问题描述】:

对于标准的 win32 控件,c# 如何在 clr 的后台处理事件, 说一个按钮:

示例:(c#)

    private void Form1_Load(object sender, EventArgs e)
    {
        button1.Click += (_, __) => { MessageBox.Show("You clicked me !"); };
    }

在主消息循环中是否像 c++ 一样?`

例子:

while (GetMessage(&msg, NULL, 0, 0))
{
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

switch (message)
{

case WM_COMMAND:


    if(hWnd>0 && hWnd==buttonhwnd) //Button click
    {
        callback_button();
    }

default:
    return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

我的意思是 C# 中的所有标准控件都会发送每个信号,例如单击、鼠标悬停、 等到一个模拟循环 - 然后在源代码中注册回调?像我的 lambda 示例一样?

【问题讨论】:

    标签: c# c++ events clr


    【解决方案1】:

    当然,基本机制是相同的。但是,Winforms(以及一些 WPF)显着改变了消息路由。在 Windows 中,子控件向其父窗口发送通知。 Winforms 管道通过混合窗口子类和消息反射来改变,让代码在控件本身中运行。以按钮的 OnClick() 方法为例。

    通过事件订阅,任何其他类都可以从那里接收 Click 事件回调。例如,一个常见的模式是不让放置按钮的面板处理回调,而是让上层表单处理。这为原生 Windows 方式带来了极大的灵活性。

    【讨论】:

      【解决方案2】:

      反之亦然。

      有一个消息循环,用于您的应用程序。我怀疑它在Application 类的某个地方。循环将所有传入的消息分派给 Control 类中某处构建的处理程序。

      然后,内置处理程序检查控件实例是否有附加到事件的委托,如果是,则调用事件。

      【讨论】:

      • 嗯,就像我的意思:)
      猜你喜欢
      • 2010-09-15
      • 2023-03-19
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 2015-06-05
      • 1970-01-01
      相关资源
      最近更新 更多