ClientRectangle's
フォームの「0,0」ではなく、フォームの場所を基準にしたコントロールの場所を提供するプロパティを探しています。
もちろん、すべてを画面座標に変換することはできますが、これを行うためのより直接的な方法があるのではないかと思います。
画面座標に変換してから、計算を行う必要があります。
Point controlLoc = form.PointToScreen(myControl.Location);
フォームの場所はすでに画面座標にあります。
今:
Point relativeLoc = new Point(controlLoc.X - form.Location.X, controlLoc.Y - form.Location.Y);
これにより、フォームのクライアント領域ではなく、フォームの左上隅を基準にした場所がわかります。
これであなたの質問に答えられると思います。「this」がフォームであることに注意してください。
Rectangle screenCoordinates = control.Parent.ClientToScreen(control.ClientRectangle);
Rectangle formCoordinates = this.ScreenToClient(screenCoordinates);
答えは、これを行う直接的な方法はないということのようです。
(質問で述べたように、画面座標を使用する以外の方法を探しています。)
Autosize が true に設定された他の多くのコントロール内にコントロールがある場合、上記の回答はどれも役に立ちませんでした。
Form -> FlowLayoutPanel -> Panel -> Panel -> Control
そのため、別のロジックで独自のコードを作成しましたが、親コントロール間でドッキングが使用された場合の結果がどうなるかわかりません。その場合、Margins と Paddings が関与する必要があると思います。
public static Point RelativeToForm(this Control control)
{
Form form = control.FindForm();
if (form is null)
return new Point(0, 0);
Control parent = control.Parent;
Point offset = control.Location;
while (parent != null)
{
offset.X += parent.Left;
offset.Y += parent.Top;
parent = parent.Parent;
}
offset.X -= form.Left;
offset.Y -= form.Top;
return offset;
}