三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

VB.NET快速入门:从零到一构建桌面应用,掌握事件驱动与控件开发

VB.NET快速入门:从零到一构建桌面应用,掌握事件驱动与控件开发

1. 为什么今天还要学VB?一个被低估的“生产力工具”

如果你在2024年搜索“VB”,大概率会看到两种声音:一种是“VB早就过时了,学它干嘛?”,另一种是“VB还能用吗?”。作为一个从VB6时代一路走来的开发者,我的看法是:VB(这里主要指经典的Visual Basic 6.0和现代的VB.NET)远未到“入土”的时候,它更像一个被遗忘在工具箱角落的“瑞士军刀”——在某些特定场景下,它依然是解决问题最快、最直接的工具。今天,我们就来聊聊如何快速上手这门语言,让你在第一天就能用它做点有用的事。

VB的核心价值,在于其“快速应用开发”的基因。它的语法接近自然英语,拖拽式界面设计直观得令人发指。对于非专业程序员,比如财务、行政、实验室研究人员,或者只是想写个小工具自动化日常重复工作的普通电脑用户,VB的学习曲线远比C#、Java甚至Python平缓。你不需要理解复杂的面向对象理论,不用被指针和内存管理搞得头大,甚至不用搭建复杂的开发环境(对于VB6而言)。它的目标很纯粹:让你用最少的代码,最快地做出一个带窗口、带按钮、能处理数据的桌面程序。网络上大量的“VB控件查询手册”、“VB按钮”等搜索热词,恰恰说明了至今仍有大量用户在维护、修改或寻找基于VB的解决方案,尤其是在工业控制(如“S7 200 VB寄存器用法”)、硬件交互(如“VB监听串口”)和多媒体处理(如“VB mcisendstring用法”)等领域,VB因其与Windows系统的深度集成和COM组件调用的便利性,依然扮演着重要角色。

所以,第一天的目标不是成为VB专家,而是建立信心:用一两个小时,亲手做出一个能运行、有交互的小程序,感受一下“开发软件”的即时成就感。我们选择VB.NET作为起点,因为它更现代,开发环境(Visual Studio)易于获取且功能强大,避免了VB6在新时代系统上可能遇到的兼容性问题(如“VB安装一直在更新系统无响应”)。

2. 环境准备:避开第一个坑——安装与项目创建

工欲善其事,必先利其器。我们的第一站是安装Visual Studio。这里有一个关键选择:不要安装最新、最全的版本。对于初学者,庞大的VS2022企业版不仅下载安装耗时,其复杂的界面和众多用不到的功能反而会增加学习成本。

我的建议是:下载 Visual Studio Community 2022。这是微软提供的免费版本,对个人开发者、开源项目和小型团队完全够用。安装时,在“工作负载”选择界面,你只需要勾选“.NET 桌面开发”这一项。这个工作负载包含了我们开发VB.NET Windows窗体应用所需的一切:.NET SDK、VB.NET语言支持、Windows窗体设计器。其他如ASP.NET、Azure、移动开发等负载一概不选,这样可以极大缩短安装时间和磁盘占用。

安装过程可能会遇到“一直在更新系统无响应”的情况,这通常与网络环境或系统后台服务有关。如果卡住,可以尝试:

  1. 暂时关闭第三方杀毒软件和防火墙。
  2. 以管理员身份运行安装程序。
  3. 如果卡在特定组件,可以取消安装,重新运行安装程序,选择“修改”,有时跳过当前卡住的组件后续再单独安装更有效。

安装完成后,启动Visual Studio,我们来创建第一个项目:

  1. 点击“创建新项目”。
  2. 在搜索框输入“Windows 窗体应用”,选择语言为“Visual Basic”,模板选择“Windows 窗体应用(.NET Framework)”。请注意,这里有两个类似的模板:“.NET Framework”和“.NET”(后者是.NET Core/.NET 5+)。对于初学者,我强烈建议选择“.NET Framework”版本。原因在于,.NET Framework版本更稳定,第三方控件和教程资源(尤其是那些涉及硬件、COM组件调用的)兼容性更好,网上搜索“vb控件查询手册”找到的代码,绝大部分都是针对.NET Framework的。而新的“.NET”版本在跨平台方面有优势,但某些传统Windows API调用方式略有不同,初期容易造成混淆。
  3. 为项目起个名字,比如“MyFirstVBApp”,选择好存放位置,点击“创建”。

至此,你的开发环境就准备好了。Visual Studio会自动打开主界面,中间是窗体设计器(一个灰色的窗口),右边是“解决方案资源管理器”(可以看到你的项目文件),左边是“工具箱”(里面有很多可拖拽的控件,如按钮、文本框)。

3. 第一个程序:“Hello, World!”的现代交互版

传统的“Hello, World!”只是在控制台打印文字,太无趣了。我们要做一个带界面的。我们的目标是:窗口上有一个按钮,点击按钮,旁边的标签就会显示“你好,VB世界!”。

第一步:认识界面与拖拽控件。在中间的窗体设计器里,你已经看到了Form1。从左侧“工具箱”里,找到“公共控件”分组。

  • 找到Button控件,用鼠标点住它,拖到Form1窗体上。你会看到一个按钮出现在窗体里。
  • 再找到一个Label控件,同样拖到窗体上,放在按钮旁边。 这就是VB可视化开发的精髓:所见即所得。你拖上去的按钮和标签,实际上就是程序运行时会显示的样子。

第二步:修改属性,让界面更友好。在窗体设计器上点击你刚拖上去的Button1,再看右下角的“属性”窗口(如果没看到,可以按F4键调出)。

  • 找到Text属性,它控制按钮上显示的文字。把它的值从“Button1”改成“点击我”。
  • 同样,点击Label1控件,在属性窗口找到Text属性,把它清空(因为我们希望初始时标签是空的)。
  • 你还可以试试修改Font属性,改变字体大小;修改ForeColor,改变文字颜色。属性窗口是定制控件外观和行为的主要场所。

第三步:编写第一行代码——事件驱动。VB是事件驱动语言。程序的大部分代码都是在“响应”某个事件,比如“按钮被点击了”、“鼠标移动了”。现在,我们要为按钮的点击事件写代码。 在窗体设计器上,双击你刚刚创建的“点击我”按钮。神奇的事情发生了:Visual Studio会自动切换到代码视图,并为你创建好了一个名为Button1_Click的空方法。这个方法就是按钮的点击事件处理程序。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click ‘ 在这里写代码 End Sub

第四步:让代码“干活”。我们的目标是点击按钮后,标签显示文字。所以,在Button1_Click方法内部,我们输入一行代码:

Label1.Text = "你好,VB世界!"

这行代码的意思是:将Label1这个控件的Text属性,设置为等号右边的字符串。在VB中,单个等号=就是赋值操作。

第五步:运行与调试。点击工具栏上绿色的“启动”按钮(或按F5键)。Visual Studio会编译并运行你的程序。你会看到一个独立的窗口弹出,点击上面的“点击我”按钮,旁边的标签果然显示了“你好,VB世界!”。

恭喜!你已经完成了第一个交互式VB程序。这个过程体现了VB的核心开发流程:拖控件 -> 设属性 -> 写事件代码。比起其他语言要从零开始用代码画界面,这种方式效率高太多了。

4. 核心语法初探:变量、数据类型与基础运算

有了第一个程序的成就感,我们现在需要回头补充一点必要的语法知识,否则后续的代码会看不懂。别担心,VB的语法以“易懂”著称。

4.1 变量声明与数据类型变量就像一个个小盒子,用来存放数据。在VB中,声明变量通常使用Dim语句。

Dim userName As String ‘ 声明一个名为userName的变量,类型是字符串(String) Dim age As Integer ‘ 声明一个名为age的变量,类型是整数(Integer) Dim price As Double ‘ 声明一个名为price的变量,类型是双精度浮点数(Double),可带小数 Dim isDone As Boolean ‘ 声明一个名为isDone的变量,类型是布尔值(Boolean),只有True或False

声明后,就可以给变量赋值了:

userName = "张三" age = 25 price = 19.99 isDone = True

也可以声明的同时赋值:

Dim city As String = "北京"

> 注意:关于=Null搜索热词中有“vb =null”,这是一个重要的概念。在VB.NET中,Nothing关键字用于表示对象变量没有引用任何对象,或者值类型变量未被赋值(对于可空类型)。它类似于其他语言中的null

Dim obj As Object = Nothing ‘ 表示obj不指向任何对象

但是,对于像IntegerDouble这样的基本值类型,它们不能直接赋值为Nothing(除非声明为可空类型,如Dim num As Integer? = Nothing)。初学者常见的错误是混淆“空字符串”和Nothing

Dim s1 As String = Nothing ‘ s1是Nothing Dim s2 As String = "" ‘ s2是一个空的字符串对象,不是Nothing

在判断时,应使用Is关键字:

If s1 Is Nothing Then ‘ 执行某些操作 End If

4.2 基础运算与字符串连接算术运算和大多数语言一样:

Dim sum As Integer = 10 + 5 ‘ 加法,sum=15 Dim diff As Integer = 10 - 5 ‘ 减法 Dim product As Integer = 10 * 5 ‘ 乘法 Dim quotient As Double = 10 / 3 ‘ 除法,quotient≈3.333... Dim remainder As Integer = 10 Mod 3 ‘ 取模(求余数),remainder=1

字符串连接使用&运算符(虽然也可以用+,但为了清晰和避免意外类型转换,强烈建议始终使用&):

Dim greeting As String = "你好," & userName & "!" ‘ 如果userName是“张三”,则greeting是“你好,张三!”

4.3 与用户交互:MessageBoxInputBox除了用标签显示,我们还可以用更标准的方式与用户交互。

  • MessageBox.Show(): 弹出一个消息框。
    MessageBox.Show("操作已完成!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information)
    这段代码会弹出一个标题为“提示”,内容为“操作已完成!”,带有一个“确定”按钮和信息图标的对话框。
  • InputBox(): 弹出一个输入框,让用户输入文本。
    Dim userInput As String = InputBox("请输入您的姓名:", "输入") If userInput <> "" Then ‘ 判断用户是否输入了内容(非空字符串) Label1.Text = "欢迎," & userInput End If

现在,你可以改造一下第一个程序:在按钮点击事件里,弹出一个输入框让用户输入名字,然后将欢迎语显示在标签上。动手试试吧!

5. 控件进阶:处理“支持鼠标滚轮”与常见控件属性

在搜索热词中,“vb应用程序 支持鼠标滚轮”是一个很实际的需求。在VB.NET的Windows窗体应用中,默认情况下,如果窗体上的内容(比如一个多行文本框TextBox或者一个列表ListBox)超出了显示区域,是需要用户用鼠标拖动滚动条来查看的。而“支持鼠标滚轮”意味着用户可以直接滚动鼠标滚轮来浏览内容,体验更好。

5.1 让控件响应鼠标滚轮实际上,对于标准的TextBoxListBoxDataGridView等控件,当它们获得焦点(即被选中)时,通常已经支持鼠标滚轮滚动了。问题往往出现在这些控件被放置在一个容器(如PanelGroupBox)中,并且容器没有正确处理滚轮消息。

如果你发现鼠标滚轮无效,可以按以下步骤排查和解决:

  1. 确保控件可获得焦点:运行程序,用鼠标点击一下那个文本框或列表,让它的边框出现(表示获得焦点),然后再尝试滚动滚轮。
  2. 处理容器的滚轮事件:如果控件在一个Panel里,且Panel的大小限制了控件显示,你需要为PanelMouseWheel事件编写代码,将滚轮消息“传递”给其内部的控件。
    Private Sub Panel1_MouseWheel(sender As Object, e As MouseEventArgs) Handles Panel1.MouseWheel ‘ 将滚轮事件传递给Panel内第一个能处理它的控件 Dim ctrl As Control = Panel1.GetChildAtPoint(Panel1.PointToClient(Cursor.Position)) If ctrl IsNot Nothing Then ‘ 模拟一个滚轮事件发给该控件 Dim args As New MouseEventArgs(e.Button, e.Clicks, e.X - ctrl.Left, e.Y - ctrl.Top, e.Delta) ctrl.OnMouseWheel(args) End If End Sub
    这段代码稍复杂,但原理是当鼠标在Panel1上滚动时,找到鼠标位置下的子控件,并将滚轮事件转发给它。对于初学者,一个更简单粗暴但有效的办法是:PanelAutoScroll属性设置为True。这样当子控件超出Panel范围时,Panel会自动出现滚动条,并且这个滚动条通常能响应鼠标滚轮。

5.2 常用核心控件属性与方法速查了解控件的关键属性,能让你更自如地操控它们。下面以TextBox(文本框)和Button(按钮)为例:

  • TextBox(文本框)

    • Text: 获取或设置框中显示的文本。TextBox1.Text = "内容"
    • Multiline: 是否允许多行文本。设为True后才能显示多行。
    • ReadOnly: 是否只读。设为True后用户不能编辑,但可以选中复制。
    • PasswordChar: 设置密码掩码字符,如设为*,则输入任何字符都显示为*
    • Clear(): 方法,清空文本框内容。TextBox1.Clear()
    • AppendText(): 方法,在现有文本后追加内容。TextBox1.AppendText("新的一行" & vbCrLf)vbCrLf是换行符。
  • Button(按钮)

    • Text: 按钮上显示的文字。
    • Enabled: 按钮是否可用。设为False时按钮变灰,无法点击。
    • Visible: 按钮是否可见。
    • PerformClick(): 方法,以编程方式“点击”按钮,触发其Click事件。Button1.PerformClick()

掌握这些基础,你就能做出有基本交互功能的界面了。试着做一个简单的登录框:两个文本框(一个用于用户名,一个用于密码,设置PasswordChar),两个按钮(“登录”和“取消”),点击“登录”后检查输入内容(暂时可以写死一个用户名密码进行对比),并用MessageBox弹出提示。

6. 实战小项目:简易文本编辑器

让我们把前面学到的所有东西组合起来,做一个真正有点用的小程序:一个简易的文本编辑器。它能打开文本文件、编辑、保存,还能改变字体。

6.1 界面搭建在窗体上拖拽以下控件并设置属性:

  1. 一个MenuStrip控件(在“菜单和工具栏”分组里)。拖到窗体上后,它会在顶部。点击它,输入“文件(&F)”,然后在其下添加子项:“新建(&N)”、“打开(&O)”、“保存(&S)”、“-”(分隔符)、“退出(&X)”。再添加一个“格式(&O)”菜单,下面加一个“字体(&F)”。&符号用于定义快捷键(Alt+F等)。
  2. 一个RichTextBox控件(在“公共控件”分组里)。把它拖到窗体中,将其Dock属性设置为Fill,这样它会填满整个窗体客户区。RichTextBox比普通的TextBox功能更强,支持富文本。
  3. 一个OpenFileDialog控件和一个SaveFileDialog控件(在“对话框”分组里)。拖到窗体任意位置,它们会在设计器下方显示,因为是非可视化控件。分别改名为OpenFileDialog1SaveFileDialog1。设置它们的Filter属性为“文本文件|.txt|所有文件|.*”,这样打开对话框时默认筛选文本文件。
  4. 一个FontDialog控件,拖下来,命名为FontDialog1

6.2 编写菜单功能代码双击各个菜单项,进入其Click事件处理程序。

  • “新建”菜单

    Private Sub 新建NToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 新建NToolStripMenuItem.Click If RichTextBox1.Modified Then ‘ 如果内容有修改,提示保存 Dim result As DialogResult = MessageBox.Show("当前内容已修改,是否保存?", "提示", MessageBoxButtons.YesNoCancel) If result = DialogResult.Yes Then ‘ 调用保存功能 保存SToolStripMenuItem.PerformClick() ElseIf result = DialogResult.Cancel Then Return ‘ 用户取消,不执行新建 End If End If RichTextBox1.Clear() Me.Text = "简易文本编辑器 - 无标题" ‘ 修改窗口标题 RichTextBox1.Modified = False End Sub

    这里引入了Modified属性,用于跟踪文本内容是否被修改过,以及DialogResult枚举,用于判断用户点了消息框的哪个按钮。

  • “打开”菜单

    Private Sub 打开OToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 打开OToolStripMenuItem.Click ‘ 先检查当前内容是否需要保存(代码同上,可提取为独立方法,此处为简化直接判断) If RichTextBox1.Modified Then ‘ ... 保存提示代码 ... End If If OpenFileDialog1.ShowDialog() = DialogResult.OK Then Try RichTextBox1.LoadFile(OpenFileDialog1.FileName, RichTextBoxStreamType.PlainText) Me.Text = "简易文本编辑器 - " & OpenFileDialog1.FileName RichTextBox1.Modified = False Catch ex As Exception MessageBox.Show("打开文件时出错:" & ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End If End Sub

    ShowDialog()方法会弹出“打开文件”对话框,如果用户点击了“打开”(返回OK),我们就用RichTextBoxLoadFile方法加载文件。Try...Catch用于捕获并处理可能出现的异常(如文件被占用、格式不支持等)。

  • “保存”菜单

    Private Sub 保存SToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 保存SToolStripMenuItem.Click If String.IsNullOrEmpty(OpenFileDialog1.FileName) Then ‘ 如果是新文件,还没有文件名,则调用“另存为” 另存为ToolStripMenuItem.PerformClick() Else Try RichTextBox1.SaveFile(OpenFileDialog1.FileName, RichTextBoxStreamType.PlainText) RichTextBox1.Modified = False MessageBox.Show("保存成功!", "提示") Catch ex As Exception MessageBox.Show("保存文件时出错:" & ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End If End Sub

    这里判断了OpenFileDialog1.FileName是否为空,来决定是直接保存还是弹出“另存为”对话框。你需要先添加一个“另存为”菜单项,并编写其事件代码(与“保存”类似,但总是弹出SaveFileDialog)。

  • “字体”菜单

    Private Sub 字体FToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 字体FToolStripMenuItem.Click FontDialog1.Font = RichTextBox1.Font ‘ 将当前字体设为对话框初始值 If FontDialog1.ShowDialog() = DialogResult.OK Then RichTextBox1.Font = FontDialog1.Font ‘ 应用用户选择的字体 End If End Sub
  • “退出”菜单

    Private Sub 退出XToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 退出XToolStripMenuItem.Click Me.Close() ‘ 关闭窗体,结束程序 End Sub

6.3 运行与体验按下F5运行。现在,你有了一个可以新建、打开、编辑、保存文本文件,并能修改字体的小编辑器了。虽然功能简陋,但它完整地演示了VB.NET程序的事件驱动模型、常用控件的使用、文件对话框的操作以及基本的错误处理。通过这个练习,你已经跨过了“入门”的门槛,能够用VB组织逻辑、处理用户交互了。

第一天的时间,从认识VB的价值,到搭建环境,再到完成两个从简到繁的程序,信息量不小。关键在于动手去试,去改代码,去触发错误然后解决它。VB的即时反馈特性非常适合这种学习方式。当你看到自己拖拽出来的界面按照编写的逻辑运行时,那种掌控感是学习编程最好的动力。接下来,你可以尝试为这个编辑器添加更多功能,比如查找替换、状态栏显示行号、或者尝试连接一个数据库(Access或SQLite)来做简单的数据管理,那将是另一个有趣的开始了。

← 返回列表