主题:这种曲线控件能否做出?
xinying2005
[专家分:0] 发布于 2005-11-03 15:21:00
只要曲线的始末点及移动过程中的某一点知道,则自动画出平滑的曲线控件。 始点即鼠标落下的点,末点即鼠标抬起的点,某一点即鼠标移动过程中记下的某一点。
请问这种控件能否做出?
我设计的一部分程序如下:
但运行后只是出现一方框,没达到预想的效果。
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个回复)
沙发
xinying2005 [专家分:0] 发布于 2005-11-03 15:23:00
全部的程序如下:
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
请赐教!
我来回复