마우스로 그림 상자를 움직입니다
-
05-09-2019 - |
문제
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;
}