나는 어떻게 발생하는 패널 스크롤를 사용하여 프로그래밍 방식으로 표시 AutoSized 그림 상자
-
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);