编辑:
到目前为止,所有答案都指出最初编写的代码是 hacky。我没有写它,也不完全理解它是如何工作的。 但是,在一般情况下,它确实有效。我尝试了各种整理,但由于PointToScreen
.
解释这种行为的另一种方法是想出一种替代方法来实现所需的功能,这是按下按钮时出现在按钮顶部的一个小对话框。当前的实现是出现在顶部的表单,然后跟踪原始表单以保持其位置。有更清洁的选择吗?
原始问题:
我正在尝试使用以下命令将表单(表单 A)放置在表单(表单 C)上的控件(按钮 B)之上PointToScreen
:
Point buttonCorner = buttonB.Parent.PointToScreen(buttonB.Location);
buttonB
表单中的按钮在哪里FlowLayoutPanel
。
大多数情况下,我得到了我期望的位置。我在表单上的一个事件中使用此代码LocationChanged
,以便表单 A 跟踪按钮 B。这工作正常。
但是,当另一个动作导致父表单调整大小时,我发现 的位置buttonCorner
是偏移的,因此表单 A 最终离开屏幕(向右)。在此事件之前,我的表格中没有任何部分出现在屏幕上。
我能想到的唯一理论是事件在重新安排时LocationChanged
触发 ,并且在此期间它返回一个错误的位置。FlowLayoutPanel
这似乎有点牵强,但我没有更好的理论。