在控件开发中我们经常需要截获控件的部分消息以期达到我们的目的,但如何才能有效的捕获这些消息以及在这些消息是如何实现,请大家都来谈谈!!

解决方案 »

  1.   

    我觉得比c++中方便多了,基本步骤:1.定义事件类型,即自己的事件类型。
    2.定义消息驱动函数,即当消息触发时直接转入执行的过程。
    3.在驱动函数中做某些事情,或判断用户是否写入事件,并执行事件代码。下面是一个能接收鼠标进入和移出消息的peedButton。例子:  TMouseEnterEvent=Procedure(Sender:TObject) of Object; //定义事件类型
      TMouseExitEvent=procedure(Sender:TObject)  of Object;
      TMSpeedButton = class(TSpeedButton)
      private
       FMOuseEnter: TMouseEnterEvent;
       FMouseExit: TMouseExitEvent;
      protected
       procedure MouseEnterMsg(Var Message:TMessage);message CM_MOUSEENTER;//消息驱动函数
       procedure MouseExitMsg(Var Message:TMessage);message CM_MOUSELEAVE;
       procedure Loaded;override;
      public
        { Public declarations }
      published
        property OnMouseEnter: TMouseEnterEvent read FMouseEnter write FMouseEnter;
        property OnMouseExit: TMouseExitEvent read FMouseExit write FMouseExit;
      end;procedure Register;implementation
    uses DpkRes;procedure Register;
    begin
      RegisterComponents('simple', [TMSpeedButton]);
    end;procedure TMspeedButton.MouseEnterMsg(Var Message:TMessage);
    begin
       inherited;
      if Assigned(FMouseEnter) then
        FMouseEnter(self);
    end;procedure TMspeedButton.MOuseExitMsg(Var Message:TMessage);
    begin
       inherited;
       if Assigned(FmouseExit) then //判断用户是否写入事件代码,如果有则执行
         FMOuseExit(self);
    end;end;