对于标准的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例子一样?
答案 0 :(得分:3)
当然,基本机制是一样的。但是,Winforms(以及某种程度上的WPF)显着改变了消息路由。在Windows中,子控件将通知发送到其父窗口。 Winforms管道通过窗口子类和消息反射的混合来改变,使代码在控件本身中运行。例如,一个按钮的OnClick()方法。
从那里,通过事件订阅,任何其他类都可以接收Click事件回调。例如,一个常见的模式是不要让放置按钮的面板处理回调而是处理上层表单。这比原生Windows方式具有很大的灵活性。
答案 1 :(得分:1)
那是另一种方式。
有一个消息循环,一个用于您的应用程序。我怀疑它在Application
类附近。循环将所有传入消息调度到Control
类中构建的处理程序。
然后,内置处理程序检查控件实例是否有附加到事件的委托,如果是这样,则调用该事件。