扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
'添加一个label标签名字label1 用来显示时间
成都创新互联10多年成都企业网站建设服务;为您提供网站建设,网站制作,网页设计及高端网站定制服务,成都企业网站建设及推广,对成都航空箱等多个方面拥有丰富的网站推广经验的网站建设公司。
'再添加一个timer控件 名字timer1 interval属性=1000 用来计时
'窗体添加代码
Dim t As Date '用来记录时间
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Timer1.Tick
t = t.AddSeconds(1)
Label1.Text = "登录时间:" t.TimeOfDay.ToString
End Sub
画面添加textbox1 timer1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Timer1.Interval = 1000
TextBox1.Text = "2011/12/07 10:35:00"
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
If IsDate(TextBox1.Text) = True Then
Timer1.Start()
End If
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If Format(Now, "yyyy/MM/dd hh:mm:ss") = TextBox1.Text Then
MsgBox("It's time to go")
Timer1.Stop()
End If
End Sub
这个比较麻烦,我曾经写过这么个程序片段,现在贴上来,代码比较复杂
Shape1是时钟的一个框,是Shape控件,设置 Height 1455 Width 1575
LineHour,LineMinute,LineSecond分别为时,分,秒针,为Line控件
Label3,Label6,Label9,Label12为Label控件,分别为3.6.912点的显示数字
再画个Timer控件,Interval设置为1000
以上控件位置随便放,代码里调整
Form_Load事件里写
Shape1.Top = 100
Shape1.Left = Me.Width - 1800
LineHour.X1 = Shape1.Left + Shape1.Width / 2
LineHour.Y1 = Shape1.Top + Shape1.Height / 2
LineMinute.X1 = Shape1.Left + Shape1.Width / 2
LineMinute.Y1 = Shape1.Top + Shape1.Height / 2
LineSecond.X1 = Shape1.Left + Shape1.Width / 2
LineSecond.Y1 = Shape1.Top + Shape1.Height / 2
Label3.Left = Shape1.Left + Shape1.Width - Label3.Width - 200
Label3.Top = Shape1.Top + (Shape1.Height - Label3.Height) / 2
Label6.Left = Shape1.Left + (Shape1.Width - Label6.Width) / 2
Label6.Top = Shape1.Top + Shape1.Height - Label6.Height + 20
Label9.Left = Shape1.Left + 200
Label9.Top = Shape1.Top + (Shape1.Height - Label9.Height) / 2
Label12.Left = Shape1.Left + (Shape1.Width - Label12.Width) / 2
Label12.Top = Shape1.Top + 100
Timer事件里写
'利用Label显示数字
If Shape1.Visible True Then Shape1.Visible = True
If LineHour.Visible True Then LineHour.Visible = True
If LineMinute.Visible True Then LineMinute.Visible = True
If LineSecond.Visible True Then LineSecond.Visible = True
If Label3.Visible True Then Label3.Visible = True
If Label6.Visible True Then Label6.Visible = True
If Label9.Visible True Then Label9.Visible = True
If Label12.Visible True Then Label12.Visible = True
Dim cx As Single, cy As Single '圆心坐标
cx = Shape1.Left + Shape1.Width / 2
cy = Shape1.Top + Shape1.Height / 2
'利用Line控件绘制指针
LineSecond.X2 = LineSecond.X1 + Sin(CLng(Second(Now)) / 60 * 2 * pi) * 480
LineSecond.Y2 = LineSecond.Y1 - Cos(CLng(Second(Now)) / 60 * 2 * pi) * 480
LineMinute.X2 = LineMinute.X1 + Sin(CLng(Minute(Now)) / 60 * 2 * pi) * 360
LineMinute.Y2 = LineMinute.Y1 - Cos(CLng(Minute(Now)) / 60 * 2 * pi) * 360
LineHour.X2 = LineHour.X1 + Sin((CLng(Hour(Now)) + CLng(Minute(Now)) / 60) / 12 * 2 * pi) * 240
LineHour.Y2 = LineHour.Y1 - Cos((CLng(Hour(Now)) + CLng(Minute(Now)) / 60) / 12 * 2 * pi) * 240
'利用Line方法绘制刻度
Me.Line (cx + 250, cy - 433.012701892219)-(cx + 300, cy - 519.615242270663)
Me.Line (cx + 433.012701892219, cy - 250)-(cx + 519.615242270663, cy - 300)
Me.Line (cx + 433.012701892219, cy + 250)-(cx + 519.615242270663, cy + 300)
Me.Line (cx + 250, cy + 433.012701892219)-(cx + 300, cy + 519.615242270663)
Me.Line (cx - 250, cy + 433.012701892219)-(cx - 300, cy + 519.615242270663)
Me.Line (cx - 433.012701892219, cy + 250)-(cx - 519.615242270663, cy + 300)
Me.Line (cx - 433.012701892219, cy - 250)-(cx - 519.615242270663, cy - 300)
Me.Line (cx - 250, cy - 433.012701892219)-(cx - 300, cy - 519.615242270663)
就
是
这
个
了
!
Hand类的代码:
Public MustInherit Class Hand
Protected gp As GraphicsPath = New GraphicsPath()
Protected gpBase As GraphicsPath = Nothing
Protected midX As Integer = 150 ‘默认的窗体
Protected midY As Integer = 150 ‘中心位置
‘构造器,得到窗体中心位置
Public Sub New(ByVal theForm As Form1)
midX = (theForm.ClientRectangle.Left + theForm.ClientRectangle.Right) / 2
midY = (theForm.ClientRectangle.Top + theForm.ClientRectangle.Bottom) / 2
End Sub
MustOverride Sub Transform(ByVal d As DateTime)
‘绘制指针路径
Overridable Sub Draw(ByVal g As Graphics)
Dim aPen As Pen = New Pen(Brushes.Black, 4F)
g.DrawPath(aPen, gp)
g.FillPath(Brushes.Black, gp)
aPen.Dispose()
End Sub
‘使用矩阵实现路径(gp)的旋转
Public Sub Rotate(ByVal angle As Double)
gp = CType(gpBase.Clone(), GraphicsPath)
Dim mTransform As Matrix = New Matrix()
mTransform.RotateAt(CType(angle,Single),NewPointF(midX,midY))
gp.Transform(mTransform)
End Sub
End Class
为了节省篇幅,上面的代码省略了引入命名空间的语句。
下面是分针(MinuteHand)类的定义:
Public Class MinuteHand
Inherits Hand
‘构造器,生成绘制分针的路径(gp)
Public Sub New(ByVal myForm As Form1)
MyBase.New(myForm)
gp.AddLine(midX, midY, midX, 45)
gp.AddLine(midX, 45, midX - 3, 50)
gp.AddLine(midX - 3, 50, midX + 3, 50)
gp.AddLine(midX + 3, 50, midX, 45)
gpBase = CType(gp.Clone(), GraphicsPath)
End Sub
‘Transform方法取得系统当前时间,并旋转时钟指针。
Public Overrides Sub Transform(ByVal d As DateTime)
Dim minuteTime As Double = (CDbl(d.Minute) + CDbl(d.Second / 60))
Dim angle As Double = (CDbl(minuteTime) / 60) * 360
Rotate(angle)
End Sub
End Class
对所有的指针旋转的方法都是相同的,因此在基类中实现。由于时针和秒针的实现与分针相似,所不同者,只在于构造器中绘制的指针路径不同和Transform方法中转动的角度不同,在这里就不在赘述了。
另外还需要提一下的是画时钟表面的代码,时钟表面用ClockFace类来实现。这个类首先画一个圆代表时钟,然后画上米老鼠的图案,最后在相应的位置画上数字1~12代表12个小时。
Public Sub Draw(ByVal g As Graphics)
DrawClockFace(g)
DrawImage(g)
DrawNumbers(g)
DrawPin(g)
End Sub
下面是ClockFace类的属性:
Private ClockRectangle As Rectangle
Private ClockFont As Font = New Font("Arial", 12)
Private midPoint As Point
Private ClockImage As Bitmap
Private Const IMAGEX As Integer = 50
Private Const IMAGEY As Integer = 50
DrawClockFace方法用来画时钟表面:
Private Sub DrawClockFace(ByVal g As Graphics)
g.FillEllipse(Brushes.White, ClockRectangle.Left + 10, ClockRectangle.Top + 10, ClockRectangle.Width - 20, ClockRectangle.Height - 20)
g.DrawEllipse(Pens.Black, ClockRectangle.Left + 10, ClockRectangle.Top + 10, ClockRectangle.Width - 20, ClockRectangle.Height - 20)
End Sub
然后用Graphics对象的DrawImage方法画出米老鼠的图片:
Private Sub DrawImage(ByVal g As Graphics)
Dim nWidth As Integer = ClockImage.Width
Dim nHeight As Integer = ClockImage.Height
Dim destRect As Rectangle = New Rectangle(midPoint.X - IMAGEX / 2, midPoint.Y - IMAGEY / 2, IMAGEX, IMAGEY)
g.DrawImage(ClockImage, destRect)
End Sub
数字在时钟上的位置是用sin和cos函数计算的:
Private Sub DrawNumbers(ByVal g As Graphics)
Dim count As Integer = 1
Dim a As Double
For a = 0 To 2 * Math.PI Step 2 * Math.PI / 12
Dim x As Double = (ClockRectangle.Width - 70) / 2 * Math.Cos(a - Math.PI / 3) + (ClockRectangle.Width - 70) / 2 + 25
Dim y As Double = (ClockRectangle.Width - 70) / 2 * Math.Sin(a - Math.PI / 3) + (ClockRectangle.Width - 70) / 2 + 20
g.DrawString(Convert.ToString(count), ClockFont, Brushes.Black, CType(x, Single), CType(y, Single), New StringFormat())
count += 1
Next
End Sub
最后是窗体文件(Form1.vb):
Public Class Form1
Inherits System.Windows.Forms.Form
Private MyMinuteHand As MinuteHand
Private MyHourHand As HourHand
Private MySecondHand As SecondHand
Private TheClockFace As ClockFace
Private FirstTick As Boolean = False
‘在窗体的OnPaint事件中取得Graphics对象
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
If (FirstTick = False) Then Exit Sub
Dim g As Graphics = e.Graphics
TheClockFace.Draw(g)
MyHourHand.Draw(g)
MyMinuteHand.Draw(g)
MySecondHand.Draw(g)
TheClockFace.DrawPin(g)
End Sub
‘计时器事件
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
MySecondHand.Transform(DateTime.Now)
MyHourHand.Transform(DateTime.Now)
MyMinuteHand.Transform(DateTime.Now)
FirstTick = True
Invalidate()
VB可使用Timer控件、Line控件和绘图或加载图片等制作指针式时钟。
Timer 控件,通过引发 Timer 事件,Timer 控件可以有规律地隔一段时间执行一次代码。
Line 控件,Line 控件是图形控件,它显示水平线、垂直线或者对角线。
运行时不能使用 Move 方法移动 Line 控件,但是可以通过改变 X1、X2、Y1 和 Y2
属性来移动它或者调整它的大小。
Circle 方法,在对象上画圆、椭圆或弧。
以下是通过加载图片的指针式时钟代码:
Option Explicit
Private Const PI = 3.1415926
Dim X(1) As Single, Y(1) As Single
Dim OriAngle As Single, DestAngle As Single, r As Single
Private Sub RotateLine(objL As Line, bsPointX As Single, bsPointY As Single, RotateAngle As Single)
With objL
X(0) = .X1
Y(0) = .Y1
X(1) = .X2
Y(1) = .Y2
End With
Dim i As Integer
For i = 0 To 1
If X(i) - bsPointX 0 Then
OriAngle = Atn((Y(i) - bsPointY) / (X(i) - bsPointX))
Else
OriAngle = IIf(Y(i) bsPointY, PI / 2, 1.5 * PI)
End If
If X(i) - bsPointX 0 Then
If OriAngle 0 Then
OriAngle = PI - Abs(OriAngle)
Else
OriAngle = PI + Abs(OriAngle)
End If
End If
DestAngle = OriAngle + RotateAngle
r = Sqr((X(i) - bsPointX) ^ 2 + (Y(i) - bsPointY) ^ 2)
X(i) = bsPointX + r * Cos(DestAngle)
Y(i) = bsPointY + r * Sin(DestAngle)
Next i
With objL
.X1 = X(0)
.Y1 = Y(0)
.X2 = X(1)
.Y2 = Y(1)
End With
End Sub
Private Sub Form_Load()
Timer1.Interval = 1000
Dim i As Long
For i = 1 To Val(Mid(Time$, 7, 2))
RotateLine Line3, Line3.X1, Line3.Y1, 1 * PI / 30
Next
For i = 1 To Val(Mid(Time$, 4, 2))
RotateLine Line2, Line2.X1, Line2.Y1, 1 * PI / 30
Next
For i = 1 To Val(Mid(Time$, 1, 2)) * 5 '对时针
RotateLine Line1, Line1.X1, Line1.Y1, 1 * PI / 30
Next
For i = 1 To Val(Mid(Time$, 4, 2)) '对时针
RotateLine Line1, Line1.X1, Line1.Y1, 1 * PI / 360
Next
End Sub
Private Sub Timer1_Timer()
RotateLine Line3, Line3.X1, Line3.Y1, 1 * PI / 30
RotateLine Line2, Line2.X1, Line2.Y1, PI / 1800
If Mid(Time$, 7, 2) = "00" Or Mid(Time$, 7, 2) = "30" Then
RotateLine Line1, Line1.X1, Line1.Y1, 1 * PI / 720
End If
Me.Caption = Time$
End Sub
1、添加一个“label控件”命名为label
2、添加一个“timer控件”命名为timer1
3、设置“timer1”的“Interval属性”为1000
使用到的代码:
Dim Hour As Integer '小时
Dim Min As Integer '分钟
Dim Sec As Integer '秒
Private Sub Form_Load()
Hour = 0
Min = 0
Sec = 0
Label1.Caption = "00 : 00 : 00"
End Sub
Private Sub Timer1_Timer()
Dim strHour As String
Dim strMin As String
Dim strSec As String
Sec = Sec + 1
If Sec = 60 Then
Sec = 0
Min = Min + 1
If Min = 60 Then
Min = 0
Hour = Hour + 1
If Hour = 24 Then
Hour = 0
End If
End If
End If
If Hour 10 Then
strHour = "0" Hour
Else
strHour = Hour
End If
If Min 10 Then
strMin = "0" Min
Else
strMin = Min
End If
If Sec 10 Then
strSec = "0" Sec
Else
strSec = Sec
End If
Label1.Caption = strHour " : " strMin " : " strSec
End Sub
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流