У меня есть рисованный владельцем PictureBox (picGrid
), и я хочу, чтобы пользователь мог изменять масштаб с помощью колесика мыши. Эта часть проста. Но я хочу автоматически прокрутить так, чтобы логическая точка под мышью была все еще логическая точка под мышью после увеличения.
Вот что у меня есть до сих пор. Это почти работает, но просто не правильно. XScroll
и YScroll
являются моими позициями прокрутки и будут использоваться для установки полосы прокрутки (в дополнение к смещению изображения).
/// <summary>
/// Sets the current zoom percent.
/// </summary>
/// <param name="percent">The percent that the zoom should be set (100 == 1:1 scaling).</param>
/// <param name="x">X coordinate of the mouse in pixels.</param>
/// <param name="y">Y coordinate of the mouse in pixels.</param>
public void SetZoom(int percent, int x, int y)
{
// If needed, this method translates mouse coordinate to logical coordinates
// but doesn't appear to be needed here.
//TranslateCoordinates(ref x, ref y);
// Calculate new scale (1.0f == 1:1 scaling)
float newDrawScale = (float)percent / 100;
// Enforce zoom limits
if (newDrawScale < 0.1f)
newDrawScale = 0.1f;
else if (newDrawScale > 1500.0f)
newDrawScale = 1500.0f;
// Set new zoom (if it's changed)
if (newDrawScale != DrawScale)
{
DrawScale = newDrawScale;
// *** Here's the part that isn't right ***
// Scroll to keep same logical point under mouse
float delta = (DrawScale - 1f);
XScroll = (x * delta);
YScroll = (y * delta);
// Reflect change in scrollbars
UpdateScrollbars();
// Redraw content
picGrid.Invalidate();
}
}
Как рассчитать новую позицию прокрутки, чтобы она соответствовала Логическая точка остается под указателем мыши после увеличения?