2011-12-20 2 views
1

저는 사용자가 위 또는 아래로 드래그 할 수있는 Picturebox가 있습니다.비정상적으로 끌기 문제

해당 프로그램은 피아노의 복잡한 음악 스태프 편집기이므로 직원이 메모를 이동하는 유일한 방법은 여러 가지 if 문을 사용하고 좌표를 수정하는 것입니다.

사용자가 PictureBox 구성 요소를 아래로 이동할 수 없지만 개체를 ​​위로 끌면 아무런 문제가 발생하지 않습니다. 이 클래스는 PictureBox에서 상속받습니다.

PictureBox가 아래로 끌 때 작동하지만 위쪽으로 끌면 움직이지 않는다는 점을 강조하고 싶습니다. 드래그는 간격으로 수행됩니다. 즉, PictureBox는 특정 위치에만 배치 될 수 있습니다 (따라서 특정 좌표에 대한 필요성).

+0

(관련 없음 : '최고'수표 * 많이 * 읽기 쉽다는 것을 알게 될 것입니다. (번호 순서) (http://stackoverflow.com/a/3188857/71059) - 동의하지 않음) – AakashM

+2

스 니펫은 진단하기에 충분하지 않습니다. 일반적인 문제는 컨트롤을 움직이면 마우스의 상대적 위치도 변경된다는 것입니다. –

+0

이상한 점은 마우스를 아래로 움직이면 작동한다는 것입니다. 실제로 완벽하게 작동합니다. 그러나 마우스를 위로 움직이면 그것은 나을 수 없습니다. 그리고 두 상황 모두 거의 동일한 정확한 코드를 사용합니다. –

답변

1

현재 솔루션이 제대로 작동하지 않을 수 있지만 컨트롤을 드래그하여 if 문에 지정된 좌표로 다시 스냅하려고하면 이벤트가 자주 호출 될 수 있습니다.

하기 권장 솔루션 :

난 당신이 끌어하고자하는 컨트롤이 포함 된 양식이나 부모에 MouseMove 이벤트를 사용하는 것이 좋습니다 것입니다. 또한 값은 하드 코딩되지 않고 구성 가능해야합니다. 코드가 약간 변경됩니다 (컨트롤의 LeftTop 속성 대신 현재 마우스 좌표를 비교) 제대로 작동합니다.

UPDATE :

지금이 에 동일 Y는 세 곳 중 하나 (에서 컨트롤을 넣을 수 있도록 작동 그래서, 또는 를 코드를 수정했습니다 158). 난 당신이 많은 코드를 변경하도록 요구하지 않는 조금만 변경하지만, 나는 강력하게 설명하는 첫 번째 방법을 사용하는 것이 좋습니다 :).

int currentY; 
    bool isDragging = false; 

    private void OnDrag(object sender, MouseEventArgs e) 
    { 
     if (isDragging) 
     { 
      //calculate Y position relative to parent 
      int parentY = this.Top + e.Y; 

      if (parentY < currentY) 
      { 
       if (parentY > 158 && parentY >= 148) 
       { 
        if (this.Top != 148) 
        { 
         currentY += (this.Top - 148); 
         this.Top = 148; 
        } 
       } 
       else if (parentY < 148 /*&& parentY >= 138*/) 
       { 
        if (this.Top != 138) 
        { 
         currentY += (this.Top - 138); 
         this.Top = 138; 
        } 
       } 

       //And so on 

      } 
      else if (parentY > currentY) 
      { 
       if (/*parentY <= 158 &&*/ parentY >= 148) 
       { 
         currentY += (this.Top - 158); 
         this.Top = 158; 
       } 
       else if (parentY < 148 && parentY >= 138) 
       { 
         currentY += (this.Top - 148); 
         this.Top = 148; 
       } 

       //And so on 

      } 
     } 
    } 

    public void MusicNote_MouseDown(object sender, MouseEventArgs e) 
    { 
     currentY = this.Top + e.Y; 

     this.Capture = true; 

     if (e.Button == System.Windows.Forms.MouseButtons.Left) 
     { 
      isDragging = true; 
     } 

     this.MouseMove += new MouseEventHandler(OnDrag); 
    } 

    public void MusicNote_MouseUp(object sender, MouseEventArgs e) 
    { 
     isDragging = false; 

     this.Capture = false; 

     this.MouseMove -= new MouseEventHandler(OnDrag); 
    } 

그러나 이전 솔루션은 원하는대로 더 많이 작동합니다.

+0

답장을 보내 주셔서 감사합니다. 친절하게도 '빠른 제안 솔루션'에 대해 자세히 설명해 주시겠습니까? 내가 너 무슨 뜻인지 정확히 이해했는지 모르겠다. –

+0

그래도이 문제가 발생했습니다. –

+0

Lucas에게 도움을 주셔서 감사합니다. 불행히도 이것 역시 작동하지 않았습니다. PictureBox 클래스의 결함 일 가능성이 큽니다. 나는 노력에 대한 답을 표시 할 것입니다. 아마도 미래의 다른 사람에게 도움이 될 것입니다. 많은 감사합니다! –

관련 문제