gpt4 book ai didi

Delphi - WM_MOUSEWHEEL双重处理

转载 作者:行者123 更新时间:2023-12-01 23:53:51 25 4
gpt4 key购买 nike

我已经在应用程序的主窗口中添加了一个鼠标滚轮处理程序,它似乎可以工作,但与我从 MSDN 在线文档中期望的方式不同。

根据 MSDN 帮助,结果应设置为零以指示消息已被处理,但如果我这样做,则例程将被调用两次。设置为非零值(在我的例子中为 –1)会导致它只被调用一次。

这是一些说明问题的测试代码:

unit Mouse_Wheel_Testing;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Debug: TEdit;
procedure MouseWheelHandler(var Message: TMessage); override;
procedure FormCreate(Sender: TObject);
private
Call_Count: integer;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
Call_Count := 0;
Debug.Text := IntToStr(Call_Count);
end;

procedure TForm1.MouseWheelHandler(var Message: TMessage);
begin
inc(Call_Count);
Debug.Text := IntToStr(Call_Count);
Message.Result := -1;
end;

end.

最佳答案

从最初的问题和以下评论来看,这个问题分为两个部分:

  • 消息如何指示为已处理?
  • 为什么对消息处理程序的调用看起来如此不连贯,MouseWheelHandler被调用两次,OnMouseWheel从未根据表单上的控件进行调用?

对于第一部分,VCL 代码假设 Message.Result <> 0表示已处理的消息。在您的测试中,您设置了 Message.Result到-1,因此它被处理。正如 Sertac Akyuz 所说,这可能不是 MSDN 定义的,而是 VCL 中的设计决策。

第二部分有两个基础知识。一、WM_MOUSEWHEEL ,系统生成的消息。二、CM_MOUSEWHEEL ,Delphi自己的C控制M消息在内部分发。

  • MouseWheelHandler handle WM_MOUSEWHEEL
  • OnMouseWheel (并取决于结果和车轮增量 OnMouseWheelUp/OnMouseWheelDown )响应 CM_MOUSEWHEEL 触发的事件

滚动鼠标滚轮让 Windows 生成 WM_SCROLLWHEEL这是在 WndProc 中收到的的焦点窗口控件。这可能是TForm在这种情况下,很可能是 TEdit ,作为唯一的可聚焦控制。该消息将被分派(dispatch)到处理程序 MouseWheelHandlerTControl.MouseWheelHandler将尝试找到它所在的 ParentForm 并调用 TForm.MouseWheelHandler首次进入您的程序。在这里 - 通常 - Delphi 会 Perform一个CM_MOUSEWHEEL关于Form的集中控制。但是,您重写的过程不会调用 inherited并禁用此功能。如果消息仍未处理,它将向上传播到父链,即表单的 MouseWheelHandler称为第二次,第二次进入您的程序

如果CM_MOUSEWHEEL消息被生成,它们被发送到 TControl.CMMouseWheel 。这里,取决于DoMouseWheel的结果函数 CM_MOUSEWHEEL结果设置为 1 或者有 Parent控制在 Parent 上执行相同的消息。 TStringGrid例如将处理 MouseWheel 事件。 CM_MOUSEWHEEL不会传递给父级,您的表单没有滚轮事件。

关于Delphi - WM_MOUSEWHEEL双重处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45656529/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com