|            
3. 创建新的消息处理方法 
    因为Delphi只为大多数普通Windows消息提供了处理方法,所以当你定义自己的消息时,就要创建新的消息处理方法。 
    用户自定义消息的过程包括两个方面: 
     ● 定义自己的消息 
    ● 声明新的消息处理方法  
    ⑴ 定义自己的消息 
    许多标准部件为了内部使用定义了消息。定义消息的最一般的动因是广播信息和状态改变的通知。 
    定义消息过程分两步: 
    ● 声明消息标识符 
    ● 声明消息记录类型  
    ① 声明消息标识 
    消息标识是整型大小的常量。Windows保存了小于1024的消息用于自己使用,因此当声明自己的消息时,你应当大于1024。 
    常量WM_USER代表用于自定义消息的开始数字。当定义消息标准时,你应当基于WM_USER。 
    某些标准Windows控制使用用户自定义范围的消息,包括ListBox、ComboBox、EditBox和Button。如果从上述部件中继承了一个部件,在定义新的消息时,应当检查一下Message单元是否有消息用于该控制。 
    定义消息的方法如下:  
    Const 
    WM_MYFIRSTMESSAGE=WM_USER+0; 
    WM_MYSECONDMESSAGE=WM_USER+1;  
    ② 声明消息记录类型 
    如果你想给予自定义消息的参数有含义的名字,就要为该消息声明消息记录类型。消息记录是传给消息处理方法的参数的类型。如果不使用消息参数或者想使用旧风格参数,可以使用缺省的消息记录。 
    声明消息记录类型要遵循下列规则 
    ● 以消息名命名消息记录类型,以T打头 
    ● 将记录中第一个域命名为Msg,类型为TMsgPraram 
    ● 将接着的两个字节定义为word 以响应word大小的参数 
    ● 将接着的四个字节与long参数匹配 
    ● 将最后的域命名为Result,类型为Longint  
    下面是TWMMouse的定义  
    type 
    TWMMouse=record 
    Msg: TMsgParam; { 第一个是消息ID } 
    Keys: Word; { wParam } 
    case Integer of { 定义lParam的两种方式 } 
    o: ( 
    Xpos: Integer; { 或者以x,y座标 } 
    Ypos: Integer); 
    1: ( 
    Pos : TPoint; { 或者作为单个点 } 
    Result: Longint; ) { 最后是Result域 } 
    end;  
    TWMMouse使用变长记录定义了相同参数的不同名字集。 
    ⑵ 声明新的消息处理方法 
    有两类环境需要你定义新的消息处理方法: 
    ● 自定义新部件需要处理没有被标准部件处理的Windows消息 
    ● 已定义了自定义部件使用的新消息  
    声明消息处理方法的办法如下: 
    ● 在部件声明中的protected部分声明方法 
    ● 将方法做成过程 
    ● 以要处理的消息名命名方法 但不带下划线 
    ● 传递一个命名为Message的var参数,类型为消息记录类型 
    ● 编写用于该部件的特别处理代码 
    ● 调用继承的消息方法  
    下面是用于用户自定义消息CM_CHANGECOLOR的消息处理代码:  
    type 
    TMyComponent=class(TControl) 
    … 
    protected 
    procedure CMChangeColor(var Message:TMessage); 
    message CM_CHANGECOLOR; 
    end:  
    procedure TMyComponent.CMChangeColor(var Message: TMessage); 
    begin 
    color := Message lParam; 
    inherited; 
    end; 
    19.2.2.4 注册部件  
    编写部件及其属性、方法和事件只是部件创建过程的一部分。尽管部件具有这些特征就可用,但部件真正功能强大的是在设计时操作它们的能力。 
    使部件在设计时可用需要经过如下几步: 
    ● 用Delphi注册部件 
    ● 增加选择板位图 
    ● 提供有关属性和事件的帮助 
    ● 存贮和读取属性  
    1. 用Delphi注册部件 
    为了让Delphi识别自定义部件,并将它们放置于Component Palette上,你必须注册每一个部件。 
    注册一个部件要在部件所在单元里加入Register方法,这包括两个方面的内容: 
    ● 声明注册过程 
    ● 实现注册过程  
    一旦安装了注册过程,就可以将部件安装在选择板上。 
    注册过程要在部件所在单元中写一个过程,该过程必须以Register命名。Register必须出现在库单元的interface部分,这样Delphi就能定位它。在Register过程中,可以为每个部件调用过程RegisterComponents。 
    下面的代码演示了建立和注册部件的概略方法:  
    unit MyBtns;  
    interface  
    type 
    … { 声明自定义部件 } 
    procedure Register;  
    Implementation  
    procedure Register; 
    begin 
    … { 注册部件 } 
    end;  
    end.  
    在Register过程中,必须注册每一个要加入Component Palette的部件,如果库单元包含若干部件,就要将它们一次性注册。 
    注册一个部件时,为部件调用RegisterComponents过程。RegisterComponents告诉Delphi两件有关所注册的部件的事::       [1] [2] [3] [4]  下一页  
 |