关于VCL消息(应该是窗口子类化问题)(200)

  • 主题发起人 主题发起人 newnewer
  • 开始时间 开始时间
N

newnewer

Unregistered / Unconfirmed
GUEST, unregistred user!
最近在看李维的那本vcl,很不理解,vcl的每个windows组件都调用了MakeObjectInstance设定窗口函数,好像每个新创建的组件都重新注册一个窗口类(窗口类我指的是调用Windows.RegisterClass()注册的),然后都设定了自己的窗口回调函数?这样子,产生了消息就直接到了组件注册的回调函数?我看原生的windows程序,只有一个窗口回调函数,然后创建原生的button,edit控件的时候,也不需要窗口类!这我就不理解了,vcl控件产生消息后,是到了唯一的一个窗口回调函数,然后分配到各个控件注册的回调函数,还是,直接分配到了各个控件注册的回调函数。是怎么分配的,代码在哪?这里李维好像没有说清楚,当然,最有可能是我没有理解了,没找到地方!___________________________________翻了翻dfw的离线包,这个问题,好像就是窗口子类化。一个windows控件创建后,就有了一个handle,使用setwindowlong(handle,,),就可以重新设定这个控件的处理函数嘛?貌似delphi在创建新控件的时候,都会给这个控件注册一个新的窗口类,这是为啥?______________________________CreateWindowex()的第一个参数就是已经注册的窗口类啊,button,edit等控件,是windows已经注册好的类所以可以直接用的。要是这样理解的话,那就应该是消息直接发送到各个控件了吧?_________________________________书的第四章消息机制,来回看了5遍了,还是似懂非懂的......哎。。。。。。,虽然是4,5年前的书了___________________________________________________________________
 
直接分配到了各个控件注册的回调函数,请查看TObject.Dispatch过程-------------setwindowlong相当于设置windows窗口的回调函数-----------------windows中的button和Delphi中的button不是一个东西,Delphi中的button是在创建一个windows中的button基础上,另外添加了一些属性、事件,在创建windows.Button后,设置回调函数,回调函数中,根据消息来调用我们delphi编写的函数。---------那本书讲得确实比较深,我也没完全理解,楼下有高人,请继续补充。
 
此外,如果你对windows消息看的比较累的话,可以看一下TTimer是怎么处理消息的,该控件也是创建一个windows类,在TTimer.UpdateTimer;函数中,调用windows.SetTimer函数,用以设置windows每隔一定的时间给该窗口发送一个WM_TIMER消息,消息的处理在TTimer.WndProc函数中。
 
TObject.Dispatch只是涉及delphi的东西,不关系windows的机制吧??我知道windows中的button和Delphi中的button不是一个东西,windows的button是不是M$事先调用Windows.RegisterClass注册过的??
 
学习一下。
 
使用setwindowlong,可以修改tmemo的handle,为新的窗口过程,并且确实可以在新的过程中收到消息。这是不是就说明了,每个控件都注册了一个窗口过程???
 
这个问题应该是windowsSDK编程问题,似乎楼主对此不太熟悉,当然我也不熟悉,这是我的个人看法而已。
 
其实不是也是. 控件(TControl 及其子类), 与组件 (TComponent) 最大的区别就是: 控件有一个接收 Windows 消息的 THandle! 但并不是所有具有 THandle 组件都是可视的;如你可以自行为你的类分配一个 THandle:THanldeObject = class(TObject)private FHandle: THandle; procedure WndProc(....); // 把处理 FHandle 的回调函数关连上public // ... property Handle: THandle read FHandle write FHandle;end;这样你也可以用 Send(THanldeObject().Handle, ...), Post(THanldeObject().Handle, ...) 发送消息了~
 
后退
顶部