2013-08-25 19 views
5

画面上のコントロールの絶対位置を取得しようとしています。私は2台のモニターを使用しており、その結果はそれほど素晴らしいものではありません。c#画面上の絶対位置コントロール

私がやっていることは、画像をキャプチャしてからこの画像をメインフォームに渡し、キャプチャフォームを閉じることです。私は、写真が撮影された同じ場所にメインフォームを表示したいと思います。例として私がしようとしていることの要点を得るには、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個とテロの位置から30個も取っていますが、これは唯一の問題はいくつかのコンピューターが異なるウィンドウスタイルを使用していることです。

ウィンドウの境界線とタイトルの幅/高さを取得するための方法がある場合、それは素晴らしいでしょう。

EDITは

これを解決するには、次のようになります。王の王は私にSystemInformationを指摘からの助けを借りて

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 
); 

。あなたのWindow captionHeightは、あなたがこの試すことができますするには

答えて

5

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

また、あなたがしたいことがあります。フォームの境界線のWidthを取得するには

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

を、あなたはこれを試すことができますデフォルトのキャプションの高さをSystemInformation.CaptionHeightで調べます。

あなたはスクリーン座標にCaptureBoxの位置を取得したい場合は、あなたがPointToScreenメソッドを使用することができます

Point loc = CaptureBox.PointToScreen(Point.Empty); 
+0

第一の方法の作品を、SystemInformation.CaptionHeightは、それがあるべきよりも小さかったです。ウィンドウ枠のサイズはどうですか? – Dragonphase

+0

@Dragonphase 'CaptureBox'の場所を取得したい場合は、私の更新された答えを見てください。' Border size'を計算する必要はありません。 –

+0

キャプチャされた画像の場所をメインフォームに渡していないので、これはうまくいきません。これを行うと、現在選択されているフォームのプライマリモニタ上の場所に絶対位置(たとえば1440)が追加されます。私は解決策を思いつきましたが、それは私のメインポストにあります。 – Dragonphase