none
如何用timer控件使“点”变色闪动 RRS feed

  • 问题

  • Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)   
           
            Dim rect1 As Rectangle = Rectangle.FromLTRB(40, 40, 80, 80)
            Dim pen1 As Pen = New Pen(Color.Black)
            Dim pen2 As Pen = New Pen(Color.red)
            Dim brush1 As Brush = New SolidBrush(Color.FromArgb(100, Color.Black))
            Dim brush2 As Brush = New SolidBrush(Color.FromArgb(100, Color.red))
           
            e.Graphics.DrawEllipse(pen1, rect1)
            e.Graphics.FillEllipse(brush1, rect1)

            'e.Graphics.DrawEllipse(pen2, rect1)
            'e.Graphics.FillEllipse(brush2, rect1)
        End Sub
    End Class

    我想用Timer1每间隔1S用不同的笔来画这个点,就实现了点的闪烁,怎么办到?


    visual studio 2008
    2009年3月7日 8:52

答案

  • 周雪峰 说:

    我写了一个,希望对你有帮助:
    public partial class Form1 : Form
        {
            private System.Timers.Timer myTimer = new System.Timers.Timer(1000);
            private bool drawBlack = true;
            public Form1()
            {
                InitializeComponent();
                myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed);
                myTimer.Start();
            }

            void myTimer_Elapsed(object sender, ElapsedEventArgs e)
            {
                Graphics g = this.CreateGraphics();
                if (drawBlack)
                {
                    g.FillEllipse(Brushes.Black, this.ClientSize.Width / 2-25, this.ClientSize.Height / 2-25, 50, 50);
                    this.drawBlack = false;
                }
                else
                {
                    g.FillEllipse(Brushes.Red, this.ClientSize.Width / 2-25, this.ClientSize.Height / 2-25, 50, 50);
                    this.drawBlack = true;
                }
                g.Dispose();
        


            }
        }
     


    周雪峰



    这个是C#代码吧?
    visual studio 2008
    • 已标记为答案 liunain021 2009年3月10日 8:36
    2009年3月7日 10:52
  • 画点代码放到paint事件

    myTimer_Elapsed调用

    me.invalidate()
    http://feiyun0112.cnblogs.com/
    • 已标记为答案 liunain021 2009年3月10日 8:36
    2009年3月9日 3:24
    版主
  •  Private Sub myTimer_Elapsed(ByVal sender As Object, ByVal e As ElapsedEventArgs)
    Me.Invaildate()       
        End Sub

    private sub Form_Paint

     Dim g As Graphics = e.Graphics()
            Dim brush1 As Brush
            Dim brush3 As Brush
            brush1 = New SolidBrush(Color.FromArgb(100, Color.Black))
            brush3 = New SolidBrush(Color.FromArgb(100, Color.Red))

            If drawBlack Then
                g.FillEllipse(brush1, Me.ClientSize.Width / 2 - 25, Me.ClientSize.Height / 2 - 25, 50, 50)
                Me.drawBlack = False
            Else
                g.FillEllipse(Brushes.Red, Me.ClientSize.Width / 2 - 25, Me.ClientSize.Height / 2 - 25, 50, 50)
                Me.drawBlack = True
            End If
            g.Dispose()


    end sub
    http://feiyun0112.cnblogs.com/
    • 已标记为答案 liunain021 2009年3月10日 8:35
    2009年3月10日 1:24
    版主
    • 已标记为答案 liunain021 2009年3月10日 8:35
    2009年3月10日 6:51
    版主
  •  Sub New是构造函数,已经存在desinger.vb
    http://feiyun0112.cnblogs.com/
    • 已标记为答案 liunain021 2009年3月10日 8:32
    • 取消答案标记 liunain021 2009年3月10日 8:32
    • 已标记为答案 liunain021 2009年3月10日 8:35
    2009年3月10日 7:33
    版主

全部回复

  • 我写了一个,希望对你有帮助:
    public partial class Form1 : Form
        {
            private System.Timers.Timer myTimer = new System.Timers.Timer(1000);
            private bool drawBlack = true;
            public Form1()
            {
                InitializeComponent();
                myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed);
                myTimer.Start();
            }

            void myTimer_Elapsed(object sender, ElapsedEventArgs e)
            {
                Graphics g = this.CreateGraphics();
                if (drawBlack)
                {
                    g.FillEllipse(Brushes.Black, this.ClientSize.Width / 2-25, this.ClientSize.Height / 2-25, 50, 50);
                    this.drawBlack = false;
                }
                else
                {
                    g.FillEllipse(Brushes.Red, this.ClientSize.Width / 2-25, this.ClientSize.Height / 2-25, 50, 50);
                    this.drawBlack = true;
                }
                g.Dispose();
        


            }
        }
     

    周雪峰
    2009年3月7日 10:17
    版主
  • 周雪峰 说:

    我写了一个,希望对你有帮助:
    public partial class Form1 : Form
        {
            private System.Timers.Timer myTimer = new System.Timers.Timer(1000);
            private bool drawBlack = true;
            public Form1()
            {
                InitializeComponent();
                myTimer.Elapsed += new ElapsedEventHandler(myTimer_Elapsed);
                myTimer.Start();
            }

            void myTimer_Elapsed(object sender, ElapsedEventArgs e)
            {
                Graphics g = this.CreateGraphics();
                if (drawBlack)
                {
                    g.FillEllipse(Brushes.Black, this.ClientSize.Width / 2-25, this.ClientSize.Height / 2-25, 50, 50);
                    this.drawBlack = false;
                }
                else
                {
                    g.FillEllipse(Brushes.Red, this.ClientSize.Width / 2-25, this.ClientSize.Height / 2-25, 50, 50);
                    this.drawBlack = true;
                }
                g.Dispose();
        


            }
        }
     


    周雪峰



    这个是C#代码吧?
    visual studio 2008
    • 已标记为答案 liunain021 2009年3月10日 8:36
    2009年3月7日 10:52
  •  Public Partial Class Form1
        Inherits Form
        Private myTimer As New System.Timers.Timer(1000)
        Private drawBlack As Boolean = True
        Public Sub New()
            InitializeComponent()
            AddHandler myTimer.Elapsed, AddressOf myTimer_Elapsed
            myTimer.Start()
        End Sub
       
        Private Sub myTimer_Elapsed(ByVal sender As Object, ByVal e As ElapsedEventArgs)
            Dim g As Graphics = Me.CreateGraphics()
            If drawBlack Then
                g.FillEllipse(Brushes.Black, Me.ClientSize.Width / 2 - 25, Me.ClientSize.Height / 2 - 25, 50, 50)
                Me.drawBlack = False
            Else
                g.FillEllipse(Brushes.Red, Me.ClientSize.Width / 2 - 25, Me.ClientSize.Height / 2 - 25, 50, 50)
                Me.drawBlack = True
            End If
            g.Dispose() 
        End Sub
    End Class

    转换后的vb.net 代码,具体怎么弄啊,能不能达到我的要求啊??
    visual studio 2008
    2009年3月7日 12:06
  • 找个工具转换一下就可以了,实际上C#和VB.NET代码并没有本质区别啊!
    这个程序会在窗体的中心画一个“大点”,每隔1秒变换一次颜色。
    具体大小和颜色你自己可以重新设置! 

    周雪峰
    2009年3月7日 12:35
    版主
  • 周雪峰 说:

    找个工具转换一下就可以了,实际上C#和VB.NET代码并没有本质区别啊!
    这个程序会在窗体的中心画一个“大点”,每隔1秒变换一次颜色。
    具体大小和颜色你自己可以重新设置! 


    周雪峰


    问题多多,我没有弄成功,已经转换了,在上面。怎么弄??
    visual studio 2008
    2009年3月7日 12:39
  • 周雪峰 说:

    找个工具转换一下就可以了,实际上C#和VB.NET代码并没有本质区别啊!
    这个程序会在窗体的中心画一个“大点”,每隔1秒变换一次颜色。
    具体大小和颜色你自己可以重新设置! 


    周雪峰


    你就贴出来给我看看,有些转换的很不到位,而且那些语句放在窗体的那个函数里面也很重要·····
    visual studio 2008
    2009年3月7日 12:54
  • 应该怎么弄啊


    visual studio 2008
    2009年3月7日 14:32
  • 请把编译错误的信息告诉我! 
    周雪峰
    2009年3月8日 4:42
    版主
  • 周雪峰 说:

    请把编译错误的信息告诉我! 


    周雪峰



    既然已经定义了 Private myTimer As New System.Timers.Timer(1000),为什么在“类名”中没有找到myTimer?
    visual studio 2008
    2009年3月8日 7:49
  • 周雪峰 说:

    请把编译错误的信息告诉我! 


    周雪峰



    Public Class Form1
        Inherits System.Windows.Forms.Form
        Private myTimer As New System.Timers.Timer(1000)
        Private drawBlack As Boolean = True
        Public Sub New()
            InitializeComponent()
            AddHandler myTimer.Elapsed, AddressOf myTimer_Elapsed
            myTimer.Start()
        End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

    End Sub

    Private Sub myTimer_Elapsed(ByVal sender As Object, ByVal e As ElapsedEventArgs)
        Dim g As Graphics = Me.CreateGraphics()
        If drawBlack Then
            g.FillEllipse(Brush.Black, Me.ClientSize.Width / 2 - 25, Me.ClientSize.Height / 2 - 25, 50, 50)
            Me.drawBlack = False
        Else
            g.FillEllipse(Brush.Red, Me.ClientSize.Width / 2 - 25, Me.ClientSize.Height / 2 - 25, 50, 50)
            Me.drawBlack = True
        End If
        g.Dispose()
    End Sub
    End Class
    编译器中所帖的代码如上,编译错误是:
    “InitializeComponent”未申明
    “ElapsedEventArgs”未定义类型
    “ Brush.Black”和“Brush.Red”不是system.drawing.brush 的成员


    visual studio 2008
    2009年3月8日 7:54

  • 前面加Imports System.Timers
    Brush改成Brushes
    周雪峰
    2009年3月8日 10:39
    版主
  • 周雪峰 说:


    前面加Imports System.Timers
    Brush改成Brushes


    周雪峰



    还有点问题,代码如下:

     

    Imports System.Timers

    Public Class Form1
        Inherits System.Windows.Forms.Form
        Private myTimer As New System.Timers.Timer(1000)
        Private drawBlack As Boolean = True

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        End Sub
    Public Sub New()
        InitializeComponent()
        AddHandler myTimer.Elapsed, AddressOf myTimer_Elapsed
        myTimer.Start()
        End Sub
        Private Sub myTimer_Elapsed(ByVal sender As Object, ByVal e As ElapsedEventArgs)
            Dim g As Graphics = Me.CreateGraphics()
            If drawBlack Then
                g.FillEllipse(Brushes.Black, Me.ClientSize.Width / 2 - 25, Me.ClientSize.Height / 2 - 25, 50, 50)
                Me.drawBlack = False
            Else
                g.FillEllipse(Brushes.Red, Me.ClientSize.Width / 2 - 25, Me.ClientSize.Height / 2 - 25, 50, 50)
                Me.drawBlack = True
            End If
            g.Dispose()
        End Sub
    End Class

     g.FillEllipse(Brushes.Black, Me.ClientSize.Width / 2 - 25, Me.ClientSize.Height / 2 - 25, 50, 50)和
    g.FillEllipse(Brushes.Red, Me.ClientSize.Width / 2 - 25, Me.ClientSize.Height / 2 - 25, 50, 50)
    打了波浪线,原因为:重在决策失败,原因是没有可以访问的“FillEllipse”可以不用收缩转换即可调用

    visual studio 2008
    2009年3月8日 11:36
  • 一般不可能出现这个问题,你再试试! 
    周雪峰
    2009年3月8日 12:17
    版主
  • 周雪峰 说:

    一般不可能出现这个问题,你再试试! 


    周雪峰



    这是贴出来的代码,我也不知道出现什么原因/
    visual studio 2008
    2009年3月8日 12:31
  • liunain021 说:

    周雪峰 说:

    一般不可能出现这个问题,你再试试! 


    周雪峰



    这是贴出来的代码,我也不知道出现什么原因/
    visual studio 2008



    Imports System.Timers

    Public Class Form1
        Inherits System.Windows.Forms.Form
        Private myTimer As New System.Timers.Timer(1000)
        Private drawBlack As Boolean = True


        Private Sub myTimer_Elapsed(ByVal sender As Object, ByVal e As ElapsedEventArgs)
            Dim g As Graphics = Me.CreateGraphics()
            Dim brush1 As Brush
            Dim brush3 As Brush
            brush1 = New SolidBrush(Color.FromArgb(100, Color.Black))
            brush3 = New SolidBrush(Color.FromArgb(100, Color.Red))

            If drawBlack Then
                g.FillEllipse(brush1, Me.ClientSize.Width / 2 - 25, Me.ClientSize.Height / 2 - 25, 50, 50)
                Me.drawBlack = False
            Else
                g.FillEllipse(Brushes.Red, Me.ClientSize.Width / 2 - 25, Me.ClientSize.Height / 2 - 25, 50, 50)
                Me.drawBlack = True
            End If
            g.Dispose()
        End Sub

     
    End Class

    代码没有错,我就不知道什么原因了
    visual studio 2008
    2009年3月8日 12:56
  • 我用自定义的刷子也不行
    visual studio 2008
    2009年3月8日 12:59
  • 这个和画刷没有关系,这个代码我是直接从我的VS里复制过来的,我是可以运行的啊!
    你截个图上来,我看一看是什么问题! 

    周雪峰
    2009年3月8日 13:34
    版主
  • 周雪峰 说:

    这个和画刷没有关系,这个代码我是直接从我的VS里复制过来的,我是可以运行的啊!
    你截个图上来,我看一看是什么问题! 


    周雪峰



    我不好意思,请问我 怎么把图片给你呢?
    visual studio 2008
    2009年3月8日 14:03
  • 我用的是vb2003,跟这个有关系吗?


    visual studio 2008
    2009年3月8日 14:06
  • 画点代码放到paint事件

    myTimer_Elapsed调用

    me.invalidate()
    http://feiyun0112.cnblogs.com/
    • 已标记为答案 liunain021 2009年3月10日 8:36
    2009年3月9日 3:24
    版主
  • feiyun0112 说:

    画点代码放到paint事件

    myTimer_Elapsed调用

    me.invalidate()


    http://feiyun0112.cnblogs.com/



    怎么调用啊?是这样吗?好像不行
    call myTimer_Elapsed?????
    visual studio 2008
    2009年3月9日 10:29
  • 这个怎么调用啊?不把画点的代码放在myTimer_Elapsed中,怎么刷新呢?
    visual studio 2008
    2009年3月9日 10:42
  •  Private Sub myTimer_Elapsed(ByVal sender As Object, ByVal e As ElapsedEventArgs)
    Me.Invaildate()       
        End Sub

    private sub Form_Paint

     Dim g As Graphics = e.Graphics()
            Dim brush1 As Brush
            Dim brush3 As Brush
            brush1 = New SolidBrush(Color.FromArgb(100, Color.Black))
            brush3 = New SolidBrush(Color.FromArgb(100, Color.Red))

            If drawBlack Then
                g.FillEllipse(brush1, Me.ClientSize.Width / 2 - 25, Me.ClientSize.Height / 2 - 25, 50, 50)
                Me.drawBlack = False
            Else
                g.FillEllipse(Brushes.Red, Me.ClientSize.Width / 2 - 25, Me.ClientSize.Height / 2 - 25, 50, 50)
                Me.drawBlack = True
            End If
            g.Dispose()


    end sub
    http://feiyun0112.cnblogs.com/
    • 已标记为答案 liunain021 2009年3月10日 8:35
    2009年3月10日 1:24
    版主
  • feiyun0112 说:

     Private Sub myTimer_Elapsed(ByVal sender As Object, ByVal e As ElapsedEventArgs)
    Me.Invaildate()       
        End Sub

    private sub Form_Paint

     Dim g As Graphics = e.Graphics()
            Dim brush1 As Brush
            Dim brush3 As Brush
            brush1 = New SolidBrush(Color.FromArgb(100, Color.Black))
            brush3 = New SolidBrush(Color.FromArgb(100, Color.Red))

            If drawBlack Then
                g.FillEllipse(brush1, Me.ClientSize.Width / 2 - 25, Me.ClientSize.Height / 2 - 25, 50, 50)
                Me.drawBlack = False
            Else
                g.FillEllipse(Brushes.Red, Me.ClientSize.Width / 2 - 25, Me.ClientSize.Height / 2 - 25, 50, 50)
                Me.drawBlack = True
            End If
            g.Dispose()


    end sub
    http://feiyun0112.cnblogs.com/



    不好意思,刚刚上网。问题如下:
     Private Sub myTimer_Elapsed(ByVal sender As Object, ByVal e As ElapsedEventArgs)
    Me.Invaildate()       
        End Sub
    中Me.Invaildate()  打了波浪线
    visual studio 2008
    2009年3月10日 6:46
    • 已标记为答案 liunain021 2009年3月10日 8:35
    2009年3月10日 6:51
    版主
  • feiyun0112 说:

     Invalidate


    http://feiyun0112.cnblogs.com/



     If drawBlack Then
                g.FillEllipse(brush1, Me.ClientSize.Width / 2 - 25, Me.ClientSize.Height / 2 - 25, 50, 50)
                Me.drawBlack = False
            Else
                g.FillEllipse(brush3, Me.ClientSize.Width / 2 - 25, Me.ClientSize.Height / 2 - 25, 50, 50)
                Me.drawBlack = True
            End If

     g.FillEllipse(brush3, Me.ClientSize.Width / 2 - 25, Me.ClientSize.Height / 2 - 25, 50, 50)
                Me.drawBlack = True
    g.FillEllipse(brush1, Me.ClientSize.Width / 2 - 25, Me.ClientSize.Height / 2 - 25, 50, 50)
    这两句话始终是有问题??

    visual studio 2008
    2009年3月10日 7:04
  • 什么问题?

    drawBlack 应该是一变量吧
    http://feiyun0112.cnblogs.com/
    2009年3月10日 7:08
    版主
  • feiyun0112 说:

    什么问题?

    drawBlack 应该是一变量吧


    http://feiyun0112.cnblogs.com/



    那两句语句打了波浪线
    visual studio 2008
    2009年3月10日 7:12
  • 我改了一下,看这样行不行?
    Imports System.Drawing
    Imports System.drawing.Drawing2D
    Imports System.Timers
    Public Class Form1
        Inherits System.Windows.Forms.Form
        Private myTimer As New System.Timers.Timer(1000)
        Private drawBlack As Boolean = True

    Dim x, y, t As Single
        Public Sub New()
            InitializeComponent()
            AddHandler myTimer.Elapsed, AddressOf myTimer_Elapsed
            myTimer.Start()
        End Sub

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        End Sub


        Private Sub myTimer_Elapsed(ByVal sender As Object, ByVal e As ElapsedEventArgs)
            Me.Invalidate()
        End Sub
        Dim g As Graphics = Me.CreateGraphics
        Dim rect1 As Rectangle = Rectangle.FromLTRB(40, 40, 8, 8)
        Dim pen1 As Pen = New Pen(Color.Black)
        Dim pen2 As Pen = New Pen(Color.Red)
        Dim brush1 As Brush = New SolidBrush(Color.FromArgb(225, Color.Black))
        Dim brush2 As Brush = New SolidBrush(Color.FromArgb(225, Color.Red))

        Private Sub Form_Paint()



            If drawBlack Then
                g.DrawEllipse(pen1, rect1)
                g.FillEllipse(brush1, rect1)

                Me.drawBlack = False
            Else
                g.DrawEllipse(pen2, rect1)
                g.FillEllipse(brush2, rect1)

                Me.drawBlack = True
            End If
            g.Dispose()

        End Sub
    End Class



    执行的时候,Public Sub New()中的new有问题。“New”具有多个签名相同的定义,我把New 改为New1,执行成功了,但是没有看到闪烁的点,何解??
    visual studio 2008
    2009年3月10日 7:17
  •  myTimer.Elapsed事件绑定myTimer_Elapsed

    form1.Paint事件绑定Form_Paint

    我的代码没写完整


    http://feiyun0112.cnblogs.com/
    2009年3月10日 7:21
    版主
  • 看看我的代码行不行
    visual studio 2008
    2009年3月10日 7:26
  •    Public Sub New()
            InitializeComponent()
            AddHandler myTimer.Elapsed, AddressOf myTimer_Elapsed
            myTimer.Start()
        End Sub

    上面这些代码有什么作用呢?New 可以随便改吗?
    visual studio 2008
    2009年3月10日 7:27
  •  Sub New是构造函数,已经存在desinger.vb
    http://feiyun0112.cnblogs.com/
    • 已标记为答案 liunain021 2009年3月10日 8:32
    • 取消答案标记 liunain021 2009年3月10日 8:32
    • 已标记为答案 liunain021 2009年3月10日 8:35
    2009年3月10日 7:33
    版主
  • feiyun0112 说:

     Sub New是构造函数,已经存在desinger.vb


    http://feiyun0112.cnblogs.com/



    那就是说new要改革名字啊。看看我的代码为什么没有出现闪烁的点?
    visual studio 2008
    2009年3月10日 7:45