我在编写自定义控件的过程中遇到过这几次,但今天又遇到了它,我觉得有必要提问。
基本上以捕获为例:
procedure WMLMouseDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
procedure WMMouseMove(var Message: TWMMouseMove); message WM_MOUSEMOVE;
要从我们有权访问Message.XPos
或Message.Pos.x
的过程中读取X和Y鼠标坐标,这两者都被声明为smallint
。
是否有任何理由选择其中一个或者他们基本上只是为了相同的目的服务,因此它可以选择使用哪个?
答案 0 :(得分:3)
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
都从同一个内存中读取。你是否使用其中一种取决于喜欢。
答案 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;
但要回答您的问题,是的,您可以使用XPos
或Pos.x
字段,它们都会映射到邮件数据中的相同位。