Stu*_*wig 7 c# panel picturebox winforms
我有一个设置为AutoSize的图片框,以便图像强制它增长到图像的完整大小.
图片框位于autoScroll = 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;
}
Run Code Online (Sandbox Code Playgroud)
我的逻辑是错误的还是我对面板滚动功能的理解错了?
它是跳跃的,因为滚动面板的动作将通过滚动量甩掉鼠标位置.你可以得到"真正的"鼠标位置(相对于面板的左上角),如下所示:
Point realPos = new Point(e.X + panel1.AutoScrollPosition.X,
e.Y + panel1.AutoScrollPosition.Y);
Run Code Online (Sandbox Code Playgroud)
假设图片框'Location属性为(0,0).滚动面板的最佳方法是设置其AutoScrollPosition属性.
我相信您的直觉是正确的,但您的错误是尝试调整滚动条而不是在可滚动面板内移动 PictureBox。
\n\n您应该拦截 MouseMove 并通过鼠标移动增量 \xe2\x80\x94 调整 PictureBox 的 Location 属性,滚动条应自动更新以反映图像在其中的新位置。
\n\n更新您的代码将类似于以下内容(未经测试):
\n\nprivate void pictureBox1_MouseMove(object sender, MouseEventArgs e)\n{\n if (dragging)\n {\n if (e.Button == MouseButtons.Left)\n {\n int horizontalChange = (e.X - startingX) * -1; // move the image inverse to direction dragged\n\n int verticalChange = (e.Y - startingY);\n\n pictureBox1.Left += horizontalChange;\n pictureBox1.Top += verticalChange;\n }\n }\n\n startingX = e.X;\n startingY = e.Y;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n(另外,我倾向于在拖动开始时记录鼠标和 PictureBox 的起始位置,并相对于每个 MouseMove 事件上的起始位置更新它们,而不是像上面的代码(以及您的原始代码那样)进行增量更改。这样做的原因是,如果有任何意外的值,无论出于何种原因,那么这只会导致暂时的效果 \xe2\x80\x94 下一个好的事件将自我纠正。)
\n 归档时间: |
|
查看次数: |
8077 次 |
最近记录: |