문제

그래서 Google에서 약간 검색하여 마우스로 버튼을 드래그하는 코드를 찾았습니다. 나는 이것들 중 어느 것도 실제로 나를 위해 일하지 않았지만 많은 것을 발견했습니다.

그래서 나는 당신에게 묻습니다! :-)

내 양식으로 작업하려는 코드 :

bool isDragged = false;
  Point ptOffset;
  private void button1_MouseDown( object sender, MouseEventArgs e )
  {
     if ( e.Button == MouseButtons.Left )
     {
        isDragged = true;
        Point ptStartPosition = button1.PointToScreen(new Point(e.X, e.Y));

        ptOffset = new Point();
        ptOffset.X = button1.Location.X - ptStartPosition.X;
        ptOffset.Y = button1.Location.Y - ptStartPosition.Y;
     }
     else
     {
        isDragged = false;
     }
  }

  private void button1_MouseMove( object sender, MouseEventArgs e )
  {
     if ( isDragged )
     {
        Point newPoint = button1.PointToScreen(new Point(e.X, e.Y));
        newPoint.Offset(ptOffset);
        button1.Location = newPoint;
     }
  }

  private void button1_MouseUp( object sender, MouseEventArgs e )
  {
     isDragged = false;
  }

물론 그림 박스 1을 버튼 1으로 변경했습니다.

그러나 나는 이것을 작동시킬 수 없습니다.

이유를 아는 사람이 있습니까?

아, 그리고 모든 버튼에서 이것을 사용하고 싶습니다. 그래서 모든 버튼에서 작동하도록 button1을 어떻게 바꿔야합니까?

-BTW, 나는 Visual Studio Express를 사용합니다.

미리 감사드립니다!

도움이 되었습니까?

해결책

Windows 양식에 관해서는 실제로 붙여 넣기 만 복사하더라도

당신이 게시 한 코드는 실제로 그 자체로 아무것도하지 않을 것입니다!

작동하려면 컨트롤의 Mousedown () 및 MouseMove () 이벤트는 이러한 방법에 연결되어야합니다.

  1. 양식 (PictureBox1)에서 컨트롤을 선택하십시오.
  2. 속성 창 (기본적으로 오른쪽 하단)에서 "Lightning Bolt"아이콘을 클릭하여 해당 제어의 이벤트 목록을 얻으십시오.
  3. 찾아보세요 MouseDown 드롭 다운을 오른쪽으로 입력하고 변경하십시오. pictureBox1_MouseDown.
  4. 찾아보세요 MouseMove 드롭 다운을 오른쪽으로 입력하고 변경하십시오. pictureBox1_MouseMove.

이제 실행하고 PictureBox1을 드래그하십시오.

편집 : 아래의 주석에 설명 된대로 여러 컨트롤에 대한 코드가 작동하는 방법은 다음과 같습니다.

    bool isDragged = false;
    Point ptOffset;

    private void button1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            isDragged = true;
            Button btn = (Button)sender;
            ptOffset = new Point(btn.Location.X - Cursor.Position.X, btn.Location.Y - Cursor.Position.Y);
        }
        else
        {
            isDragged = false;
        }
    }

    private void button1_MouseMove(object sender, MouseEventArgs e)
    {
        if (isDragged)
        {
            Point newPoint = Cursor.Position;
            newPoint.Offset(ptOffset);
            Button btn = (Button)sender;
            btn.Location = newPoint;
        }
    }

    private void button1_MouseUp(object sender, MouseEventArgs e)
    {
        isDragged = false;
    }

다른 팁

좋아, 좋은 소식 : 바라건대 우리는 당신이 완료되면 우리는 CSI 데스크탑 레이아웃을 가질 것입니다.

너무 좋은 소식 : 나는 당신이 잘못된 일을하려고한다고 생각합니다.

WinForms를 사용하고 있다고 가정하지만 WPF의 아이디어는 동일해야합니다. 프로그램을 실행할 때 레이아웃이 설정됩니다 (예 : 창 크기를 조정할 때 또는 정적으로는 Absolute X, Y 위치로 설정할 때 정적으로 변경).

당신이하고 싶은 것은 일종의 것입니다 : 나는 그들에게 모든 보일러 플레이트 코드를 만드는 이점을 얻고 싶지만, 런타임에 동적으로 변경하고 싶습니다 ...

나는 당신이 당신의 접근 방식을 다시 생각하고 한 번에 한 단계 씩 가져 가야한다고 생각합니다. GUI가 나옵니다).

아기 발걸음을 내딛지 만 큰 그림을 명심하십시오.

  • 캔버스를 정의하는 것으로 시작하십시오.
  • 그런 다음 버튼을 놓을 수 있습니다.
  • 그런 다음 캔버스에서 그 버튼을 움직여 바보를 바보로 바보입니다. (질문에있는 코드는 캔버스의 객체에 대해 작동해야합니다).

거기에서 목적지에 더 가까이 갈 수있는 조치를 계속 받으십시오 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top