Пример #1
0
        /// <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);
        }
Пример #2
0
        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;
            }
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }