捕获鼠标消息 - Message.XPos 或 Message.Pos.x?

Capturing Mouse Messages - Message.XPos or Message.Pos.x?

我在编写自定义控件时遇到过几次,但今天又遇到了,我觉得有必要问一下。

基本上捕获时例如:

procedure WMLMouseDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE;

要从程序中读取 X 和 Y 鼠标坐标,我们可以访问 Message.XPosMessage.Pos.x,它们都声明为 smallint

是否有任何理由选择一个而不是另一个,或者它们基本上只是服务于相同的目的,因此归结为选择使用哪个?

Message.XPosMessage.Pos.x 在用法和含义上完全可以互换,因为它们是相同的。

所有这些 Message 参数都是 TWMMouse 类型,这是一种在其声明中使用 variant part 的记录类型:

  TWMMouse = record
    Msg: Cardinal;
    MsgFiller: TDWordFiller;
    Keys: Longint;
    KeysFiller: TDWordFiller;
    case Integer of
      0: (
        XPos: Smallint;
        YPos: Smallint;
        XYPosFiller: TDWordFiller;);
      1: (
        Pos: TSmallPoint;
        PosFiller: TDWordFiller;
        Result: LRESULT);
  end;

因此XPosPos.X都从同一个内存中读取。用一个还是那个看自己喜欢

编写自定义控件时,您应该覆盖虚拟 MouseDown()MouseMove() 方法,而不是直接拦截底层 window 消息:

procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); dynamic;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); dynamic;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); dynamic;

但要回答您的问题,是的,您可以使用 XPosPos.x 字段,它们都映射到消息数据中的相同位。