如何将PictureBox置于ScrollableControl中心,然后在调整大小时自动滚动

时间:2014-07-22 07:24:54

标签: vb.net winforms user-controls scroll

尝试将视图置于ScrollableControl内部元素中心时遇到一些麻烦。

我在ScrollableControl中控制控件没有问题,但每当我尝试设置AutoScrollPosition时,滚动容器内的元素会停靠在ScrollableControl最里面容器的右下角。

这是我正在使用的代码(我非常确定数学是正确的):

MyBase.AutoScrollPosition = New System.Drawing.Point(Canvas1.Left - ((MyBase.Width - Canvas1.Size.Width) / 2), Canvas1.Top - ((MyBase.Height - Canvas1.Size.Height) / 2))

项目的类型实际上是UserControl,而不是Class,因此这不是“继承的”ScrollableControl本身。它是UserControl类型。

我发现最令人头晕目眩的是,似乎没有ScrollToX,只有ScrollControlIntoView等等,这些都不符合我的意愿。

基本上,最终结果是,Viewable区域的中心必须是Scrollable虚拟区域内包含的Control的中心。我将控件置于中心位置,所以这实际上只是将其滚动到视图中,因此内部控件死点的X,Y位于可视区域的死点。

整个班级的当前代码

Board.vb

Imports System.ComponentModel

Public Class Board

    Private _init As Boolean = False

    Private _keys As KeyEventArgs = Nothing

    ''' <summary>
    ''' </summary>
    ''' <filterpriority>3</filterpriority>
    ''' <remarks></remarks>
    <Browsable(False), EditorBrowsable(False)> _
    Shadows Property BackgroundImage As Image
        Get
            Return MyBase.BackgroundImage
        End Get
        Set(value As Image)
            MyBase.BackgroundImage = value
        End Set
    End Property

    <Browsable(False), EditorBrowsable(False)> _
    Shadows Property AutoScroll As Boolean
        Get
            Return MyBase.AutoScroll
        End Get
        Set(value As Boolean)
            MyBase.AutoScroll = value
        End Set
    End Property

    <Browsable(False), EditorBrowsable(False)> _
    Shadows Property AutoScrollMinSize As System.Drawing.Size
        Get
            Return MyBase.AutoScrollMinSize
        End Get
        Set(value As System.Drawing.Size)
            MyBase.AutoScrollMinSize = value
        End Set
    End Property

    Public Property Checkerboard As Boolean
        Get
            Return Canvas1.CheckeredBackground
        End Get
        Set(value As Boolean)
            Canvas1.CheckeredBackground = value
        End Set
    End Property

    Shadows Property BorderStyle As Windows.Forms.BorderStyle
        Get
            Return Canvas1.BorderStyle
        End Get
        Set(value As Windows.Forms.BorderStyle)
            Canvas1.BorderStyle = value
        End Set
    End Property

    Private Sub Canvas1_MouseEnter(sender As Object, e As EventArgs) Handles Canvas1.MouseEnter
        Me.Focus()
    End Sub

    Public Sub Add(ByVal Image As System.Drawing.Image)
        Dim l As New Layer("Layer " & Canvas1.Layers.Count + 1)
        l.Graphics.Add(New Graphic(Image, New Point(10, 10)))
        Canvas1.Layers.Add(l)
    End Sub

    Public Property CanvasSize() As System.Drawing.Size
        Get
            Return Canvas1.Size
        End Get
        Set(value As System.Drawing.Size)
            Canvas1.Size = value
            Me.CenterCanvas()
        End Set
    End Property

    Public Property BoardSize() As System.Drawing.Size
        Get
            Return Me.AutoScrollMinSize
        End Get
        Set(value As System.Drawing.Size)
            Me.AutoScrollMinSize = value
            Me.CenterCanvas()
        End Set
    End Property

    Public Function Remove(ByVal Index As Integer) As Boolean
        Try
            Canvas1.Layers.RemoveAt(Index)
            Return True
        Catch ex As Exception
            Return False
        End Try
    End Function

    Public Sub RefreshCanvas()
        Canvas1.Invalidate()
    End Sub

    Public Sub CenterCanvas()
        Canvas1.Location = New System.Drawing.Point((MyBase.DisplayRectangle.Width - Canvas1.Size.Width) / 2, (MyBase.DisplayRectangle.Height - Canvas1.Size.Height) / 2)


        'Debug.Print(Canvas1.Top & ", " & Canvas1.Left)

        '        Dim y As Integer = (Me.Height - Canvas1.Height) / 2
        '        Dim x As Integer = (Me.Width - Canvas1.Width) / 2
        '        x = Canvas1.Left - x
        '        y = Canvas1.Top - y


        '        Me.AutoScrollPosition = New System.Drawing.Point(x, y)
    End Sub

    Public Sub New()

        ' This call is required by the designer.

        InitializeComponent()
        _init = True
        ' Add any initialization after the InitializeComponent() call.
        Me.CenterCanvas()
    End Sub

    Private Sub Board_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
        _keys = e
    End Sub

    Private Sub Board_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
        _keys = Nothing
    End Sub

    Private Sub Board_MouseWheel(sender As Object, e As MouseEventArgs) Handles Me.MouseWheel
        Dim l As Layer

        l = Canvas1.SelectedLayer
        If IsNothing(l) = False Then
            Debug.Print("Wheels")
        End If

        Dim MW As HandledMouseEventArgs = e
        MW.Handled = False
    End Sub

    Private Sub Board_Resize(sender As Object, e As EventArgs) Handles Me.Resize
        '       If _init Then
        ' Dim x As Integer = Canvas1.Left - ((MyBase.Width - Canvas1.Size.Width) / 2)
        'Dim y As Integer = Canvas1.Top - ((MyBase.Height - Canvas1.Size.Height) / 2)
        '           MyBase.AutoScrollPosition = New System.Drawing.Point(Canvas1.Left - ((MyBase.Width - Canvas1.Size.Width) / 2), Canvas1.Top - ((MyBase.Height - Canvas1.Size.Height) / 2))
        'End If

        MyBase.AutoScrollPosition = New System.Drawing.Point( _
                Canvas1.Left - MyBase.AutoScrollPosition.X - ((MyBase.ClientSize.Width - Canvas1.Size.Width) \ 2), _
                Canvas1.Top - MyBase.AutoScrollPosition.Y - ((MyBase.ClientSize.Height - Canvas1.Size.Height) \ 2))
    End Sub

    Private Sub Board_SizeChanged(sender As Object, e As EventArgs) Handles Me.SizeChanged

    End Sub
End Class

Board.Designer.vb

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Board
    Inherits System.Windows.Forms.UserControl

    'UserControl1 overrides dispose to clean up the component list.
    <System.Diagnostics.DebuggerNonUserCode()> _
    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        Try
            If disposing AndAlso components IsNot Nothing Then
                components.Dispose()
            End If
        Finally
            MyBase.Dispose(disposing)
        End Try
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.Canvas1 = New Artisto.Canvas()
        CType(Me.Canvas1, System.ComponentModel.ISupportInitialize).BeginInit()
        Me.SuspendLayout()
        '
        'Canvas1
        '
        Me.Canvas1.Anchor = System.Windows.Forms.AnchorStyles.None
        Me.Canvas1.CheckeredBackground = True
        Me.Canvas1.Location = New System.Drawing.Point(0, 0)
        Me.Canvas1.Name = "Canvas1"
        Me.Canvas1.SelectedLayer = Nothing
        Me.Canvas1.Size = New System.Drawing.Size(619, 317)
        Me.Canvas1.TabIndex = 0
        Me.Canvas1.TabStop = False
        '
        'Board
        '
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit
        Me.AutoScroll = True
        Me.AutoScrollMinSize = New System.Drawing.Size(4096, 2160)
        Me.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink
        Me.Controls.Add(Me.Canvas1)
        Me.DoubleBuffered = True
        Me.Name = "Board"
        Me.Size = New System.Drawing.Size(1266, 523)
        CType(Me.Canvas1, System.ComponentModel.ISupportInitialize).EndInit()
        Me.ResumeLayout(False)

    End Sub
    Friend WithEvents Canvas1 As Artisto.Canvas

End Class

0 个答案:

没有答案