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

时间:2016-04-13 17:33:19

标签: delphi delphi-xe7

我在编写自定义控件的过程中遇到过这几次,但今天又遇到了它,我觉得有必要提问。

基本上以捕获为例:

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

要从我们有权访问Message.XPosMessage.Pos.x的过程中读取X和Y鼠标坐标,这两者都被声明为smallint

是否有任何理由选择其中一个或者他们基本上只是为了相同的目的服务,因此它可以选择使用哪个?

2 个答案:

答案 0 :(得分:3)

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都从同一个内存中读取。你是否使用其中一种取决于喜欢。

答案 1 :(得分:3)

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

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字段,它们都会映射到邮件数据中的相同位。