2013-10-30 2 views
0

드래그하려고하는 라벨이 있습니다. 레이블을 클릭하고 MouseMove() 이벤트에서 레이블의 위치를 ​​다시 지정하려고합니다.MouseMove가 올바른 좌표 점을 얻지 못합니다

+0

** 좌표 : 그럼 그냥 수학을 . 당신의 접근 방식을 위해서 당신은'PointToClient()'를 다음과 같이 사용할 필요가 있습니다 :'((Label) sender) .Location = ((Label) sender) .Parent.PointToClient (Cursor.Position);' 점프 (jump) "할 수 있습니다. 그러나 컨트롤의 상단/왼쪽 모서리가 커서 위치로 점프합니다. 아래의 LarsTech의 예와 같이 더 자연스러운 드래그가 수행됩니다. –

답변

3

일반적으로 컨트롤에 초기 마우스 다운 포인트의 오프셋 위치를 저장해야합니다. 그렇지 않으면 컨트롤이 지터스럽게 움직입니다. 부모에 대한

Cursor.Position`이 ** 화면 ** 좌표에 있지만 위치() 속성이 ** 클라이언트에서 할 필요가`때문이다
Point labelOffset = Point.Empty; 

void MyLabel_MouseDown(object sender, MouseEventArgs e) { 
    if (e.Button == MouseButtons.Left) { 
    labelOffset = e.Location; 
    } 
} 

void MyLabel_MouseMove(object sender, MouseEventArgs e) { 
    if (e.Button == MouseButtons.Left) { 
    Label l = sender as Label; 
    l.Location = new Point(l.Left + e.X - labelOffset.X, 
          l.Top + e.Y - labelOffset.Y); 
    } 
} 
관련 문제