delphi中sendmessage如何调用过程(急死人拉)

Michaelyfj 2000-07-18 11:36:00
各武林路高手:
我想通过sendmessage发送消息时,执行某个过程或函数,该如何处理。
比如我有过程:
procedure EditEnter;
begin
label1.Caption := '焦点在Edit';
end;
用sendmessage(edit1.Handle, WM_MOUSEHOVER, ___, ___);在鼠标进入edit1时调用过程EditEnter,则wParam和lParam该如何设置。前辈能否系统给我介绍一下wParam和lParam的用法吗。
...全文
431 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
tms2000 2000-09-13
  • 打赏
  • 举报
回复
搞得太复杂了
procedure TForm1.EditEnter(msg:Tmessage); message WM_USER+n
begin
...
msg.Wparam
msg.Lparam
end;

SendMessage(Self.Hanlde,WM_USER+n,0,0);
自定意参数的擢用

halfdream 2000-07-18
  • 打赏
  • 举报
回复
可以TWMMouse 代替wParam ,lParam,很方便的:)
JGTM2000 2000-07-18
  • 打赏
  • 举报
回复
嘻嘻,不好意思,前面又犯了一个武断的错误: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那两个消息更好用。以上供您参考,不一定对。嘿嘿
JGTM2000 2000-07-18
  • 打赏
  • 举报
回复
哎,不好意思,是我看错了。你的意思是让TEdit像TSpeedButton那样可以响应鼠标进出事件,是吧?那就new一个Delphi的Component,从TEdit或者最好TCustomEdit继承,并加入对消息CM_MOUSEENTER和CM_MOUSELEAVE(没有WM_MOUSEHOVER消息,CM_开始的消息是Delphi内部定义并使用的消息)的处理过程。最好声明一个新的事件属性,并在处理消息的程序中根据OnHover属性的有无选择执行。

另外前面有个笔误,处理消息的函数参数类型应该是TMessage,不是TMsg。抱歉。
还有,在TWinControl内部“执行”消息过程可以用Perform(msg,wParam,lParam),看看源码就知道干什么的了。写组件的时候常用。
Michaelyfj 2000-07-18
  • 打赏
  • 举报
回复
to JGTM2000
我想把WM_MOUSEHOVER消息发送给edit1构件。如果按照你的意思,该事件应该是发送给Form的,这怎么可以混在一起呢?或者我有些误解。
你能不能给我一个例子
码狂 2000-07-18
  • 打赏
  • 举报
回复
???
bpc 2000-07-18
  • 打赏
  • 举报
回复
在EDIT的ONENTER事件中编程:EditEnter;即可。。。。
干吗用SENDMESSAGE呢??????
JGTM2000 2000-07-18
  • 打赏
  • 举报
回复
说说你到底要做什么。wParam和lParam的用法是和消息相关的。也许你是希望处理某一特殊的消息?那么可以在TForm类中声明一个消息处理过程:
procedure DoMouseHover(var msg: TMsg); message WM_MOUSEHOVER;
并让他去调用EditEnter之类的函数(或者直接写在里面)。

你再说详细一些最好(目的)。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧