Vcl封装Win32的标准控件后,是如何处理消息的呢?我们能否先于“标准控件”得到消息呢?
比如ComboBox的CB_SHOWDROPDOWN消息,然后就可拦截了?
DELPHI的消息处理过程为:MainWndProc
    |
WndProc
    |
Dispatch
    |
Message Handler
    |
Method
    |
Event Handler誰给说下,是怎样,在什么地方将消息传递给控件的原消息处理函数的?还有如将Win32的标准控件
子蕊化后要不要处理WM_PAINT消息?3Q

解决方案 »

  1.   

    标准的控件都有一个系统预制的原始的窗口回调函数
    虽然VCL对这些控件的回调函数进行了替换,但最后还是调用了原始的窗口回调函数,你可以好好看看inside VCl
    在TWinControl.DefaultHandler中的
    Result := CallWindowProc(FDefWndProc, FHandle, Msg, WParam, LParam);
    就是调用原始的窗口回调函数
    有些消息是必须要在这些原始的窗口回调函数中处理的,比如Wm_Paint,否则就会出现错误。
    你可以通过子类化拦截处理wm_paint消息从而绘制不同的控件,但必须在Callwindowproc后(VCL中必须在inherited后),否则控件还是原始模样,缺陷是控件被绘制了两次,很费资源。好一点方法就是用OwnerDraw拦截Wm_Drawitem消息进行处理。