5

画面上のコントロールの絶対位置を取得しようとしています。2 台のモニターを使用していますが、結果はあまり良くありません...

私がやっていることは、別のフォームを開いて画像をキャプチャし、この画像をメイン フォームに渡してキャプチャ フォームを閉じることです。次に、写真がキャプチャされたのと同じ場所にメイン フォームが表示されるようにします。例として私がやろうとしていることの要点をつかむには、Windows で Snipping Tool を開き、切り取りをキャプチャします。画像が撮影された場所にウィンドウが表示されます。

これは、これを行うために使用している現在のコードです。

Location = new Point(Cursor.Position.X - CaptureBox.Width - CapturePanel.Location.X - CaptureBox.Location.X - 8, Cursor.Position.Y - CaptureBox.Height - CapturePanel.Location.Y - CaptureBox.Location.Y - 30);

CapturePanel には、画像を格納する CaptureBox コントロールが含まれています。また、フォームの境界線とタイトル バーを補正するために、X 位置から 8、Y 位置から 30 を使用していますが、これに関する唯一の問題は、一部のコンピューターが別のウィンドウ スタイルを使用し、これらの数値が変わることです。

ウィンドウの境界線とタイトルの幅/高さを取得するために使用できる方法があれば、それは素晴らしいことです。

編集

これに対する解決策は次のとおりです。

Location = new Point(
    Cursor.Position.X -
    CaptureBox.Width -
    CapturePanel.Location.X -
    CaptureBox.Location.X - 
    SystemInformation.HorizontalResizeBorderThickness,
    Cursor.Position.Y -
    CaptureBox.Height -
    CapturePanel.Location.Y -
    CaptureBox.Location.Y -
    SystemInformation.CaptionHeight -
    SystemInformation.VerticalResizeBorderThickness
);

キングキングの助けを借りて、SystemInformation を私に指摘してくれました。

4

1 に答える 1

7

の を取得するにHeightは、Window captionこれを試すことができます:

int captionHeight = yourForm.PointToScreen(Point.Empty).Y - yourForm.Top;    

フォームの境界線を取得するWidthには、これを試すことができます:

int borderWidth = yourForm.PointToScreen(Point.Empty).X - yourForm.Left;

また、デフォルトのキャプションの高さを で確認することもできますSystemInformation.CaptionHeight

CaptureBox画面内座標の位置を取得する場合は、次のPointToScreenメソッドを使用できます。

Point loc = CaptureBox.PointToScreen(Point.Empty);
于 2013-08-25T13:25:09.503 に答える