<.Net>使用visual Studio 2022在VB.net中新添自定义画图函数(优化版)

news/2024/7/16 8:13:05 标签: .net, visual studio, ide

前言
这是基于我之前的一篇博文:
使用visual Studio 2019在VB.net中新添自定义画图函数
在此基础上,我优化了一下,改进了UI,添加了示例功能,即以画圆函数为基础,添加了走马灯功能。
先看一下最终效果:
在这里插入图片描述

1、UI布置
首先大致布局一下窗体控件:
在这里插入图片描述
VB.net的窗体布局很简单,当然同时效果也就那样,如果要UI美观,需要自己设计一下,包括配色以及图片。
但本文不涉及UI美化,可能会在以后单独介绍。

2、画圆函数

   ''' <summary> 
   ''' 在PictureBox中画一个圆
   ''' </summary>
   ''' <param name="p"></param>
   ''' <param name="c"></param>
   Private Sub huayuan(p As PictureBox, c As Color)

       Dim b As Bitmap = New Bitmap(p.Width, p.Height)

       Dim g As Graphics = Graphics.FromImage(b)

       Dim mybrush As New SolidBrush(c)

       g.FillEllipse(mybrush, 0, 0, p.Width, p.Height)

       g.Dispose()

       p.Image = b

   End Sub

画圆函数还是和之前一样,稍微解释下:
自定义的huayuan函数,有两个参数,一个是PictureBox实例,一个是颜色。
函数内,使用bitmap绘制圆形并填充色块,即我们所需的圆形,然后将bitmap作为image赋予PictureBox的图片属性。
这样我们就在图片框中画了一个圆形。

3、走马灯
如上图,我们一共添加了8个PictureBox,用于实现走马灯,即8个图片框按顺序点亮(由灰色变为红色)。实现这个功能有多种方式,本文选择的是利用定时器来实现。
所以,我们需要在窗体添加一个Timer控件。
在这里插入图片描述
在VB.net中,Timer控件是系统工具箱自带的,可以直接拖到窗体上。
Timer的使用也很简单,设置一下其定时间隔:

Timer1.Interval = NumericUpDown1.Value 

本文中,Timer的间隔可以自定义设置,单位为毫秒。
在这里插入图片描述
Timer设置了时间间隔后,直接调用start,定时器就启动了,每间隔一次,就会触发Tick事件,我们可以在这个Tick事件里去编写我们的逻辑,本文中,就是利用画圆函数给PictureBox轮流画圆。

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

    x += 1

    'Console.WriteLine(x)

    If x <= 8 And flag Then

        Button1.Enabled = False

        Move_led(x, 1)

    Else

        Button1.Enabled = True
        Button2.Enabled = False
        Button3.Enabled = False

        x = 0

        Label12.Text = 0

        Label14.Text = "停止中"

        '走马灯完成后,恢复初始状态
        init_led()

        Timer1.Stop()

        flag = False



    End If



End Sub

其中调用的Move_led函数如下:

 ''' <summary>   
 ''' 走马灯程序
 ''' 为了防止循环阻塞主线程,可以添加异步方式
 ''' </summary>
 Private Sub Move_led(count As Integer, timedelay As Integer)

     Label12.Text = count.ToString()

     For j As Integer = 1 To 8 Step 1

         Dim str11 = "x" & count.ToString() + "j" & j.ToString()
         'Console.WriteLine(str11)

         Dim pic1 As PictureBox = Me.Controls("PictureBox" & j)
         'Console.WriteLine(pic1.Name)

         If j = count Then



             huayuan(pic1, Color.Red)


         Else

             huayuan(pic1, Color.Gray)

         End If

         '添加异步等待时间
         'Await Task.Delay(1)

     Next

     '添加异步等待时间
     'Await Task.Delay(timedelay)

 End Sub

这里的大致逻辑就是,设置一个计数,在定时器的Tick事件里,每次都判断计数的大小,如果小于8,就根据计数值执行画圆函数,当然此处又有一个判断函数Move_led,用于对8个图片框分别画圆。执行完后,对计数值加1,然后等待下次定时器触发再判断,直到计数值大于8,也就是走马灯结束,那么就恢复初始值。

以下是完整代码:
控件说明:
Form:1,
Button:3,
Label:14,
PictureBox:8,
NumericUpDown:1

Imports System.Threading.Thread
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Me.Text = "走马灯演示"
        Me.Size = New Size(600, 400)
        Me.Location = New Point(100, 40)

        NumericUpDown1.Value = 100
        '最长间隔100000ms=100s
        NumericUpDown1.Maximum = 100000
        '最短间隔10ms=0.01s
        NumericUpDown1.Minimum = 10

        Timer1.Interval = 100

        Label12.Text = 0
        Label14.Text = "无"

        Button2.Enabled = False
        Button3.Enabled = False


        init_led()

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Timer1.Interval = NumericUpDown1.Value
        Timer1.Start()
        flag = True
        Label14.Text = "运行中"
        Button1.Enabled = False
        Button2.Enabled = True
        Button3.Enabled = False


    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        Timer1.Stop()
        flag = False
        Button1.Enabled = True
        Label14.Text = "停止中"

        Button1.Enabled = True
        Button2.Enabled = False
        Button3.Enabled = True


    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

        Timer1.Stop()
        flag = False
        x = 0
        Label14.Text = "无"
        Label12.Text = 0

        Button1.Enabled = True
        Button2.Enabled = False
        Button3.Enabled = False

        For i As Integer = 1 To 8 Step 1

            Dim pic1 = Me.Controls("PictureBox" & i)
            huayuan(pic1, Color.Gray)

        Next

    End Sub

    Dim x As Integer = 0
    Dim flag As Boolean = False
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

        x += 1

        'Console.WriteLine(x)

        If x <= 8 And flag Then

            Button1.Enabled = False

            Move_led(x, 1)

        Else

            Button1.Enabled = True
            Button2.Enabled = False
            Button3.Enabled = False

            x = 0

            Label12.Text = 0

            Label14.Text = "停止中"

            '走马灯完成后,恢复初始状态
            init_led()

            Timer1.Stop()

            flag = False



        End If



    End Sub

    ''' <summary>
    ''' 初始化参数
    ''' </summary>
    Private Sub init_led()

        '统一为Label赋值
        For i As Integer = 1 To 8 Step 1

            Me.Controls("Label" & i).Text = "灯" & i
            Dim pic1 = Me.Controls("PictureBox" & i)
            huayuan(pic1, Color.Gray)
            Console.WriteLine(pic1.Name)
        Next

    End Sub
    ''' <summary>
    ''' 走马灯程序
    ''' 为了防止循环阻塞主线程,可以添加异步方式
    ''' </summary>
    Private Sub Move_led(count As Integer, timedelay As Integer)

        Label12.Text = count.ToString()

        For j As Integer = 1 To 8 Step 1

            Dim str11 = "x" & count.ToString() + "j" & j.ToString()
            'Console.WriteLine(str11)

            Dim pic1 As PictureBox = Me.Controls("PictureBox" & j)
            'Console.WriteLine(pic1.Name)

            If j = count Then



                huayuan(pic1, Color.Red)


            Else

                huayuan(pic1, Color.Gray)

            End If

            '添加异步等待时间
            'Await Task.Delay(1)

        Next

        '添加异步等待时间
        'Await Task.Delay(timedelay)

    End Sub




    ''' <summary>
    ''' 在PictureBox中画一个圆
    ''' </summary>
    ''' <param name="p"></param>
    ''' <param name="c"></param>
    Private Sub huayuan(p As PictureBox, c As Color)

        Dim b As Bitmap = New Bitmap(p.Width, p.Height)

        Dim g As Graphics = Graphics.FromImage(b)

        Dim mybrush As New SolidBrush(c)

        g.FillEllipse(mybrush, 0, 0, p.Width, p.Height)

        g.Dispose()

        p.Image = b

    End Sub


End Class

注:事实上本文虽然介绍的是画圆,但可以扩展到任意图形的绘制,只需要对huayuan函数作一些修改即可。我在之前的那篇文章里也说过,本文实际是用于工控行业的上位机编写的一部分,单独列出来,一是方便,作个记录,以便于后来查看,二是如果有这方面需求的朋友,假如能够帮助到你,那么也是非常好的。


http://www.niftyadmin.cn/n/5365816.html

相关文章

MySQL篇----第八篇

系列文章目录 文章目录 系列文章目录前言一、存储过程优化思路二、触发器(一段能自动执行的程序)三、数据库并发策略四、MySQL 中有哪几种锁?五、MySQL 中有哪些不同的表格?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳…

【算法分析与设计】无重复的最长子串

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 示例 1: 输入: s "abcabcbb" 输…

Kafka SASL_SSL双重认证

文章目录 1. 背景2. 环境3. 操作步骤3.1 生成SSL证书3.2 配置zookeeper认证3.3 配置kafka安全认证3.4 使用kafka客户端进行验证3.5 使用Java端代码进行认证 1. 背景 kafka提供了多种安全认证机制&#xff0c;主要分为SASL和SSL两大类。 SASL&#xff1a; 是一种身份验证机制&…

使用Dubbo实现微服务之间的高效通信

目录 一、RPC与Dubbo 二、Springboot整合Dubbo 服务端实现 消费端实现 一、RPC与Dubbo RPC&#xff08;Remote Procedure Call&#xff09;是指远程过程调用。 常见的RPC框架有Dubbo&#xff08;Alibaba &#xff09;、gRPC&#xff08;Google&#xff09;、Thrift&#…

Rust 数据类型使用注意点

文章目录 前言一、Rust 的数据类型基本数据类型&#xff1a;复合数据类型&#xff1a; 二、使用注意点&#x1f4e2;整型溢出 总结 前言 Rust 学习系列 &#xff0c;学习rust的数据类型。牢记其中的注意点&#x1f4e2; 一、Rust 的数据类型 Rust 提供了丰富的数据类型&#…

防御UDP攻击:从原理到实践

摘要 UDP&#xff08;User Datagram Protocol&#xff09;是一种无连接的传输协议&#xff0c;通常用于实时传输、VoIP&#xff08;Voice over IP&#xff09;和在线游戏等应用。然而&#xff0c;UDP协议的特性也使其容易遭受攻击。本文将深入探讨UDP攻击的原理&#xff0c;以及…

PiflowX新增Apache Beam引擎支持

参考资料&#xff1a; Apache Beam 架构原理及应用实践-腾讯云开发者社区-腾讯云 (tencent.com) 在之前的文章中有介绍过&#xff0c;PiflowX是支持spark和flink计算引擎&#xff0c;其架构图如下所示&#xff1a; 在piflow高度抽象的流水线组件的支持下&#xff0c;我们可以…

React Hook之钩子调用规则(不在循环、条件判断或者嵌套函数中调用)

文章目录 React Hook之钩子调用规则&#xff08;不在循环、条件判断或者嵌套函数中调用&#xff09;错误使用案例案例具体解决方法 React Hook之钩子调用规则&#xff08;不在循环、条件判断或者嵌套函数中调用&#xff09; hooks使用规则 只能在函数最外层调用 Hook。不要在…