在VB.net中运行时绘制文本框并编制索引

时间:2014-08-05 15:05:21

标签: vb.net

如何在运行时绘制文本框并让它在vb.net中拥有自己的索引?我试图像Microsoft PowerPoint如何绘制其文本框一样。你能帮我解决这个问题吗?

编辑:我附上了一张我真正想问你的照片。对不起,我无法正确地说出来。这是PP中单张幻灯片的照片。注意文本框的边缘,可以调整大小并编辑右边的文本吗?这就是我想在VB.net中做的事情。任何帮助人? Screenshot of a textbox in PP

2 个答案:

答案 0 :(得分:0)

也许这可以让你开始......

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim yCoord As Integer

        For count As Integer = 0 To 10
            Dim tBox As New TextBox()
            yCoord += 20
            Me.Controls.Add(tBox)
            tBox.Location = New Point(0, yCoord)
            tBox.Name = "tBox" & count.ToString()
        Next
    End Sub
End Class

答案 1 :(得分:0)

您可以尝试使用可调整大小的UserControl。

创建一个新的UserControl作为模板(德语,但你会发现它):

enter image description here

BorderStyle设置为FixedSingle

Label添加UserControl。我称之为lblInner

enter image description here

现在进行一些编码,包括使用鼠标句柄在运行时调整UserControl的可能性。请注意,调整大小的代码使用Charles P.的以下优秀Stack Overflow答案:

Custom Resize Handle in Border-less Form C#

Public Class MyBoxLabel

#Region "Constructor"
    Public Sub New()

        ' Dieser Aufruf ist für den Designer erforderlich.
        InitializeComponent()

        ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.


        Me.lblInner.AutoSize = False
        Me.lblInner.TextAlign = ContentAlignment.MiddleCenter
        'Need a free border at the sides, or the mouse actions will not work properly
        Me.lblInner.Location = New Point(3, 3)
        Me.lblInner.Size = New Size(Me.ClientSize.Width - 7, Me.ClientSize.Height - 7)
        Me.lblInner.Anchor = AnchorStyles.Left Or AnchorStyles.Bottom Or AnchorStyles.Right Or AnchorStyles.Top
    End Sub
#End Region

#Region "Properties"
    ''' <summary>
    ''' Allows you to change the inner text
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property InnerText As String
        Set(value As String)
            Me.lblInner.Text = value
        End Set
        Get
            Return Me.lblInner.Text
        End Get
    End Property

    ''' <summary>
    ''' Allows you to change the inner font
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property InnerFont As Font
        Set(value As Font)
            Me.lblInner.Font = value
        End Set
        Get
            Return Me.lblInner.Font
        End Get
    End Property

    'Add further properties as needed
#End Region

#Region "Constants"
    Const WM_NCHITTEST As UInt32 = &H84
    Const WM_MOUSEMOVE As UInt32 = &H200

    Const HTLEFT As UInt32 = 10
    Const HTRIGHT As UInt32 = 11
    Const HTBOTTOMRIGHT As UInt32 = 17
    Const HTBOTTOM As UInt32 = 15
    Const HTBOTTOMLEFT As UInt32 = 16
    Const HTTOP As UInt32 = 12
    Const HTTOPLEFT As UInt32 = 13
    Const HTTOPRIGHT As UInt32 = 14

    Const RESIZE_HANDLE_SIZE As Integer = 10
#End Region

#Region "Handling of Window Messages to allow resizing of the UserControl"
    Protected Overrides Sub WndProc(ByRef m As Message)

        Dim handled As Boolean = False
        If m.Msg = WM_NCHITTEST OrElse m.Msg = WM_MOUSEMOVE Then
            Dim formSize As Size = Me.Size
            Dim screenPoint As New Point(m.LParam.ToInt32())
            Dim clientPoint As Point = Me.PointToClient(screenPoint)

            Dim boxes As New Dictionary(Of UInt32, Rectangle)() From { _
                {HTBOTTOMLEFT, New Rectangle(0, formSize.Height - RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE)}, _
                {HTBOTTOM, New Rectangle(RESIZE_HANDLE_SIZE, formSize.Height - RESIZE_HANDLE_SIZE, formSize.Width - 2 * RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE)}, _
                {HTBOTTOMRIGHT, New Rectangle(formSize.Width - RESIZE_HANDLE_SIZE, formSize.Height - RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE)}, _
                {HTRIGHT, New Rectangle(formSize.Width - RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, formSize.Height - 2 * RESIZE_HANDLE_SIZE)}, _
                {HTTOPRIGHT, New Rectangle(formSize.Width - RESIZE_HANDLE_SIZE, 0, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE)}, _
                {HTTOP, New Rectangle(RESIZE_HANDLE_SIZE, 0, formSize.Width - 2 * RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE)}, _
                {HTTOPLEFT, New Rectangle(0, 0, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE)}, _
                {HTLEFT, New Rectangle(0, RESIZE_HANDLE_SIZE, RESIZE_HANDLE_SIZE, formSize.Height - 2 * RESIZE_HANDLE_SIZE)} _
            }

            For Each hitBox As KeyValuePair(Of UInt32, Rectangle) In boxes
                If hitBox.Value.Contains(clientPoint) Then
                    m.Result = CType(hitBox.Key, IntPtr)
                    handled = True
                    Exit For
                End If
            Next
        End If

        If Not handled Then
            MyBase.WndProc(m)
        End If
    End Sub
#End Region

End Class

编译您的项目。

在您的工具箱中,您将找到新的UserControl。将其添加到您的表单并启动您的应用程序。将鼠标移动到控件的边缘时,您将看到典型的调整大小鼠标光标。使用这些来调整控件的大小。由于标签的Anchor属性和TextAlign

,文字将保持居中