请教:Tbutton有自己的窗口函数吧,当鼠标点击了Button,那么执行的是Tbutton的窗口函数,还是Tform的?(100)

  • 主题发起人 主题发起人 teleman2000
  • 开始时间 开始时间
T

teleman2000

Unregistered / Unconfirmed
GUEST, unregistred user!
请教:Tbutton有自己的窗口函数吧,当鼠标点击了Button,那么执行的是Tbutton的窗口函数,还是Tform的?当点击一个按钮时,到底发生了什么?谢谢!
 
Tbutton是个类
 
看了一个资料,大体的过程是:按下button后,产生消息后,这个消息被form的窗口函数截获,被tform.wndproc处理,tform.proc没有处理这个消息的方法,就向祖先类中寻找,最后到了Tcontrol类后,tcontrol.wndproc把这个消息dispatch了。dispatch后,在form中看有没有处理这条消息的动态方法,结果form中没有,就找父类,一直找到twincontrol.最后,通过twincontrol这个桥梁,把按钮按下这个事件跟自己写的代码连接了起来。希望大家再讨论讨论,畅所欲言,知无不言,言无不尽。
 
TButton 与 TForm 都是以 TWinControl 为祖先的, 但 TButton 与 TForm 并没有直接的关系, 各自都有 THandle, 也就是各自都可以 接收,处理 Windows 消息.
 
liuls的解释好像与我看的材料矛盾。到底哪个对呢?tbutton有自己的回调函数吗?
 
消息先发给application,然后发给button类,然后一层层的发给父类处理消息,然后发给父窗口,再一层层的发给父类处理消息,然后发个commend消息给button类,然后执行click方法,click方法里调用onclick过程,cnclick过程是指向form的button1click的,所以最终调用form1.onbutton1click
 
当然是Tbutton的,因为继承后最后通过Inherited;直接调用Tbutton的消息处理
 
从程序Application.Run开始,Application就接管了程序的所有的消息,就像hs-kill所说,如果在上层没有处理,application会调用DefWndProc来往下分发,直到找到所关联的事件,如果都没有处理,会调用Windows默认的处理。
 
可以查一下IsControlMouseMsg的实现,这个负责将主窗口消息派发到放置的子窗口上去的。所以点击的时候,是先执行Form的WndProc,然后被分发进入到Button的WndProc的。
 
Tbutton 继承自TButtonControlTButtonControl继承自TWinControlTForm 继承自TCustomFormTCustomForm继承自 TScrollingWinControlTScrollingWinControl继承自TWinControl都以TWinControl 为祖先的,而TWinControl又继承自TControl,窗口过程wndproc是在此定义的,然后TWinControl又重写此过程,overwrite(覆盖) TControl的wndproc过程~~~
 
有朋友能详细解释一下这个过程吗?
 
从程序Application.Run开始,Application就接管了程序的所有的消息,就像hs-kill所说,如果在上层没有处理,application会调用DefWndProc来往下分发,直到找到所关联的事件,如果都没有处理,会调用Windows默认的处理。其实就是一个消息处理。发送消息,软件接受,如果没有处理函数就继续传给系统。你在vc中,创建一个窗口引用程序,然后看他的源代码。这个过程会表示的很清楚。
 
当TBUTTON生成按钮的时候,会调用twincontrol的create方法,在TWinControl.Create中会创建窗口回调函数。FobjectInstance := Classes.MakeObjectInstance(MainWndProc);以上是不是说按钮(button)也在windows系统里面注册了供系统调用的回调函数呢?当一个按钮(button)按下去的时候,就会产生消息,那么这个消息就进入了application的消息队列,是这样吗?application是通过dispatchmessage这个API将消息进行处理分发。在分发的时候,有BUTTON的handle,有消息的编号,那么是不是应该DispatchMessage就应该直接发到button的回调函数MainWinProc处理呢?如果上面的是成立的,那么就是说当点击按钮(button)的时候不会传到button所在的form的回调函数处理。是这样吗?期待大家答疑解惑,谢谢!
 
后退
顶部