2017-12-18 6 views
0

아무도 도와 줄 수 있습니까?그림 상자의 두 점 사이에서 마우스 좌표를 얻는 방법

이미지가있는 그림 상자가 있으며이 이미지에는 약간의 좌표가 있습니다. 내 X가 60에서 시작하여 135에서 끝납니다. 내 Y 통계가 75에서 120으로 끝납니다.

저는 첫 번째와 마지막 지점 만 있기 때문에 이미지 위에 마우스를 가져 가면 좌표를 계산하고 볼 수 있습니다.

나는 첫 번째 문제를 해결하기 시작했다. 나는 시작과 끝을 구분해야한다. 그래서 나는 트랙볼을 시도했다.

임은 현재의 X 위치 얻을 첫 번째 시도 :

설정 위치에서 내 PictureBox를 X = 0;

내 트랙바를 x = -10 위치로 설정하면 첫 번째 핀은 0 위치에있게됩니다.

내 tracbar size.x = picturebox.x + 20을 설정하면 마지막 핀이 그림 상자의 끝에있게됩니다.

내 트랙 바와 현재 속성 : 최소 = 60, 최대 = 135;

세트 내의 PictureBox에서 마우스 이동 이벤트 : 그것은 거의 작동,하지만 여전히 아주 정확하지 않은 것

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

. 누구나 사용할 수있는 아이디어가 있습니까?

답변

0

정확히 무엇을 하려는지 확실하지 않지만 picturebox 내의 좌표를 얻으려는 경우 지정된 위치를 계산하는 PointToClient(Point)이라는 pictureBox 클래스의 함수가 있습니다. 화면이 클라이언트 좌표를 가리 킵니다. MouseEventArgs의 X 및 Y 좌표를 사용하여 Point 개체를 만들어 함수에 전달할 수 있습니다. 화면의 상부 좌측 코너를 화면 좌표 (0,0) 인 경우에 MouseMoveMouseEventArgs

XY 성질 :

명확히한다.

PictureBox 컨트롤과 같은 많은 컨트롤에는 화면 좌표를 로컬 컨트롤의 좌표로 변환하는 메서드가 포함되어 있습니다. 여기서 (0,0)은 컨트롤의 왼쪽 위 모퉁이입니다.

예를 들어 컨트롤이 화면의 위치 (60, 75)에 배치되고 오른쪽 하단 좌표가 (135, 120) 인 경우입니다. 마우스가 컨트롤 위에 있고 왼쪽에서 10 픽셀, 위쪽에서 20 픽셀 인 경우 MouseMove 이벤트에서 MouseEventArgs의 XY 속성은 X = 70 및 Y = 95가됩니다. PointToClient을 사용하여 picturebox 컨트롤의 내부 좌표에 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; 

당신이 원한다면

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

당신이 트랙 바 일부 제어 방식의 내부 좌표를 사용하게하고 싶다면 다음과 같이 당신이 그것을 계산합니다는 트랙 바 사용 화면이 X의 상대적 위치가 어떤 컨트롤 위에 마우스의 좌표를 추적하는 좌표가 팔자가 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; 

을 이제 하나의 경고가, 당신은 다른 컨트롤 안에 컨트롤을 넣으면 그와 같은 것입니다 패널 내부의 패널 내부의 패널 등을 포함 할 수 있습니다. 그런 다음 다른 컨트롤 내부의 컨트롤의 '세계'좌표는 부모 컨트롤 내부의 해당 위치를 기반으로합니다. 따라서 PointToClient을 통해 컨트롤의 내부 좌표를 사용하고 PointToScreen을 통해 내부 좌표의 화면 좌표를 사용하는 것이 좋습니다. 그렇지 않으면 화면에 도달 할 때까지 모든 컨테이너를 통과해야합니다. TopLeft이 모두 조정됩니다.

이 질문에 대한 답변을 보내주십시오.

+0

PointToClient는 0과 X를 계산합니다. 첫 번째와 마지막 좌표를주고 싶습니다. 내 이미지가 x = 0에서 시작하지는 않지만 x = 60; – miojow

+0

그러면 창 좌표가되지 않을까요? 나는 내 대답을 편집하여 명확히하고, 아마도 당신의 질문에 답할 것입니다. –