可以TWMMouse 代替wParam ,lParam,很方便的:)

解决方案 »

  1.   

    说说你到底要做什么。wParam和lParam的用法是和消息相关的。也许你是希望处理某一特殊的消息?那么可以在TForm类中声明一个消息处理过程:
    procedure DoMouseHover(var msg: TMsg); message WM_MOUSEHOVER;
    并让他去调用EditEnter之类的函数(或者直接写在里面)。你再说详细一些最好(目的)。
      

  2.   

    在EDIT的ONENTER事件中编程:EditEnter;即可。
    干吗用SENDMESSAGE呢??????
      
      

  3.   

    to JGTM2000
      我想把WM_MOUSEHOVER消息发送给edit1构件。如果按照你的意思,该事件应该是发送给Form的,这怎么可以混在一起呢?或者我有些误解。
    你能不能给我一个例子
      

  4.   

    哎,不好意思,是我看错了。你的意思是让TEdit像TSpeedButton那样可以响应鼠标进出事件,是吧?那就new一个Delphi的Component,从TEdit或者最好TCustomEdit继承,并加入对消息CM_MOUSEENTER和CM_MOUSELEAVE(没有WM_MOUSEHOVER消息,CM_开始的消息是Delphi内部定义并使用的消息)的处理过程。最好声明一个新的事件属性,并在处理消息的程序中根据OnHover属性的有无选择执行。另外前面有个笔误,处理消息的函数参数类型应该是TMessage,不是TMsg。抱歉。
    还有,在TWinControl内部“执行”消息过程可以用Perform(msg,wParam,lParam),看看源码就知道干什么的了。写组件的时候常用。
      

  5.   

    嘻嘻,不好意思,前面又犯了一个武断的错误:WM_MOUSEHOVER自从Win98/NT4以后已经成为正式消息了,在Delphi4+以后的Message.pas里面有它的定义。我前面说没有WM_MOUSEHOVER是因为当年俺在Win95中用Delphi2写TFlatButton的时候想用它就没找到,后来就是用CM_MOUSEENTER和CM_MOUSELEAVE解决的。另外,Perform是TControl而不是TWinControl中引入的,是我记错了,对不住父老乡亲们我对不起党不过:如果你希望得到WM_MOUSEHOVER消息则必须先使用TrackMouseEvent函数申请,写法很简单:procedure THoverEdit.SetTrackMouseEvent;
    var
      tme: TTrackMouseEvent;
    begin
      ZeroMemory(@tme,sizeof(tme));
      with tme do
      begin
        cbSize:=sizeof(tme);
        dwFlags:=TME_HOVER;
        hwndTrack:=Handle;
        dwHoverTime:=HOVER_DEFAULT;
      end;
      Win32Check(TrackMouseEvent(tme));
    end;然后重载CreateWindowHandle方法(因为要用到自己的hWnd):procedure THoverEdit.CreateWindowHandle(const Params: TCreateParams);
    begin
      inherited;
      SetTrackMouseEvent;
    end;然后再声明WM_MOUSEHOVER处理过程:  THoverNotifyEvent = procedure(Sender: TObject; keyFlag: Longint; XPos,YPos: Smallint);    THoverEdit = class(TCustomEdit)
      private
        FOnHover: THoverNotifyEvent;
        procedure SetTrackMouseEvent;
      protected
        procedure WMHover(var msg: TWMMouse); message WM_MOUSEHOVER;
      public
        procedure CreateWindowHandle(const Params: TCreateParams); override;
        ....
      end;写好缺省的消息处理过程(根据文档的说明,该消息的参数结构和TWMMouse是一样的):procedure THoverEdit.WMHover(var msg: TWMMouse);
    begin
      if Assigned(FOnHover) then
      begin
        FOnHover(Self,msg.Keys,msg.XPos,msg.YPos);
      end;
      SetTrackMouseEvent;
      msg.Result:=0;
    end;为什么要重新SetTrackMouseEvent?因为这些事件的跟踪是要消耗系统资源的,因此一次性触发,除非重新设置。当然,这里的只是一个示意而已,具体的逻辑还要看情况而定。BTW,我还是觉得CM_MOUSE那两个消息更好用。以上供您参考,不一定对。嘿嘿
      

  6.   

    搞得太复杂了
      procedure TForm1.EditEnter(msg:Tmessage); message WM_USER+n
                 begin
                  ...
                  msg.Wparam
                  msg.Lparam             
                end;                   SendMessage(Self.Hanlde,WM_USER+n,0,0);  
    自定意参数的擢用