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

news2024/11/16 23:56:14

前言
这是基于我之前的一篇博文:
使用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.coloradmin.cn/o/1435813.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在线JSON解析格式化工具

在线JSON解析格式化工具 - BTool在线工具软件&#xff0c;为开发者提供方便。JSON在线可视化工具:提供JSON视图,JSON格式化视图,JSON可视化,JSON美化,JSON美化视图,JSON在线美化,JSON结构化,JSON格式化,JSON中文Unicode等等。以清晰美观的结构化视图来展示json,可伸缩折叠展示,…

【Linux】Linux权限(下)

Hello everybody!在上一篇文章中&#xff0c;权限讲了大部分内容。今天继续介绍权限剩下的内容&#xff0c;希望大家看过这篇文章后都能有所收获&#xff01; 1.更改文件的拥有者和所属组 对于普通用户&#xff0c;文件的拥有者和所属组都无权修改。 、 、 但root可以修改文件…

071:vue中过滤器filters的使用方法(图文示例)

第071个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使用&#xff0c;computed&a…

双侧条形图绘制教程

写在前面 双侧条形图在我们的文章中也是比较常见的&#xff0c;那么这样的图形是如何绘制的呢&#xff1f; 以及它使用的数据类型是什么呢&#xff1f; 这些都是我们在绘制图形前需要掌握的&#xff0c;至少我们知道绘图的数据集如何准备&#xff0c;这样才踏出第一步。 今天…

Unity接入GVoice腾讯实时语音

Unity接入GVoice腾讯实时语音 一、介绍二、注册GVoice创建项目语音服务1.创建项目2.申请语音权限3.项目管理查看SDK初始化的一些参数和基本信息4.GVoice检测 三、SDK下载SDK是分为两种类型&#xff1a;独立版集成板 SDK放入Unity工程中 四、语音代码写法五、GVoice踩坑语音权限…

知到如何找答案?这7款足够解决问题 #笔记#其他

在这个信息爆炸的时代&#xff0c;合理利用学习工具可以帮助我们过滤和获取有用的知识。 1.网易公开课 这是一个可以帮你找到国内外演讲课程的学习APP&#xff0c;提供了多个专业的视频课程&#xff0c;而且还有丰富的TED、精品国外英语纪录片等。 其中涵盖的大学专业课程包…

ClickHouse基于数据分析常用函数

文章标题 一、WITH语法-定义变量1.1 定义变量1.2 调用函数1.3 子查询 二、GROUP BY子句&#xff08;结合WITH ROLLUP、CUBE、TOTALS&#xff09;三、FORM语法3.1表函数3.1.1 file3.1.2 numbers3.1.3 mysql3.1.4 hdfs 四、ARRAY JOIN语法&#xff08;区别于arrayJoin(arr)函数&a…

Java开发IntelliJ IDEA2023

IntelliJ IDEA 2023是一款强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为Java开发人员设计。它提供了许多特色功能&#xff0c;帮助开发人员更高效地编写、测试和调试Java应用程序。以下是一些IntelliJ IDEA 2023的特色功能&#xff1a; 智能代码编辑器&…

在 MacOS 上虚拟化 x86Linux 的最佳方法(通过 Rosetta)

categories: [VM] tags: MacOS VM 写在前面 买了 ARM 的 mac, 就注定了要折腾一下虚拟机了… 之前写过一篇文章是通过 utm 虚拟化archlinux, 其实本质上还是调用了 qemu-system-x86_64, 所以速度并不快, 后来想着能不能借用 Rosetta 的优势即原生转译, 来虚拟化 Intel 的 Linu…

idea开发工具的简单使用与常见问题

1、配置git 选择左上角目录file->setting 打开&#xff0c;Version Control 目录下Git&#xff0c;选择git安装目录下的git.exe文件&#xff1b; 点击test&#xff0c;出现git版本&#xff0c;则表示git识别成功&#xff0c;点击右下角确认即可生效。 2、配置node.js 选…

C++ 哈希+unordered_map+unordered_set+位图+布隆过滤器(深度剖析)

文章目录 1. 前言2. unordered 系列关联式容器2.1 unordered_map2.1.1 unordered_map 的概念2.1.2 unordered_map 的使用 2.2 unordered_set2.2.1 unordered_set 的概念2.2.2 unordered_set 的使用 3. 底层结构3.1 哈希的概念3.2 哈希冲突3.3 哈希函数3.4 哈希冲突的解决3.4.1 …

GaussDB HCS 轻量化部署软件下载指引

一、Support 账号准备 1. 账号说明 华为的软件服务在华为support网站发布&#xff0c;注册该账号后&#xff0c;可以申请软件、下载离线文档&#xff0c;查看技术案例等功能 2. 账号注册 步骤 1&#xff1a;点击如下官方链接 华为运营商技术支持 - 华为 步骤 2&#xff1…

Oracle Analytics BIEE 操作方法(四)标题

1 背景 版本&#xff1a;BIEE 12C 测试地&#xff1a;分析 2 显示运行时间 2.1 说明 分析视图中的标题&#xff0c;希望可以显示运行时间 2.2 操作步骤 分析进入编辑状态 在“结果”标签中&#xff0c;找到要编辑的标题 “开始时间”中&#xff0c;选择想要的格式 1&a…

JIT逆优化引发的Java服务瞬时抖动 问题排查解决方案

目录 一、背景 二、前期排查&#xff08;失败&#xff09; 三、使用神器JFR 四、学习JIT&思考解决方案 五、最终的解决方案 五、总结 一、背景 我们有一个QPS较高、机器数较多的Java服务&#xff1b;该服务的TP9999一般为几十ms&#xff0c;但偶尔会突然飙升至数秒&a…

图片太大如何缩小上传?分享一个解决办法

随着手机、相机和其他设备拍摄照片的分辨率和质量不断提高&#xff0c;图片大小也越来越大&#xff0c;在设备存储空间有限的情况下&#xff0c;通过压缩图片可以节省存储空间&#xff0c;使得能够存储更多的图片文件&#xff0c;怎么把图片压缩小一点呢&#xff1f; 想要将图片…

Linux嵌入式开发+驱动开发-中断

swi汇编指令可以产生软中断&#xff0c;以下是硬件中断的产生到执行完毕的全过程&#xff1a; 在自己设计的芯片“CPU响应中断”程序的第四个步骤可以转向“中断向量控制器”&#xff0c;中断向量控制器中存储中断元服务地址即处理中断处理程序的地址&#xff0c;而不用使用0X1…

阅读笔记——《RapidFuzz: Accelerating fuzzing via Generative Adversarial Networks》

【参考文献】Ye A, Wang L, Zhao L, et al. Rapidfuzz: Accelerating fuzzing via generative adversarial networks[J]. Neurocomputing, 2021, 460: 195-204.【注】本文仅为作者个人学习笔记&#xff0c;如有冒犯&#xff0c;请联系作者删除。 目录 摘要 一、介绍 二、相关…

java面试题:MySQL中的各种JOIN的区别

表关联是频率非常高的一种数据库操作&#xff0c;在MySQL中&#xff0c;这种JOIN操作有很多类型&#xff0c;包括内联接、左外连接、右外连接等等&#xff0c;而每种连接的含义都不一样&#xff0c;如果死记硬背&#xff0c;不仅很难记住&#xff0c;而且也容易搞混淆&#xff…

简单的TcpServer(英译中)

目录 一、TCP socket API 详解1.1 socket()1.2 bind()1.3 listen()1.4 accept()1.5 connect 二、TcpServer&#xff08;英译中&#xff09;2.1 TcpServer.hpp2.2 TcpClient.cc2.3 Task.hpp2.4 Thread.hpp2.5 ThreadPool.hpp2.6 makefile2.7 Main.cc2.8 log.hpp2.9 Init.hpp2.10…

23、数据结构/查找相关练习20240205

一、请编程实现哈希表的创建存储数组{12,24,234,234,23,234,23},输入key查找的值&#xff0c;实现查找功能。 代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h> #include<math.h> typedef struct Node {int data;struct n…