문제

Windows Mobile 용 앱을 개발하고 있습니다 (Compact Framework 2.0). PictureBox가있는 Winforms가 있습니다.

그림 상자의 이미지를 움직이고 싶지만 어떻게 해야할지 모르겠으므로 구멍 그림 상자를 움직 이도록 선택합니다.

그렇게하려면이 이벤트를 사용합니다.

private void imagenMapa_MouseMove(object sender, MouseEventArgs e)
{
      imagenMapa.Left = e.X;
      imagenMapa.Top = e.Y;
      this.Refresh();
}

그러나 그림 상자를 움직일 때 깜박이고 어디에서나 움직입니다.

내가 뭘 잘못하고 있니?

도움이 되었습니까?

해결책

그만큼 e.X 그리고 e.Y 사진 상자와 관련이 있습니다 (예 : 마우스가 그림 상자의 왼쪽 상단에있는 경우 0,0).

imagenMapa.Left 그리고 imagenMapa.Top 형식과 관련이 있습니다 (또는 모든 제어가 포함 된 모든 imagenMapa)

이 두 시스템에서 변환없이 값을 혼합하려고하면 (보는 것처럼) 점프를 얻을 수 있습니다.

마우스 위치를 사진 상자가 포함 된 것들에 사용하는 동일한 좌표계로 변환하는 것이 좋습니다.

당신은 사용할 수 있습니다 imagenMapa.PointToScreen 마우스 좌표를 화면 좌표로 얻으려면 (또는 Cursor.Position 직접 위치를 얻으려면) yourForm.PointToClient 양식 좌표로 다시 가져 오기 위해.

귀하의 요구에 따라, 당신은 "컨트롤 내에서 이미지를 이동"할 수 있습니다. Paint 이벤트 컨트롤과 이미지를 직접 그리는 것. 당신이 이것을했다면, 당신은 당신이 전화했을 때 당신이 사용할 것일 가능성이 있기 때문에 그림 박스 좌표에 모든 것을 보관할 수 있습니다. graphicsObject.DrawImage.

다른 팁

실제 코드 (.NET 프레임 워크 3.5 이상, 소형 프레임 워크에서 사용할 수 있는지 확실하지 않음) ...

// Global Variables
private int _xPos;
private int _yPos;
private bool _dragging;

// Register mouse events
pictureBox.MouseUp += (sender, args) =>
{
    var c = sender as PictureBox;
    if (null == c) return;
    _dragging = false;
};

pictureBox.MouseDown += (sender, args) =>
{
    if (args.Button != MouseButtons.Left) return;
    _dragging = true;
    _xPos = args.X;
    _yPos = args.Y;
};

pictureBox.MouseMove += (sender, args) =>
{
    var c = sender as PictureBox;
    if (!_dragging || null == c) return;
    c.Top = args.Y + c.Top - _yPos;
    c.Left = args.X + c.Left - _xPos;
};

Ex & Ey는 PictureBox의 좌표 공간에 있으며 ImagenMapa.left & ImagenMapa.top은 양식의 좌표 공간에 있습니다. :-)

또한 양식을 이중 버퍼로 설정하는 것을 잊지 마십시오. 깜박 거리는 데 도움이 될 수 있지만 실제 위치를 위해 Daniel L의 제안을 좋아합니다.

수학을 받아 들여!

control.Left = control.Left - (_lastMousePos.X - currentMousePos.X);
control.Top = control.Top - (_lastMousePos.Y - currentMousePos.Y);

빠른 설명 : 마우스 위치와 차이를 얻고 이동하려는 물체에 적용합니다.

예 : 오래된 마우스 X 위치가 382이고 새로운 위치가 385 인 경우 차이는 -3입니다. 컨트롤 전류 X 위치가 10이면 10- (-3) = 13

이유 : 그것은 무엇이든 작동하며 좌표를 지속적으로 변환하는 것보다 훨씬 저렴합니다.

실제로 당신이 한 일은 정확합니다. 그러나 당신은 MouseMove 속성을 PictureBox에 제공했습니다. 그 속성을 형태 (배경)에 주어야합니다.

전:

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
  imagenMapa.Left = e.X;
  imagenMapa.Top = e.Y;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top