对于标准的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例子?

===============>>#1 票数:3 已采纳

当然,基本机制是一样的。 但是,Winforms(以及某种程度上的WPF)显着改变了消息路由。 在Windows中,子控件将通知发送到其父窗口。 Winforms管道通过窗口子类和消息反射的混合来改变,使代码在控件本身中运行。 例如,一个按钮的OnClick()方法。

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

===============>>#2 票数:1

那是另一种方式。

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

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

  ask by Niklas translate from so

未解决问题?本站智能推荐: