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

前言
这是基于我之前的一篇博文:
使用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 = bEnd 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.Tickx += 1'Console.WriteLine(x)If x <= 8 And flag ThenButton1.Enabled = FalseMove_led(x, 1)ElseButton1.Enabled = TrueButton2.Enabled = FalseButton3.Enabled = Falsex = 0Label12.Text = 0Label14.Text = "停止中"'走马灯完成后,恢复初始状态init_led()Timer1.Stop()flag = FalseEnd IfEnd 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 1Dim 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 Thenhuayuan(pic1, Color.Red)Elsehuayuan(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 Form1Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.LoadMe.Text = "走马灯演示"Me.Size = New Size(600, 400)Me.Location = New Point(100, 40)NumericUpDown1.Value = 100'最长间隔100000ms=100sNumericUpDown1.Maximum = 100000'最短间隔10ms=0.01sNumericUpDown1.Minimum = 10Timer1.Interval = 100Label12.Text = 0Label14.Text = "无"Button2.Enabled = FalseButton3.Enabled = Falseinit_led()End SubPrivate Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickTimer1.Interval = NumericUpDown1.ValueTimer1.Start()flag = TrueLabel14.Text = "运行中"Button1.Enabled = FalseButton2.Enabled = TrueButton3.Enabled = FalseEnd SubPrivate Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.ClickTimer1.Stop()flag = FalseButton1.Enabled = TrueLabel14.Text = "停止中"Button1.Enabled = TrueButton2.Enabled = FalseButton3.Enabled = TrueEnd SubPrivate Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.ClickTimer1.Stop()flag = Falsex = 0Label14.Text = "无"Label12.Text = 0Button1.Enabled = TrueButton2.Enabled = FalseButton3.Enabled = FalseFor i As Integer = 1 To 8 Step 1Dim pic1 = Me.Controls("PictureBox" & i)huayuan(pic1, Color.Gray)NextEnd SubDim x As Integer = 0Dim flag As Boolean = FalsePrivate Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tickx += 1'Console.WriteLine(x)If x <= 8 And flag ThenButton1.Enabled = FalseMove_led(x, 1)ElseButton1.Enabled = TrueButton2.Enabled = FalseButton3.Enabled = Falsex = 0Label12.Text = 0Label14.Text = "停止中"'走马灯完成后,恢复初始状态init_led()Timer1.Stop()flag = FalseEnd IfEnd Sub''' <summary>''' 初始化参数''' </summary>Private Sub init_led()'统一为Label赋值For i As Integer = 1 To 8 Step 1Me.Controls("Label" & i).Text = "灯" & iDim pic1 = Me.Controls("PictureBox" & i)huayuan(pic1, Color.Gray)Console.WriteLine(pic1.Name)NextEnd 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 1Dim 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 Thenhuayuan(pic1, Color.Red)Elsehuayuan(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 = bEnd SubEnd Class

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/669604.shtml

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

相关文章

Google Chrome Close AutoUpdate

DOMException: play() failed because the user didn‘t interact with the document first.-CSDN博客 html5 audio video-CSDN博客 Google Chrome Close AutoUpdate 关闭google浏览器自动更新 1&#xff1a;检查是否已安装google浏览器&#xff0c;并卸载&#xff1a; 2&…

router路由跳转的两种模板

<router-link><router-link/> <router-view><router-view/> link &#xff1a;链接&#xff0c;联系 view&#xff1a;指看见展现在人们面前的、可以稳定地进行详细审视的事物 将语境拉回到router里&#xff0c;抽象概括一下 router-link就是一个…

docker compose安装minio

要使docker-compose管理的容器&#xff08;如MinIO&#xff09;在系统启动时自动启动&#xff0c;你需要使用Docker的重启策略。在你的docker-compose.yml文件中为MinIO服务添加restart策略即可实现这一目标。restart: always指令确保了在容器退出时总是重新启动容器&#xff0…

55. 右旋字符串(卡码网KamaCoder)

文章目录 55. 右旋字符串题目描述暴力优化&#xff1a;不能申请额外空间&#xff0c;只能在本串上操作思路代码 55. 右旋字符串 题目描述 字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k&#xff0c;请编写一个函数&…

Spark SQL调优实战

1、新添参数说明 // Driver和Executor内存和CPU资源相关配置 --是否开启executor动态分配&#xff0c;开启时spark.executor.instances不生效 spark.dynamicAllocation.enabledfalse --配置Driver内存 spark.dirver.memory5g --driver最大结果大小&#xff0c;设置为0代…

SQLserver2008 r2 下载安装配置、使用、新建登录用户及通过Navicat远程连接

目录 一、下载 二、安装配置 1.安装 2.许可条款 3.安装程序支持文件 4.功能选择 5.实例配置 6.服务器配置 7.数据库引擎配置 8.Reporting Services 配置 9.安装进度 ​编辑 10.完成 三、使用 四、新建登录用户 1.新建登录名 2.常规 3.服务器角色 4. 用户映…

08 - python操作mysql

认识pymysql 借助pymysql模块&#xff0c;这是一个python编写的MYSQL驱动程序&#xff0c;借助它来操作数据库。 操作数据库的流程和java 使用原生的JDBC操作数据的流程步骤差不多。 安装pymysql pip install pymysql 操作步骤 导入pymysql模块 import pymysql创建数据库…

基于CNN+LSTM深度学习网络的时间序列预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 卷积神经网络&#xff08;CNN&#xff09; 4.2 长短时记忆网络&#xff08;LSTM&#xff09; 4.3 CNNLSTM网络结构 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MA…

Java设计模式大全:23种常见的设计模式详解(一)

本系列文章简介&#xff1a; 设计模式是在软件开发过程中&#xff0c;经过实践和总结得到的一套解决特定问题的可复用的模板。它是一种在特定情境中经过验证的经验和技巧的集合&#xff0c;可以帮助开发人员设计出高效、可维护、可扩展和可复用的软件系统。设计模式提供了一种在…

将程序做成系统服务 shell脚本

要将程序做成系统服务&#xff0c;你可以使用Shell脚本来创建一个systemd服务单元文件。下面是一个示例的Shell脚本&#xff0c;用于创建一个名为my_service的服务单元文件&#xff1a; #!/bin/bash# 定义服务的名称和描述 SERVICE_NAME"my_service" DESCRIPTION&quo…

【手写数据库toadb】toadb表数据文件存储结构,创建表与插入数据在物理文件层的流程,行列混合存储新增分组文件结构介绍

12 数据库表物理存储结构 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新,对应的代码也会定期更新,每个阶段的代码会打上ta…

二进制可执行文件的常见后缀

有关二进制程序 二进制程序是一种由机器代码【机器代码是一种由计算机硬件理解和执行的低级指令集】组成的程序&#xff0c;它由计算机直接执行。二进制程序通常是由高级编程语言编译而来&#xff0c;经过编译器的处理将高级代码转换为机器代码。在不同的操作系统上&#xff0…

【Mysql】基本语法(数据操作+表结构操作)

一&#xff1a;数据操作 1.数据库&#xff08;库名&#xff09; create database 数据库名 //创建数据库 use 数据库名 //选择数据库 drop database 数据库名 //删除数据库[rootxibushuma ~]# mysql db2 -e show tables 不登录mysql 情况下&…

架构学习(四):scrapy下载中间件实现动态切换User-Agent

scrapy下载中间件实现动态与固定UserAgent 前言关卡&#xff1a;实现动态切换User-Agentscrapy设置User-Agent方式梳理User-Agent生效梳理为何选择在下载中间件中实现自定义User-Agent下载中间件 结束 前言 请求头User-Agent是比较常规的反爬手段&#xff0c;不同站点对其检测…

thinkphp6入门(17)-- 网站开发中session、cache、cookie的区别

Session&#xff08;会话&#xff09;: 定义&#xff1a; Session是一种用于在服务器端存储用户信息的机制&#xff0c;以跟踪用户的状态。 数据存储位置&#xff1a; 存储在服务器端&#xff0c;可以存在于内存、数据库或文件系统中。 生命周期&#xff1a; 存在于用户访问应…

sql——如果查到的值为空,则显示给出的默认值

mysql中使用ifnull&#xff0c;Oracle使用NVL 一&#xff0c;mysql IFNULL(expr1, expr2)IFNULL函数接受两个参数&#xff0c;如果expr1为NULL&#xff0c;则返回expr2的值&#xff0c;否则返回expr1的值。 例如&#xff0c; SELECT IFNULL(employee_salary, 0) AS salary F…

离散数学——图论(笔记及思维导图)

离散数学——图论&#xff08;笔记及思维导图&#xff09; 目录 大纲 内容 参考 大纲 内容 参考 笔记来自【电子科大】离散数学 王丽杰

AI助力农作物自动采摘,基于YOLOv3全系列【yolov3tiny/yolov3/yolov3spp】参数模型开发构建作物生产场景下番茄采摘检测计数分析系统

去年十一那会无意间刷到一个视频展示的就是德国机械收割机非常高效自动化地24小时不间断地在超广阔的土地上采摘各种作物&#xff0c;专家设计出来了很多用于采摘不同农作物的大型机械&#xff0c;看着非常震撼&#xff0c;但是我们国内农业的发展还是相对比较滞后的&#xff0…

Dockerfile文件参数配置和使用

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

C# Socket通信从入门到精通(21)——Tcp客户端判断与服务器断开连接的三种方法以及C#代码实现

前言 我们开发的tcp客户端程序在连接服务器以后,经常会遇到服务器已经关闭但是作为客户端的我们不知道,这时候应该应该有一个机制我们可以实时监测客户端和服务器已经断开连接,如果已经断开了连接,我们应该及时报警提示用户客户端和服务器已经断开连接,本文介绍三种可以监…