9

ClientRectangle'sフォームの「0,0」ではなく、フォームの場所を基準にしたコントロールの場所を提供するプロパティを探しています。

もちろん、すべてを画面座標に変換することはできますが、これを行うためのより直接的な方法があるのではないかと思います。

4

5 に答える 5

13

画面座標に変換してから、計算を行う必要があります。

Point controlLoc = form.PointToScreen(myControl.Location);

フォームの場所はすでに画面座標にあります。

今:

Point relativeLoc = new Point(controlLoc.X - form.Location.X, controlLoc.Y - form.Location.Y);

これにより、フォームのクライアント領域ではなく、フォームの左上隅を基準にした場所がわかります。

于 2012-04-19T20:52:34.717 に答える
5

これであなたの質問に答えられると思います。「this」がフォームであることに注意してください。

Rectangle screenCoordinates = control.Parent.ClientToScreen(control.ClientRectangle);
Rectangle formCoordinates = this.ScreenToClient(screenCoordinates);
于 2012-04-19T20:54:05.587 に答える
3

答えは、これを行う直接的な方法はないということのようです。

(質問で述べたように、画面座標を使用する以外の方法を探しています。

于 2012-04-22T15:18:11.810 に答える
0

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;

    }
于 2020-08-02T18:39:52.287 に答える