回 帖 发 新 帖 刷新版面

主题:这种曲线控件能否做出?

只要曲线的始末点及移动过程中的某一点知道,则自动画出平滑的曲线控件。 始点即鼠标落下的点,末点即鼠标抬起的点,某一点即鼠标移动过程中记下的某一点。
请问这种控件能否做出?
我设计的一部分程序如下:
但运行后只是出现一方框,没达到预想的效果。
  Dim startX As Integer
    Dim startY As Integer
    Dim mX As Integer
    Dim mY As Integer
    Dim endX As Integer
    Dim endY As Integer
    Private Sub curve_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
        Dim p As New Pen(Color.FromArgb(255, 0, 100, 255), 1)
        Dim pen As New Pen(Color.FromArgb(255, 0, 100, 255), 5)
                 
'画箭头指向左下的曲线控件
         
                e.Graphics.DrawCurve(p, New Point() {New Point(startX, startY), New Point(mX, mY), New Point(endX, endY - 8)})
                pen.StartCap() = LineCap.ArrowAnchor
                e.Graphics.DrawLine(pen, endX, endY - 8, endX, endY)
      end sub

回复列表 (共1个回复)

沙发

全部的程序如下:
   Imports System.Drawing.Drawing2D
Public Class curve
    Inherits System.Windows.Forms.UserControl
    Dim typeC As Type
    Enum type
        upleft
        upright
        downleft
        downright
    End Enum
    Public Property settypeC() As Type
        Get
            Return typeC
        End Get
        Set(ByVal Value As Type)
            typeC = Value
        End Set
    End Property
#Region " Windows 窗体设计器生成的代码 "

    Public Sub New()
        MyBase.New()

        '该调用是 Windows 窗体设计器所必需的。
        InitializeComponent()

        '在 InitializeComponent() 调用之后添加任何初始化

    End Sub

    'UserControl1 重写 dispose 以清理组件列表。
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Windows 窗体设计器所必需的
    Private components As System.ComponentModel.IContainer

    '注意: 以下过程是 Windows 窗体设计器所必需的
    '可以使用 Windows 窗体设计器修改此过程。
    '不要使用代码编辑器修改它。
    Friend WithEvents Timer1 As System.Timers.Timer
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.Timer1 = New System.Timers.Timer
        CType(Me.Timer1, System.ComponentModel.ISupportInitialize).BeginInit()
        '
        'Timer1
        '
        Me.Timer1.Enabled = True
        Me.Timer1.SynchronizingObject = Me
        '
        'curve
        '
        Me.Name = "curve"
        CType(Me.Timer1, System.ComponentModel.ISupportInitialize).EndInit()

    End Sub

#End Region
    Dim startX As Integer
    Dim startY As Integer
    Dim mX As Integer
    Dim mY As Integer
    Dim endX As Integer
    Dim endY As Integer
    Private Sub curve_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
        Dim p As New Pen(Color.FromArgb(255, 0, 100, 255), 1)
        Dim pen As New Pen(Color.FromArgb(255, 0, 100, 255), 5)
        Select Case settypeC
            '画箭头指向左下的曲线控件
            Case type.downleft
                e.Graphics.DrawCurve(p, New Point() {New Point(startX, startY), New Point(mX, mY), New Point(endX, endY - 8)})
                pen.StartCap() = LineCap.ArrowAnchor
                e.Graphics.DrawLine(pen, endX, endY - 8, endX, endY)
                '画箭头指向右下的曲线控件
            Case type.downright
                pen.EndCap() = LineCap.ArrowAnchor
                e.Graphics.DrawCurve(pen, New Point() {New Point(startX, startY), New Point(mX, mY), New Point(endX, endY)})
                '画箭头指向左上的曲线控件
            Case type.upleft
                pen.StartCap = LineCap.ArrowAnchor
                e.Graphics.DrawCurve(pen, New Point() {New Point(startX, startY), New Point(mX, mY), New Point(endX, endY)})
                '画箭头指向右上的曲线控件
            Case type.upright
                pen.EndCap() = LineCap.ArrowAnchor
                e.Graphics.DrawCurve(pen, New Point() {New Point(startX, startY), New Point(mX, mY), New Point(endX, endY)})

        End Select


    End Sub

    Private Sub Timer1_Elapsed(ByVal sender As System.Object, ByVal e As System.Timers.ElapsedEventArgs) Handles Timer1.Elapsed
        Timer1.Interval = 1000
        Me.Refresh()
    End Sub

    Private Sub curve_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove

        mX = e.X
        mY = e.Y
    End Sub

    Private Sub curve_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
        startX = e.X
        startY = e.Y
    End Sub

    Private Sub curve_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp
        endX = e.X
        endY = e.Y
    End Sub

End Class


请赐教!

我来回复

您尚未登录,请登录后再回复。点此登录或注册