捕获鼠标消息 - 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.XPos
或 Message.Pos.x
,它们都声明为 smallint
。
是否有任何理由选择一个而不是另一个,或者它们基本上只是服务于相同的目的,因此归结为选择使用哪个?
Message.XPos
和 Message.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;
因此XPos
和Pos.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;
但要回答您的问题,是的,您可以使用 XPos
或 Pos.x
字段,它们都映射到消息数据中的相同位。
我在编写自定义控件时遇到过几次,但今天又遇到了,我觉得有必要问一下。
基本上捕获时例如:
procedure WMLMouseDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE;
要从程序中读取 X 和 Y 鼠标坐标,我们可以访问 Message.XPos
或 Message.Pos.x
,它们都声明为 smallint
。
是否有任何理由选择一个而不是另一个,或者它们基本上只是服务于相同的目的,因此归结为选择使用哪个?
Message.XPos
和 Message.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;
因此XPos
和Pos.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;
但要回答您的问题,是的,您可以使用 XPos
或 Pos.x
字段,它们都映射到消息数据中的相同位。