我有一个自定义控件,可以放大自定义绘制的文档画布。
我尝试使用 AutoScroll,但效果不理想。当我将 AutoScrollPosition 和 AutoScrollMinSize 设置为背靠背(以任何顺序)时,它会在每次缩放更改时强制绘制并导致抖动。我认为这是因为当我修改这两个属性时它正在调用更新而不是无效。
我现在手动设置 HorizontalScroll 和 VerticalScroll 属性,AutoScroll 设置为 false,就像每次缩放级别或客户端大小更改时一样:
int canvasWidth = (int)Math.Ceiling(Image.Width * Zoom) + PageMargins.Horizontal;
int canvasHeight = (int)Math.Ceiling(Image.Height * Zoom) + PageMargins.Vertical;
HorizontalScroll.Maximum = canvasWidth;
HorizontalScroll.LargeChange = ClientSize.Width;
VerticalScroll.Maximum = canvasHeight;
VerticalScroll.LargeChange = ClientSize.Height;
if (canvasWidth > ClientSize.Width)
{
HorizontalScroll.Visible = true;
}
else
{
HorizontalScroll.Visible = false;
HorizontalScroll.Value = 0;
}
if (canvasHeight > ClientSize.Height)
{
VerticalScroll.Visible = true;
}
else
{
VerticalScroll.Visible = false;
VerticalScroll.Value = 0;
}
int focusX = (int)Math.Floor((FocusPoint.X * Zoom) + PageMargins.Left);
int focusY = (int)Math.Floor((FocusPoint.Y * Zoom) + PageMargins.Top);
focusX = focusX - ClientSize.Width / 2;
focusY = focusY - ClientSize.Height / 2;
if (focusX < 0)
focusX = 0;
if (focusX > canvasWidth - ClientSize.Width)
focusX = canvasWidth - ClientSize.Width;
if (focusY < 0)
focusY = 0;
if (focusY > canvasHeight - ClientSize.Height)
focusY = canvasHeight - ClientSize.Height;
if (HorizontalScroll.Visible)
HorizontalScroll.Value = focusX;
if (VerticalScroll.Visible)
VerticalScroll.Value = focusY;
在这种情况下,FocusPoint是一个 PointF 结构,它保存用户关注的位图中的坐标(例如,当他们使用鼠标滚轮进行放大时,他们关注的是当时的当前鼠标位置)。此功能在大多数情况下都有效。
不起作用的是滚动条。如果用户尝试通过单击任一滚动条来手动滚动,它们都会继续返回 0。我没有在代码中的其他任何地方设置它们。我尝试在 OnScroll() 方法中编写以下内容:
if (se.ScrollOrientation == ScrollOrientation.VerticalScroll)
{
VerticalScroll.Value = se.NewValue;
}
else
{
HorizontalScroll.Value = se.NewValue;
}
Invalidate();
但这会导致一些非常不稳定的行为,包括轻弹和滚动出界。
我应该如何为 OnScroll 编写代码? 我已经尝试过 base.OnScroll 但在 AutoScroll 设置为 false 时它没有做任何事情。