나는 어떻게 발생하는 패널 스크롤를 사용하여 프로그래밍 방식으로 표시 AutoSized 그림 상자

StackOverflow https://stackoverflow.com/questions/1803191

  •  05-07-2019
  •  | 
  •  

문제

나는 그림자 설정하면 자동 크기 조정이는 이미지 그것을 강제로 성장할 이미지의 크기입니다.

그림자에서 패널 스크롤=true,그렇게 스크롤 막대가 표시되면 그림이 보다 큰 패널이 있습니다.

어떻게 프로그래밍 방식으로 스크롤 패널은 사용자로 클릭하면 드래그에 이미지에 재배치함으로써 이미지입니다.

나는 시도를 사용 MouseMove 이벤트를 캡처,마지막 X 및 Y 위치 마우스,계산하는 방법을 많 마우스 이동 및 조정 수직 및 수평 스크롤 값의 패널이 있습니다.

이는 이미지를 이동,하지만 그 모든 장소,와 스크롤 예기치 못.

내가 어떻게 이것을 달성할 수?

여기에 무엇이 내가 내 마우스 이벤트...

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (dragging)
    {
        if (e.Button == MouseButtons.Left)
        {
            // move the image inverse to direction dragged
            int horizontalChange = (e.X - startingX) * -1;  
            int newHorizontalPos = panel1.HorizontalScroll.Value + horizontalChange;

            if (newHorizontalPos < panel1.HorizontalScroll.Minimum)
            {
                newHorizontalPos = panel1.HorizontalScroll.Minimum;
                horizontalChange = 0;
            }

            if (newHorizontalPos > panel1.HorizontalScroll.Maximum)
            {
                newHorizontalPos = panel1.HorizontalScroll.Maximum;
                horizontalChange = 0;
            }

            panel1.HorizontalScroll.Value = newHorizontalPos;

            int verticalChange = (e.Y - startingY);
            // move the image inverse to direction dragged
            int newverticalPos = panel1.VerticalScroll.Value + verticalChange * -1;  

            if (newverticalPos < panel1.VerticalScroll.Minimum)
            {
                newverticalPos = panel1.VerticalScroll.Minimum;
                verticalChange = 0;
            }

            if (newverticalPos > panel1.VerticalScroll.Maximum)
            {
                newverticalPos = panel1.VerticalScroll.Maximum;
                verticalChange = 0;
            }

            panel1.VerticalScroll.Value = newverticalPos;
        }
    }

    startingX = e.X;
    startingY = e.Y;
}

나의 논리를 잘못된 또는 나의 이해를 위원회의 스크롤 기능을 잘못입니까?

도움이 되었습니까?

해결책

내가 믿는 너의 본능이 올바른지만 당신의 실수를 시도를 조정하는 스크롤 막대가 아닌 이동 PictureBox 에 스크롤 패널이 있습니다.

차단해야 합 MouseMove 및 조정 PictureBox 의 위치하여 숙박 시설에 마우스 움직임 델타—스크롤바가 자동으로 업데이트를 반영한 이미지의 새로운 위치에 있습니다.

업데이트 코드 같은 것을 볼 것입니다 tho 다음과 같은(이 검증되지 않은):

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (dragging)
    {
        if (e.Button == MouseButtons.Left)
        {
            int horizontalChange = (e.X - startingX) * -1;  // move the image inverse to direction dragged

            int verticalChange = (e.Y - startingY);

            pictureBox1.Left += horizontalChange;
            pictureBox1.Top += verticalChange;
        }
    }

    startingX = e.X;
    startingY = e.Y;
}

(또한,나는 경향이 있을 것 이라고 기록을 시작 마우스 PictureBox 위치의 시작에서 드래그 및 업데이트들을 상대하는 이 시작 위치에서 각 MouseMove 이벤트보다는 조금씩 변경으로 위의 코드(고 너의 원래 코드는 않습니다).그 이유가있는 경우 예기치 않은 값이 어떤 이유로,다음이 유일한 원인이 일시적인 효과는 다음에 좋은 이벤트가 자체적으로 해결됩니다.)

다른 팁

그것은 뛰기 때문에 행동 스크롤 패널을 던져 마우스 위치에 의해 스크롤 금액입니다.당신이 얻을 수 있습니다"진짜"마우스위치(상대부터 왼쪽 상단 모서리 위원회의)이와 같은:

  Point realPos = new Point(e.X + panel1.AutoScrollPosition.X,
    e.Y + panel1.AutoScrollPosition.Y);

가정하면 그림자의 위치성(0,0)입니다.가장 좋은 방법 스크롤 패널을 설정 AutoScrollPosition 을 제공합니다.

당신은 설정할 수 있습니다 위원회의 AutoScrollPosition 에 MouseMove 이벤트입니다.테스트 및 잘 작동합니다.

panel1.AutoScrollPosition = new Point(-panel1.AutoScrollPosition.X - e.X + startPoint.X, -panel1.AutoScrollPosition.Y - e.Y + startPoint.Y);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top