/// <summary> /// Updates vertical and horizontal scrollbars to correspond to the current visible and canvas /// dimensions</summary> /// <param name="vScrollBar">Vertical ScrollBar, or null if none</param> /// <param name="hScrollBar">Horizontal ScrollBar, or null if none</param> protected virtual void UpdateScrollBars(VScrollBar vScrollBar, HScrollBar hScrollBar) { Size canvasSizeInPixels = GetCanvasSize(); RectangleF clientRect = VisibleClientRectangle; Size viewSizeInPixels = new Size((int)clientRect.Width, (int)clientRect.Height); WinFormsUtil.UpdateScrollbars( vScrollBar, hScrollBar, viewSizeInPixels, canvasSizeInPixels); }
private void UpdateScrollbars() { if (m_updatingScrollbars) { return; } try { m_updatingScrollbars = true; // get view rectangle in Windows client coordinates Rectangle viewRect = AdaptedControl.ClientRectangle; // get canvas bounds in Windows client coordinates Rectangle canvasRect = m_canvasAdapter.Bounds; // start with world coordinates PointF scale = m_transformAdapter.Scale; // Calculate the negation of the translation, by allowing the translation to range far // enough so that the edge of the canvas can get to the center of the screen. int minTransX = (int)(canvasRect.X * scale.X - viewRect.Width * 0.5f); int minTransY = (int)(canvasRect.Y * scale.Y - viewRect.Height * 0.5f); int maxTransX = (int)(canvasRect.Right * scale.X - viewRect.Width * 0.5f); int maxTransY = (int)(canvasRect.Bottom * scale.Y - viewRect.Height * 0.5f); canvasRect = new Rectangle(minTransX, minTransY, maxTransX - minTransX, maxTransY - minTransY); WinFormsUtil.UpdateScrollbars( m_vScrollBar, m_hScrollBar, viewRect, canvasRect); // Set the scrollbars' values to be the negation of the translation. if (!m_hScrollBar.Capture && !m_vScrollBar.Capture) { PointF translation = m_transformAdapter.Translation; m_hScrollBar.Value = Math.Min(Math.Max(m_hScrollBar.Minimum, -(int)translation.X), m_hScrollBar.Maximum); m_vScrollBar.Value = Math.Min(Math.Max(m_vScrollBar.Minimum, -(int)translation.Y), m_vScrollBar.Maximum); } } finally { m_updatingScrollbars = false; } }
private Rectangle UpdateScrollbars() { // get canvas size, in client coordinates Size canvasSize = m_canvasAdapter.Bounds.Size; PointF scale = m_transformAdapter.Scale; Size canvasSizeInPixels = new Size( (int)(canvasSize.Width * scale.X), (int)(canvasSize.Height * scale.Y)); // get window bounds to allow for scrollbars without obscuring any of canvas Rectangle windowBounds = AdaptedControl.ClientRectangle; try { m_updatingScrollbars = true; WinFormsUtil.UpdateScrollbars( m_vScrollBar, m_hScrollBar, windowBounds.Size, canvasSizeInPixels); if (!m_hScrollBar.Capture && !m_vScrollBar.Capture) { PointF translation = m_transformAdapter.Translation; m_hScrollBar.Value = Math.Min(Math.Max(m_hScrollBar.Minimum, -(int)translation.X), m_hScrollBar.Maximum); m_vScrollBar.Value = Math.Min(Math.Max(m_vScrollBar.Minimum, -(int)translation.Y), m_vScrollBar.Maximum); } } finally { m_updatingScrollbars = false; } return(windowBounds); }
public void TestUpdateScrollbars() { var vBar = new VScrollBar(); var hBar = new HScrollBar(); Rectangle visibleArea, contentArea, finalVisible; // Visible area surrounds content area, so scrollbars are not required contentArea = new Rectangle(0, 0, 100, 100); visibleArea = contentArea; visibleArea.Inflate(20, 20); finalVisible = WinFormsUtil.UpdateScrollbars(vBar, hBar, visibleArea, contentArea); Assert.False(vBar.Visible); Assert.False(hBar.Visible); Assert.AreEqual(visibleArea, finalVisible); // Visible area is inside content area, so scrollbars are required contentArea = new Rectangle(0, 0, 100, 100); visibleArea = contentArea; visibleArea.Inflate(-20, -20); finalVisible = WinFormsUtil.UpdateScrollbars(vBar, hBar, visibleArea, contentArea); Assert.True(vBar.Visible); Assert.True(hBar.Visible); Assert.True(finalVisible.Width < visibleArea.Width); Assert.True(finalVisible.Height < visibleArea.Height); Assert.True(hBar.Minimum == contentArea.Left); Assert.True(hBar.Maximum == contentArea.Right); Assert.True(vBar.Minimum == contentArea.Top); Assert.True(vBar.Maximum == contentArea.Bottom); // Visible area surrounds content area, so scrollbars are not required. Uses negative coordinates. contentArea = new Rectangle(-1000, 0, 100, 100); visibleArea = contentArea; visibleArea.Inflate(20, 20); finalVisible = WinFormsUtil.UpdateScrollbars(vBar, hBar, visibleArea, contentArea); Assert.False(vBar.Visible); Assert.False(hBar.Visible); Assert.AreEqual(visibleArea, finalVisible); // Visible area is inside content area, so scrollbars are required. Uses negative coordinates. contentArea = new Rectangle(-1000, 0, 100, 100); visibleArea = contentArea; visibleArea.Inflate(-20, -20); finalVisible = WinFormsUtil.UpdateScrollbars(vBar, hBar, visibleArea, contentArea); Assert.True(vBar.Visible); Assert.True(hBar.Visible); Assert.True(finalVisible.Width < visibleArea.Width); Assert.True(finalVisible.Height < visibleArea.Height); Assert.True(hBar.Minimum == contentArea.Left); Assert.True(hBar.Maximum == contentArea.Right); Assert.True(vBar.Minimum == contentArea.Top); Assert.True(vBar.Maximum == contentArea.Bottom); // Visible area is to the left of content area, so scrollbars are required contentArea = new Rectangle(1000, 0, 100, 100); visibleArea = new Rectangle(0, 0, 100, 100); finalVisible = WinFormsUtil.UpdateScrollbars(vBar, hBar, visibleArea, contentArea); Assert.True(vBar.Visible); Assert.True(hBar.Minimum == visibleArea.Left); Assert.True(hBar.Maximum == contentArea.Right); Assert.True(vBar.Minimum == contentArea.Top); Assert.True(vBar.Maximum == contentArea.Bottom); // Zero visible area! contentArea = new Rectangle(1000, 1000, 100, 100); visibleArea = new Rectangle(); WinFormsUtil.UpdateScrollbars(vBar, hBar, visibleArea, contentArea); Assert.True(vBar.Visible); Assert.True(hBar.Visible); // Zero content area, off screen. visibleArea = new Rectangle(1000, 1000, 100, 100); contentArea = new Rectangle(10, 20, 0, 0); WinFormsUtil.UpdateScrollbars(vBar, hBar, visibleArea, contentArea); Assert.True(vBar.Visible); Assert.True(hBar.Visible); // Zero content area, on screen. visibleArea = new Rectangle(1000, 1000, 100, 100); contentArea = new Rectangle(1000, 1000, 0, 0); WinFormsUtil.UpdateScrollbars(vBar, hBar, visibleArea, contentArea); Assert.False(vBar.Visible); Assert.False(hBar.Visible); // The scrollbars are optional. contentArea = new Rectangle(-1000, 0, 100, 100); visibleArea = contentArea; visibleArea.Inflate(-20, -20); finalVisible = WinFormsUtil.UpdateScrollbars(null, null, visibleArea, contentArea); Assert.AreEqual(visibleArea, finalVisible); }