这种方法好象不行,(我试了一下)
要截获滚动消息.我以前收集了在
论坛中的TIPS顺便贴过来(懒得找)
Message Crack技术,实际上Borland还对不同的消息定义了不同的记录更方便我们处理 如:
procedure WMSize(var SizeMessage: TWMSize); message WM_SIZE;
procedure WMLButtonDblClk (var Msg: TWMLButtonDblClk);message wm_LButtonDblClk;
procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED;
部件能收到什么样的消息,最好查Help关于事件说明如下:事件实际上是函数指针,请看例子:这是Delphi定义的标准事件,不带参数(与普通函数不同的是加上 of Object说明是对象属性)
type
TNotifyEvent = procedure (Sender: TObject) of object;带参数的话:
TScrollEvent = procedure (Sender: TObject; Pos:Integer) of object;
-》可以加任何参数
TSomeObject = class (TCustomcontrol)
pirvate:
FOnScroll: TScrollEvent; ....
procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
->>处理滚行条垂直滚动消息:
published:
Property OnScroll: TScrollEvent Read FOnScroll Write FOnScroll;使用方法:
procedure TSomeObject.WMVScroll(var Message: TWMVScroll);
var
FIncrement:Integer;
begin
if (Message.ScrollBar = 0) then
begin
with Message do
case ScrollCode of SB_THUMBTRACK:
begin
if Assigned(FOnScroll) then
FOnScroll(Self,Pos);
end; ...
inherited;
end;
delphi中部件能接受任何消息, 包括自定义消息.
只是在消息发布上有点技巧吧, 如果是windows control, 只要给这个部件
的handle postmessage就能接收.
对于没有windows handle的控件, 可以通过perform方法传递消息.
其实所有delphi中消息的处理例程都在winproc中, 只不过入口不同而已.
一般情况下如果消息处理过程返回时将Message.Result设为0, 表示该消息已处理
完毕, 不再往下传递. 所以将Result置为非0可以实现消息的往下传递吧. 如果在
消息处理时不想遗漏其他的处理该消息的过程, 别忘记加上inherited;一句.
当然也可以不加inherited;一句并将Result置0 来达到阻断原来消息句柄的处理
过程. 比如在画透明效果图象过程中常将WM_ERASEBKGND,WM_PAINT阻断.