首先窗口也是一个类,而显示出来的可以操作的那个窗口则是这个类的实例
我们提供的服务有:成都做网站、成都网站建设、微信公众号开发、网站优化、网站认证、定襄ssl等。为1000+企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的定襄网站制作公司
你的意思是点击a的按钮之后单纯更新b的数据还是要改变b上面的控件显示的数据?
如果是前者,也就是b不用在显示上有任何变动的话,那么:
如果b是a的子窗口,那把b窗口的变量名变成是a的全局变量,然后再b把那个要变的数据设为全局并且是public,这样通过“b窗口变量名.要变的数据”就能访问到b里面的变量
如果b不是别人子窗口那么b就不具备变量名了(比如说你是要从子窗口改变主窗口的变量),那你只能通过b的类名(就是name属性)来访问它的数据,这时就只能把你要改的那个数据设为static了。
如果你懂了前面我说的,然后你问题是后者,就是说要通过a的按钮改变b的控件的状态的话,那么由于b上面的控件不是public的,所以没法访问,那么,
方法一:在实例化b之后,把b上面要改的那个控件作为变量传给a
方法二:有时因为各种原因无法使用方法一,那就只能把你将要做的修改做成b里面一个带变量的函数,但由于静态函数不能调用控件,所以要另外定义一个委托,然后设置一个该委托的静态全局变量,然后再b初始化的时候用这个函数作为变量执行构造函数,这样就能在a调用b的那个更改控件状态的函数了。
简单总结一下:把设计的窗体当成类,把实际操作的窗体看成这些类实体化后的变量,然后通过全局的公共变量、函数进行互动,由于主窗体是系统自动打开的,所以没有变量名,那就只能通过类名来访问,所以要把需要被访问的变量、函数设为静态,但由于静态函数无法访问控件,所以只能设置静态的委托变量并在窗体实例化的时候加载那个要访问的非静态函数。
花了二十分钟给你写了代码,已测试。建议学习并使用System.Drawing绘制。
主要是掌握Graphics.FillRectangle和DrawString的使用。
Imports System.Drawing
Public Class 进度条UI
Public 上面笔刷 As SolidBrush = New SolidBrush(Color.FromArgb(192, 175, 238, 238))
Public 下面笔刷 As SolidBrush = New SolidBrush(Color.FromArgb(192, 30, 144, 255))
Public 文字笔 As SolidBrush = New SolidBrush(Color.FromArgb(255, 255, 255, 255))
Public 字体 As Font = New Font("微软雅黑", 14.0)
Public 文字格式 As StringFormat = New StringFormat() With
{.Alignment = StringAlignment.Center, .LineAlignment = StringAlignment.Center}
''' summary
''' 绘制指定进度的图像。
''' 当进度变化时调用一次本方法,建议将创建的Graphics对象保存到变量而不要重复创建。。
''' /summary
''' param name="控件"绘制到此控件的工作区/param
''' param name="g"绘制到控件的Graphics对象,例如 Button1.CreateGraphics()/param
''' param name="进度"进度百分比实数,57% = 0.57/param
Public Sub 绘制(ByRef 控件 As Control, ByRef g As Graphics, ByVal 进度 As Double)
Dim 矩形 = 控件.ClientRectangle '获取控件的工作区矩形
Dim 下面高度 = CInt(矩形.Height * 进度) '获取下面颜色块的高度
Dim 中间位置 = 矩形.Top + 矩形.Height - 下面高度 '获取中间分界线的Y坐标
Dim 上矩形 = New Rectangle(矩形.X, 矩形.Y, 矩形.Width, 矩形.Height - 下面高度)
Dim 下矩形 = New Rectangle(矩形.X, 中间位置, 矩形.Width, 下面高度)
g.FillRectangle(上面笔刷, 上矩形)
g.FillRectangle(下面笔刷, 下矩形)
'绘制文字
Dim 文字 As String = String.Format("{0:0.00}%", 进度 * 100)
g.DrawString(文字, 字体, 文字笔, 矩形, 文字格式)
End Sub
End Class
下面是Form1窗体的代码:添加一个Button1和Timer1控件,将Button1尺寸拖大点
Public Class Form1
Public g As Graphics
Public 进度条UI As New 进度条UI
Public 进度 As Double
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
g = Button1.CreateGraphics()
Timer1.Enabled = Not Timer1.Enabled
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
进度 += 0.01
进度条UI.绘制(Button1, g, 进度)
End Sub
End Class
截至今天2016/12/02,VB.net最新版本是VB 14,
对应的IDE为Visual Studio 2015
从VB 7开始,每次.net平台更新,VB版本也会不断更新。
VB历史版本如下(.net平台)
没有 VB13
VB12 对应 VS2013
VB11 对应 VS2012
VB10 对应 VS2010
VB9 对应 VS2008
VB8 对应 VS2005
VB7 对应 VS2003
VB6 是经典版本,它不是 .net平台的
Timer 是在 主线程里执行的,Thread 是在自己的线程中执行的,多核心的CPU使用线程能提高处理能力。回到你的问题,主线程如果卡死,timer就会失去响应,很正常的。请使用System.Timers.Timer类吧。请参考一下:
你1.0里做了查找更新的功能么?通常比如做一段连到更新服务器,验证下最新版本信息比如服务器目录下放个记录版本号和新版位置的txt,有了就用单写的更新程序更新(不能更新正在运行的自己的关系)。至于没做这部分而要让原来的1.0自己“感应”到那是天方夜谭了。