C# は、PointToClient および PointToScreen によって解釈されたピクチャ ボックスの指定された位置にピクチャを配置します。

1.C#でピクチャボックスの指定位置にピクチャを配置する方法

picturebox1 と同じサイズの Bitmap を作成し、
picturebox1 に設定して
から描画します。

Bitmap image = new Bitmap(picturebox1.Size.Width, picturebox1.Size.Height);
Graphics device = Graphics.FromImage(image);
//如果picturebox1本身有内容,就先画到image上
device.DrawImage(picturebox2.Image, w, h); //用你想要的位置画picturebox2
picturebox1.Image = image;

2. PointToClient と PointToScreen

//
// 概要:
// 指定されたスクリーン ポイントの位置をクライアント領域の座標に計算します。
//
// パラメータ:
// p:
// 変換するスクリーン座標 System.Drawing.Point。
//
// 戻り値:
// 変換された System.Drawing.Point p (ワークスペース座標) を表す System.Drawing.Point。
public Point PointToClient(Point p);
//
// 概要:
// 指定されたワークスペース ポイントの位置を画面座標に計算します。
//
// パラメータ:
// p:
// 変換する作業領域の座標 System.Drawing.Point.
//
// 戻り値:
// 変換された System.Drawing.Point を表す System.Drawing.Point、p (画面座標で表現)。
パブリック ポイント PointToScreen (ポイント p);

PointToClient は、画面の座標 (pt) を画面上のコントロールの座標と比較し、差を返します. 座標の中心は、画面上のコントロールの位置の絶対位置です.

PointToScreen は座標点 (pt) と Control の画面上の座標を比較して重ね合わせた値を返すものです. 座標の中心は画面の左上隅である (0, 0) です.

他の説明を次のように引用します。
ここに画像の説明を挿入

PointToClient は、指定されたスクリーン ポイントの位置を作業領域の座標に計算します。座標原点は黄色の領域の左上隅、X 軸方向は左から右、Y 軸方向は上から下、座標単位はピクセルで、PointToScreen は指定された位置を計算し
ます。画面座標としてのワークスペース ポイント。座標原点は画面左上、X 軸方向は左から右、Y 軸方向は上から下、座標単位はピクセルです。

下図のようにデモを書き、詳しく説明してください。

ここに画像の説明を挿入
1、PointToClient(ポイントp)

ここで p、座標原点は画面の左上隅、つまり (0, 0) です。

座標原点としての画面位置での現在のコントロールの位置を計算し、座標原点に相対的な p の値を返します。

上の図に示すように、画面内の btn の位置は (328, 188) であり、(320, 188) に対する画面上の点 (10, 10) は結果 (-318, -178) です。ポイント (0 , 0) は、pnl に対して (-183, -185) です。

画面上のコントロールの計算方法は、フォームの場所にすべてのレベルでの親の場所を加えたものです。

2、PointToScreen(ポイントp)

ここで p は、座標の原点がコントロールの位置を基準にしています。

これは、画面上のコントロールの位置の重ね合わせ結果です。

上記の例のように、フォームに対する pnl の位置は (80, 60) であり、これがフォームの場所 (200, 100) に追加され、境界線の幅 3、タイトル バーの高さ 25 が加算されます。これは 185 です。

btn.PointToScreen(新しいポイント(30, 20)): {X=358,Y=208}

この値は、画面上の btn の位置 (328, 188) に (30, 20) を加算した結果です。

3. フォーム内のコントロールの位置を取得します

Delphi にはありますが、C# にはありません。自分で記述し、静的関数をカプセル化して実現する必要があります。

public static class ControlHelper
    {
    
    
        public static Point LocationOnClient(this Control c)
        {
    
    
            var retval = new Point(0, 0);
            for (; c.Parent != null; c = c.Parent)
                retval.Offset(c.Location);
            return retval;
        }
    }

次の形式で btn の位置を見つけます。

lbl.Text = btn.LocationOnClient().ToString();    //{X=125, Y=63}

おすすめ

転載: blog.csdn.net/m0_65636467/article/details/129151459