2017-12-18 9 views
0

誰もが私にこれを助けることができますか?ピクチャボックス内の2点間でマウス座標を取得する方法

私にはイメージボックスがあり、このイメージにはいくつかの座標があります。 私のXは60で始まり135で終わりです My Yの統計は75で120で終わりです

私は最初と最後の点しか持っていないので、画像上にマウスを置いたときに計算して見たいと思います。

私は最初の問題を解決することから始めました。私は自分のスタートと終わりを限定しなければなりません。 私はトラックバーを試しました。まず、現在のX位置を取得しようとして

イム:

位置のx = 0で私のPictureBoxを設定します。

私のトラックバーを位置x = -10に設定すると、最初のピンは位置0になります。

私のtracbar size.x = picturebox.x + 20を設定すると、最後のピンは画像ボックスの最後に表示されます。

私のトラックバーの現在のプロパティ: 最小値= 60、最大値= 135;それはほとんど働いて、まだ非常に正確ではないです

private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     double dblValue; 
     dblValue = ((double)e.X/ (double)trackBar1.Width) * (trackBar1.Maximum - trackBar1.Minimum); 
     dblValue = dblValue + 60; 
     trackBar1.Value = Convert.ToInt32(dblValue); 
     lblX.Text = dblValue.ToString(); 
    } 

は私のPictureBoxでのマウス移動イベントを設定します。 誰かがうまくいくと思っていますか?

答えて

0

私はそれが何をしようとしているのかはっきりしていませんが、picturebox内の座標に到達しようとすると、指定された場所を計算するPointToClient(Point)というpictureBoxクラスの関数がありますスクリーンはクライアントの座標を指します。 MouseEventArgsのX座標とY座標を使用して、Pointオブジェクトを作成して関数に渡すことができます。

明確にする:

MouseMoveイベントにおけるMouseEventArgsXY特性はスクリーン座標(0,0)は、画面の左上隅されています。

PictureBoxのような多くのコントロールには、画面座標をローカルコントロールの座標に変換する方法が含まれています。ここで(0,0)はコントロールの左上隅です。

たとえば、コントロールが(60,75)の位置にスクリーン上に配置され、右下の座標が(135,120)の場合。マウスがコントロールの上にあり、左から10ピクセル、上から20ピクセルの場合、MouseMoveイベントのMouseEventArgsのXYプロパティはX = 70とY = 95になります。これらをPointToClientを使用しているピクチャボックスコントロールの内部座標には、X = 10とY = 20と表示されます。あなたはXがマウスの座標どこの相対的兆候がいくつかのコントロールの上にある表示TrackBarを持っているしたいと思った場合は、次のよう

さて、あなたはそれを計算になります。

// Set the minimum and maximum of the trackbar to 0 and 100 for a simple percentage. 
trackBar1.Minimum = 0; 
trackBar1.Maximum = 100; 

// In the pictureBox1_MouseMove event have the following code: 
trackBar1.Value = pictureBox1.PointToClient(new Point(e.X, e.Y)).X * 100/pictureBox1.Width; 

あなたがしたい場合トラックバーの利用画面は、いくつかのコントロールの上にマウスのX座標の相対的な位置を追跡するための座標れている次のように、あなたはそれを計算になります。

// Set the minimum and maximum values of the track bar to the screen coordinates of the 
// control we want to track. 
trackBar1.Minimum = pictureBox1.PointToScreen(0,0).X; 
trackBar1.Maximum = pictureBox1.PointToScreen(pictureBox1.Width, 0).X; 

// In the pictureBox1_MouseMove event have the following code: 
trackBar1.Value = e.X; 

あなたはトラックバーは、いくつかのCONTRの内部座標を使用していたいと思った場合オールは、Xの内部の位置は、そのコントロール上にマウスの座標を追跡するために、以下のように、あなたはそれを計算になります。

// Set the minimum and maximum values of the track bar to zero and the width of the 
// control we want to track. 
trackBar1.Minimum = 0; 
trackBar1.Maximum = pictureBox1.Width; 

// In the pictureBox1_MouseMove event have the following code: 
trackBar1.Value = pictureBox1.PointToClient(new Point(e.X, e.Y)).X; 
// or - not recommended - read below. 
trackBar1.Value = e.X - pictureBox1.Left; 

を今、1つの警告があり、そしてあなたが他のコントロール内のコントロールを置く場合には次のように、ありますパネル内のパネル内のパネルなど、別のコントロール内のコントロールの 'ワールド'座標は、親コントロール内のコントロールの位置に基づいています。そのため、コントロールの内部座標をPointToClientで、内部座標からの画面座標をPointToScreenで使用することをお勧めします。そうしないと、画面に到達するまですべてのコンテナを処理しなければならないからです。 TopLeftは完全に調整されています。

これがあなたの質問に答えることを願っています。

+0

PointToClientは0〜Xを計算します。最初と最後の座標を与え、その間を計算します。私のイメージはx = 0で始まっていませんが、x = 60で始まります。 – miojow

+0

それからちょうど窓の座標にならないでしょうか?明確にするために私の答えを編集し、おそらくあなたの質問に答えるでしょう。 –

関連する問題