谁在Winforms控件中调用On <something>方法?

2 events winapi winforms

我对Winforms的架构很感兴趣.我试图理解的一件事是事件处理.在一个方面,我们有一大堆的保护的On-方法(OnPaint,OnMouseDown在等)Control类.另一方面,我们有一个WndProc功能.但是中间是什么?谁实际上称这些受保护的方法?

Han*_*ant 7

大多数开始作为Windows消息,或者投递到消息队列与PostMessage的(如WM_KEYDOWN =>的onkeydown,WM_LBUTTONDOWN => onmousedown事件),或者直接与SendMessage消息发送给窗口过程(如WM_ACTIVATE => OnActivate,WM_SHOWWINDOW =>的OnLoad) .

当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符合该类别.

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