如果将在WndProc中已处理的消息不再继续分发? ( 积分: 30 )

  • 主题发起人 主题发起人 awfigsk
  • 开始时间 开始时间
A

awfigsk

Unregistered / Unconfirmed
GUEST, unregistred user!
例如:
procedure TForm1.WndProc(var message: TMessage);
var
p:TPoint;
b:TButton;
begin
if message.WParam=WM_LBUTTONDOWN then
begin
ShowMessage('在WndProc方法中已捕获了鼠标左键!');
...
end;
// inherited;
end;
上面这段代码是在TForm1窗体中捕获了鼠标左键单击的消息(是单击一个按钮)后显示出提示,我想鼠标单击这个按钮后,显示出上面的提示,就不再处理按钮的事件了(也就是不想让按钮有被按下的图样)。我将inherited注释掉,但按钮还是会有按下的图样.如果在这里处理了消息后,就不再让该消息分发给其他控件呢?
 
例如:
procedure TForm1.WndProc(var message: TMessage);
var
p:TPoint;
b:TButton;
begin
if message.WParam=WM_LBUTTONDOWN then
begin
ShowMessage('在WndProc方法中已捕获了鼠标左键!');
...
end;
// inherited;
end;
上面这段代码是在TForm1窗体中捕获了鼠标左键单击的消息(是单击一个按钮)后显示出提示,我想鼠标单击这个按钮后,显示出上面的提示,就不再处理按钮的事件了(也就是不想让按钮有被按下的图样)。我将inherited注释掉,但按钮还是会有按下的图样.如果在这里处理了消息后,就不再让该消息分发给其他控件呢?
 
注意这个函数传入的参数了吗
procedure TForm1.WndProc(var message: TMessage);
message是可变的

procedure TForm1.WndProc(var message: TMessage);
var
p:TPoint;
b:TButton;
begin
//if message.WParam=WM_LBUTTONDOWN then 这里的比较错了,应该是下面这行
if message.msg=WM_LBUTTONDOWN then
begin
message.msg:=0;
ShowMessage('在WndProc方法中已捕获了鼠标左键!');
...
end;
inherited;
end;
或者这样
procedure TForm1.WndProc(var msg: TMessage);
begin
if msg.Msg=WM_LBUTTONDOWN then
begin
//进行一些其这操作
end
else
inherited;

end;
 
哦,是的,真是奇怪,我开始也是用msg来比较的,当时没有成功,我以为是消息值错了。就试着用WLPRARM来比较。
谢谢!

但还是有些问题,程序刚运行时,如果我点击按钮,并不会显示出提示框,而只要我点击了窗体的空白处后,会显示出提示框,再点击按按钮或窗体其他部分都会显示提示框。
这好像是程序刚运行WndProc并没有捕获到鼠标左键单击的消息。这是怎么回事呢?
还请指点,谢谢!
 
你是不是连续点了两次鼠标左键啊
如果快速的点两下
Windows会把消息进行转换,产生其它的消息

建议你如果只想截取特定消息的话不要在WndProc中截而是直接定义指定消息的处理函数
 
我只是单击,没有双击呀。并且程序一运行,我就点击按钮button4,并不会1处的对话框。
我如果在窗体空白处单击了鼠标左键按钮,就会弹出1处的对话框,但再单出button4按钮,也是弹出1处的对话框,2处的对话框则不会弹出来。这是怎么回事呢?
procedure TForm1.WndProc(var message: TMessage);
var
p:TPoint;
b:TButton;
begin
if message.msg=WM_LBUTTONDOWN then
begin
ShowMessage('在WndProc方法中已捕获了鼠标左键!');   // 1
b:=FindComponent('Button4') as TButton

GetCursorPos(p);
p:=ScreenToClient(p);
if ((p.X>=b.Left) and (p.Y>=b.Top)) and
((p.x<=b.Left+b.Width) and (p.Y<=b.Top+b.Height)) then
begin
ShowMessage('Good')
// 2
message.Msg:=0;
end;
end;
inherited;
end;

我这样做只是想测试一下。

=========================
是了,处理getcursor()方法步骤错了,我将showmessage放在getcursor后面后,在单击button4按钮后就可以弹出1处和2处的对话框了。
但为何程序一开始运行点击button4控钮不会弹出1处和2处的对话框呢?
 
如果你放慢速度,单击之间隔的时间一点,看看是不是好了
 
这已经不只是消息处理的问题了
应该另外讨论
message.Msg:=0;
这一句的位置你自己要调整好
给分吧
 
晕!大侠,就急着要分呀!
讨论一下这个问题不好吗?分数我肯定会给的呀,如果嫌少,我可以另开贴子加分给你!
 
一段是一段
如果我把所有的东西都在一起讨论的知何年何月才能完啊
我搞开发都6年多了,到现在还有好多东西没懂呢

不过到可以给你说点经验
把问题尽量分开
这样以开发有好处
因为至少你可以确认哪一块是决对没问题的
要不然都连在一起你根本无从判断到底是哪一部分出问题了

讨论当然可以
毕竞我也有很多不知道的东西
 
procedure TForm1.WndProc(var message: TMessage);
begin
if message.msg=WM_LBUTTONDOWN then
begin
Memo1.Lines.Add('&amp;Ocirc;&amp;Uacute;WndProc·&amp;frac12;·¨&amp;Ouml;&amp;ETH;&amp;Ograve;&amp;Ntilde;&amp;sup2;&amp;para;&amp;raquo;&amp;ntilde;&amp;Aacute;&amp;Euml;&amp;Ecirc;ó±ê×ó&amp;frac14;ü&amp;pound;&amp;iexcl;');
Message.Result := 0;
end
else
inherited WndProc(Message);
end;
 
先收起来,再看
 
tseug的提法不错
Message.Result := 0;
是返回给调用者,说明消息处理的结果,但是具体的函义搞不清了
 
楼主在问什么啊,分条目列出来好不好.
大家都能看清楚
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部