procedure TForm1.btnCancelClick(Sender: TObject); begin Close; end;
procedure TForm1.btnRegisterClick(Sender: TObject); begin ShowMessage(''''Thx for ur registration.''''); end;
procedure TForm1.WMCommand(var Message: TWMCommand); begin if Message.NotifyCode = BN_CLICKED then if FindControl(Message.Ctl) = btnRegister then begin btnRegisterClick(Self); Exit; end; inherited; end;
end.
这个方法的本质就是截获 TForm1 的 WM_COMMAND 消息并自己处理,请自行分析代码,我就不多说了。编译完后你可以用 DEDE 反汇编一下,看看还能不能那么容易地找到 TForm1.btnRegisterClick 的入口地址。
结束语 VCL 消息机制你理解了吗?是不是感到特别复杂?一个消息往往要经过10几个方法才能传到 Event Handler,别看消息传递经过这么漫长的路途,但是 VCL 消息机制的效率还是非常高的,因为很多关键的代码都是用汇编直接写成的,每一个中途站花费的时间也非常少,因此需要处理的消息还是能很快地到达目的地。 我最开始学 Windows 编程是从 SDK 开始学起的,那时候会写了基本的 Windows 程序,一段时间内总认为会 SDK 比会用 Delphi 牛X,现在想起来真傻,比起直来直去的 SDK 编程,VCL 消息机制要复杂得多得多,看完 VCL 源码后最大感受就是觉得以前跟没学过编程似的,但不可否认的是,只有在你掌握了 OOP/ASM/SDK 这些基础知识后,你才有看懂 VCL 源码的资本,这些基础知识你都掌握了吗?
参考文献
1. 李维.《深入核心 -- VCL架构剖析》第四、五章,2004.1
2. savetime."Delphi 的消息机制浅探", Jan 2004
3. cheka."VCL窗口函数注册机制研究手记,兼与MFC比较", 2001
上一页 [1] [2] |