【问题标题】:Who calls the On<something> methods in the Winforms controls?谁调用 Winforms 控件中的 On<something> 方法?
【发布时间】:2014-08-11 07:00:51
【问题描述】:

我对 Winforms 的架构很感兴趣。我试图理解的一件事是事件处理。一方面,我们在Control 类中有一堆受保护的On 方法(OnPaintOnMouseDown 等)。另一方面,我们有一个WndProc 函数。但是中间是什么?谁真正调用了这些受保护的方法?

【问题讨论】:

  • 基于通过WndProc收到的窗口消息控制类本身调用这些方法。
  • WinForms 框架将窗口消息映射到事件

标签: winforms winapi events


【解决方案1】:

大多数以 Windows 消息开始,要么使用 PostMessage 发布到消息队列(如 WM_KEYDOWN => OnKeyDown,WM_LBUTTONDOWN => OnMouseDown),要么使用 SendMessage 直接发送到窗口过程(如 WM_ACTIVATE => OnActivate,WM_SHOWWINDOW = > 加载)。

这些消息在 Application.Run() 消息循环调用 GetMessage() 并由 Control.WndProc() 处理时调度。它基本上包含 Message.Msg 上的大型 switch 语句。从 Control 派生的类具有自己的 WndProc() 覆盖来处理特定于它们包装的本机 Windows 控件的消息。与 TreeView 一样,TVN_SELCHANGING => OnBeforeSelect。

还有一些是Winforms自己合成的。从您的代码中分配一个属性,如 AutoSize => OnAutoSizeChanged、BackColor => OnBackColorChanged、Parent => OnParentChanged。可以对其他控件产生副作用的属性。

还有一些是从 Winforms 在普通 Windows 消息之上构建的状态合成的,OnEnter、OnLeave、OnValidating、OnLayout 适合该类别。

这涉及大量代码,但这是它的粗略轮廓。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 2011-04-24
    • 2010-10-18
    • 2014-06-22
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多