VB.NET里面的Event机制(三)

VB.NET 模拟鼠标事件深度解析:mouse_event API 与 SendInput 的 3 种方案对比 本文深入解析了VB.NET中模拟鼠标事件的三种主流技术方案:传统的mouse_event API、现代替代方案SendInput以及UI Automation框架。通过对比分析各方案的特点、性能和应用场景,帮助开发者选择最适合自动化测试、游戏辅助等需求的鼠标模拟技术,特别详细介绍了模拟鼠标左键和右键点击的实现方法。 阅读详情

 

现在我们看看这样一个问题。我们想要做这样一个控件,他继承自Window.Forms.TextBox下面,也就是说它支持TextBox的所有功能,但是我们需要一个新的功能,就是当用户按下回车之后,我们判断一下这个TextBox里面的文字,如果是空字符串的话,就显示一个MessageBox,默认的内容是“Empty connect is not validated.”。同时我们希望用户可以选择是否显示这个MessageBox。我们用此前的办法来做。

我们的类很快就可以完成。

Public Class MyTextBox

    Inherits TextBox

 

    Public Event EnterKeyPress(ByVal sender As Object, ByRef Cancel As Boolean, ByRef Message As String)

 

    Private Sub MyTextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress

        'Do something then user press ENTER KEY

        If Asc(e.KeyChar) = 13 Then

            Dim Cancel As Boolean = False

            Dim Message As String = "Empty connect is not validated."

            'Send the event with parameters

            RaiseEvent EnterKeyPress(Me, Cancel, Message)

            'Show message box depend on the return parameters

            If Cancel = False Then

                MsgBox(Message)

            End If

        End If

    End Sub

 

End Class

而且我们很容易就可以使用这个控件了。

Public Class Form1

    Inherits System.Windows.Forms.Form

 

#Region " Windows Form Designer generated code "

 

    Public Sub New()

        MyBase.New()

 

        'This call is required by the Windows Form Designer.

        InitializeComponent()

 

        'Add any initialization after the InitializeComponent() call

 

    End Sub

 

    'Form overrides dispose to clean up the component list.

    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

        If disposing Then

            If Not (components Is Nothing) Then

                components.Dispose()

            End If

        End If

        MyBase.Dispose(disposing)

    End Sub

 

    'Required by the Windows Form Designer

    Private components As System.ComponentModel.IContainer

 

    'NOTE: The following procedure is required by the Windows Form Designer

    'It can be modified using the Windows Form Designer. 

    'Do not modify it using the code editor.

    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

        '

        'Form1

        '

        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12)

        Me.ClientSize = New System.Drawing.Size(292, 273)

        Me.Name = "Form1"

        Me.Text = "Form1"

 

    End Sub

 

#End Region

 

    Friend WithEvents MyTextBox1 As New MyTextBox

 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.Controls.Add(Me.MyTextBox1)

        Me.MyTextBox1.Location = New Point(100, 100)

    End Sub

 

    Private Sub MyTextBox1_EnterKeyPress(ByVal sender As Object, ByRef Cancel As Boolean, ByRef Message As String) Handles MyTextBox1.EnterKeyPress

 

    End Sub

 

End Class

现在看来一切正常,但是无聊的客户突然来了一个Mail,他们希望我们能够在显示MessageBox的时候,将TextBox的背景色变成红色,并且允许有可能在其它的时候会变成绿色。也就是说变色也是要使用者可以自由设定的。这样我们就要在Event参数列表里面加入一个新的背景色参数,并且修改所有使用了这个Event的Handle函数。

Public Class MyTextBox

    Inherits TextBox

 

    Public Event EnterKeyPress(ByVal sender As Object, ByRef Cancel As Boolean, ByRef Message As String, ByVal BackColor As Color)

 

    Private Sub MyTextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress

        'Do something then user press ENTER KEY

        If Asc(e.KeyChar) = 13 Then

            Dim Cancel As Boolean = False

            Dim Message As String = "Empty connect is not validated."

            Dim Color As Color = Color.Red

            'Send the event with parameters

            RaiseEvent EnterKeyPress(Me, Cancel, Message, Color)

            'Show message box depend on the return parameters

            If Cancel = False Then

                MsgBox(Message)

            End If

        End If

    End Sub

 

End Class

然后修改使用的地方,也许实际上我们只是让它显示成默认的红色,我们也需要修改使用Event的地方,因为Event的定义已经不同了。

Public Class Form1

    Inherits System.Windows.Forms.Form

 

#Region " Windows Form Designer generated code "

 

    Public Sub New()

        MyBase.New()

 

        'This call is required by the Windows Form Designer.

        InitializeComponent()

 

        'Add any initialization after the InitializeComponent() call

 

    End Sub

 

    'Form overrides dispose to clean up the component list.

    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

        If disposing Then

            If Not (components Is Nothing) Then

                components.Dispose()

            End If

        End If

        MyBase.Dispose(disposing)

    End Sub

 

    'Required by the Windows Form Designer

    Private components As System.ComponentModel.IContainer

 

    'NOTE: The following procedure is required by the Windows Form Designer

    'It can be modified using the Windows Form Designer. 

    'Do not modify it using the code editor.

    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

        '

        'Form1

        '

        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12)

        Me.ClientSize = New System.Drawing.Size(292, 273)

        Me.Name = "Form1"

        Me.Text = "Form1"

 

    End Sub

 

#End Region

 

    Friend WithEvents MyTextBox1 As New MyTextBox

 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Me.Controls.Add(Me.MyTextBox1)

        Me.MyTextBox1.Location = New Point(100, 100)

    End Sub

 

    Private Sub MyTextBox1_EnterKeyPress(ByVal sender As Object, ByRef Cancel As Boolean, ByRef Message As String, ByVal Color As Color) Handles MyTextBox1.EnterKeyPress

 

    End Sub

 

End Class

现在我们只有这样一处使用这个Event的地方,但是假设我们有100个Form,每个Form都有20个这样的TextBox(记住,你做的是通用控件,他可能会被用在任何的地方,会被使用上千次)。那么我们就要这样修改2000次。其中可能只有10个时需要把背景色变成别的颜色,比如耦合色。但是我还是要修改2000个函数的。

当我们终于修改完成之后,客户有发来一封稍有歉意的Mail,说他们还希望能够设定MessageBox的按钮状态和显示属性,大部分是OKCancel按钮和Information形式,个别的是OK按钮和Error形式。看来我们有需要修改我们的TextBox类和那2000个函数了。

而后,用户又来了一个Mail……天哪,看来我们有必要把Mail Service关掉了。因为这样修改对于项目是毁灭性的。我们有必要重新审视一下我们的TextBox类的建立问题了。

我们现在关键的问题就是参数,我们增加一点Event的功能,就需要修改Event的参数列表,然后修改所有使用这个Event的Handle函数。但是很多的时候,真正修改函数内部的地方可能很少,甚至没有。我们重复的劳动就是一个个修改Handle函数的参数列表。

那么我们看看.NET是怎么做的,我们看看Form.Closing事件Handle出来的函数。

    Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing

    End Sub

我们把注意力集中到第二个参数,它不是我们前面熟悉的EventArgs,而是CancelEventArgs。而我们看看这个CancelEventArgs里面都有什么。我们看到了e.Cancel。.NET把我们此前做的那个Cancel参数通过第二个参数的成员属性传递进来了。这样我们就通过设定e.Cancel来达到我们原先的处理。

这里可能有的人会产生疑问,e参数被声明为ByVal,它应该不能被返回到RaiseEvent调用处的啊?但是事实是可以的。原因是.NET在处理类的实例参数的时候,传进来的不是实例本身,而是实例的指针。而我们ByVak的只不过是保存这个指针地址变量的一个副本。所以即使是ByVal,如果这个参数是类的实例,也可以把成员传递回去。

这样做的好处就是如果还有新的参数加入,我们只需要修改这个CancelEventArgs类和相应的RasiseEvent,调用的HandleEvent如果不需要对应这个新的参数,就没有必要修改了。这个就是面向对象的好处,封装了操作,只通过接口来连接。也就是软件工程里面所说的松耦合。

现在我们已找这个办法修改自己的TextBox类。首先我们要做好这个EventArgs类,模仿CancelEventArgs,我们做一个EnterKeyPressEventArgs。

    Public Class EnterKeyPressEventArgs

        Inherits EventArgs

 

        Private m_Cancel As Boolean

        Private m_Message As String

        Private m_BackColor As Color

 

        Public Property Cancel() As Boolean

            Get

                Return m_Cancel

            End Get

            Set(ByVal Value As Boolean)

                m_Cancel = Value

            End Set

        End Property

 

        Public Property Message() As String

            Get

                Return m_Message

            End Get

            Set(ByVal Value As String)

                m_Message = Value

            End Set

        End Property

 

        Public Property BackColor() As Color

            Get

                Return m_BackColor

            End Get

            Set(ByVal Value As Color)

                m_BackColor = Value

            End Set

        End Property

 

        Public Sub New()

            m_Cancel = False

            m_Message = "Empty connect is not validated."

            m_BackColor = Color.Red

        End Sub

 

    End Class

这个类继承自EventArgs,通过私有变量和公共属性来传递参数。为什么不用共有变量呢,有原因的,我心准备在专门写一篇文章说说这个问题。反正这样私有变量加公共属性的办法比公共变量要好。

然后我们修改TextBox类,调用RaiseEvent的地方就可以使用这个类了。

    Public Event EnterKeyPress(ByVal sender As Object, ByVal e As EnterKeyPressEventArgs)

 

    Private Sub MyTextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress

        'Do something then user press ENTER KEY

        If Asc(e.KeyChar) = 13 Then

            'Create the args instance

            Dim ekpea As New EnterKeyPressEventArgs

            'Send the event with parameters

            RaiseEvent EnterKeyPress(Me, ekpea)

            'Show message box depend on the return parameters

            If ekpea.Cancel = False Then

                Me.BackColor = ekpea.BackColor

                MsgBox(ekpea.Message)

            End If

        End If

    End Sub

我们使用的时候,也可以相应的修改成。

    Private Sub MyTextBox1_EnterKeyPress(ByVal sender As Object, ByVal e As MyTextBox.EnterKeyPressEventArgs) Handles MyTextBox1.EnterKeyPress

        'Some codes ...

        e.Cancel = False

        e.Message = "My message ... "

        e.BackColor = Color.Green

        'Some codes ...

    End Sub

这样即便客户又来信说,我们需要加入一个功能,设定这个MessageBox的按钮类型,默认是VBOKOnly和Information。我们需要修改的地方首先是这个EventArgs。

    Public Class EnterKeyPressEventArgs

        Inherits EventArgs

 

        Private m_Cancel As Boolean

        Private m_Message As String

        Private m_BackColor As Color

        Private m_ButtonStyle As MsgBoxStyle

 

        Public Property Cancel() As Boolean

            Get

                Return m_Cancel

            End Get

            Set(ByVal Value As Boolean)

                m_Cancel = Value

            End Set

        End Property

 

        Public Property Message() As String

            Get

                Return m_Message

            End Get

            Set(ByVal Value As String)

                m_Message = Value

            End Set

        End Property

 

        Public Property BackColor() As Color

            Get

                Return m_BackColor

            End Get

            Set(ByVal Value As Color)

                m_BackColor = Value

            End Set

        End Property

 

        Public Property Style() As MsgBoxStyle

            Get

                Return m_ButtonStyle

            End Get

            Set(ByVal Value As MsgBoxStyle)

                m_ButtonStyle = Value

            End Set

        End Property

 

        Public Sub New()

            m_Cancel = False

            m_Message = "Empty connect is not validated."

            m_BackColor = Color.Red

            m_ButtonStyle = MsgBoxStyle.OKOnly Or MsgBoxStyle.Information

        End Sub

 

    End Class

然后修改RaiseEvent的一句话。

MsgBox(ekpea.Message, ekpea.Style)

而使用的Handle函数只要使用默认值,就不需要修改了。

[原创]用C++模拟C#的event机制 本文章为farproc.com站长袁晓辉(海洋)的原创文章,作者保留所有权利。如果转载,请务必注明来自www.farproc.com!! 作为一个C++程序员,学习C#应该不是一件很困难的事情,因为C#的许多特性都是从C++“继承”(不精确的说法)来的。但是C#作为一门全新的编程语言,它必然有自己的新特性,而这些C++中并不存在的新特性正是我们从C++转向C#的过程中必须认真重新学 阅读详情

相关推荐

RcisTarget实战:从差异基因到转录因子调控网络的完整分析流程(附代码)

本文详细介绍了RcisTarget工具在转录因子调控网络分析中的完整流程,从差异基因到motif富集分析,再到结果可视化与生物学解读。通过实战代码演示,帮助研究者掌握这一强大的R包应用,揭示基因表达背后的调控机制,特别适用于基因组学和生物信息学研究。

weixin_29214199的博客 228

VB.NET-Textbox中的KeyPress事件

VB.NET-Textbox中的KeyPress事件

HEIMENGER的博客 3376

疾病负担研究(GBD)介绍

今天我们来聊一聊第一个公共数据库——GBD数据库,全称叫做global burden of disease(全球疾病负担),该数据库每年都会更新,目前已经更新到GBD2019。 这里直接给大家贴出网址:Global Burden of Disease Study 2019 (GBD 2019) Data Resources | GHDx 上图中红色圈圈标识的就是数据库的数据获取界面的链接,大家直接点击即可. 数据的检索十分方便: Context下拉菜单中可以选择不同的选项,默认是caus

weixin_44240228的博客 1万+

请解释 VB.NET 中的事件(Event)

最后,在某处,Subscriber类的HandleEvent方法被用作事件处理程序,并通过AddHandler关键字与事件相关联,以订阅Publisher对象的MyEvent事件。事件通常用于实现基于发布/订阅模式的编程,其中事件源对象负责触发事件,而事件处理程序对象负责处理事件。这通常通过使用AddHandler关键字来完成。处理事件: 当事件源触发事件时,订阅事件的事件处理程序将被调用,并执行与事件相关的操作。触发事件: 事件源对象在特定的条件下触发事件,通常通过调用事件的触发方法来实现。

qiuyehuanghun的博客 1373

Unity3D 2022版如何一键安装Newtonsoft.Json?最新Package Manager教程

本文详细介绍了在Unity3D 2022及以上版本中,如何通过Package Manager一键安装和配置Newtonsoft.Json(Json.NET)。教程涵盖了从打开Package Manager、搜索并安装正确包源,到验证安装和基础使用的完整流程,旨在帮助开发者以现代化、可靠的方式集成这一强大的JSON处理框架,提升开发效率并规避手动导入的常见问题。

lg888的博客 921

Notion vs 飞书文档深度对比:个人知识管理到底该选谁?2026实测报告

本文基于2026年30天深度实测,对比了Notion与飞书文档在个人知识管理(PKM)场景下的核心差异。Notion以“块”为基石,提供高度自由的结构化能力,适合构建个性化知识网络;飞书文档则深度融入协作生态,强调流程效率与团队协同。报告从设计哲学、核心功能、AI能力、成本生态等多维度剖析,助你根据自身对灵活性与协作性的需求做出选择。

weixin_29248313的博客 1396

VB.NET里面的Event机制(一)

自从VB6开始,Event这个东西就已经深入了VB系列程序中间。在VB6中,我们是简单的通过诸如TextBox1_TextChanged这样一个函数了解到当文字变化的时候,就能够自动触发这个函数。进入了.NET之后,是我们有幸第一次看到了Event的真面目。现在我们在VB.NET里面直接写入下面的函数 Private Sub TextBox1_TextChanged(ByVal sen...

weixin_30419799的博客 279

从零到千兆:KSZ9031 PHY芯片在Zynq PS端的驱动移植心路历程

本文详细记录了在Xilinx Zynq-7000平台(基于XC7Z020芯片)上,为KSZ9031千兆以太网PHY芯片移植LwIP协议栈驱动的完整过程。从硬件连接配置、Vivado工程设置到LwIP库的深度修改与调试,分享了解决PHY识别、自协商及性能优化等关键问题的实战经验,助力开发者实现稳定的千兆网络连接。

honey的博客 1117

VB.NET里面的Event机制(二)

现在我们看看下面的类。 Public Class Class1 Inherits Object Private WithEvents MyButton As New Button Public Event MyEvent(ByVal sender As Object, ByVal e As EventArgs, ByRef Cancal As...

weixin_30814223的博客 280

【即插即用模块】卷积篇 | TCSVT 2025 | MFACB:多尺度膨胀融合,快速扩大感受野,多尺度特征精准捕捉!

本文提出了一种新型多尺度融合膨胀卷积模块MFACB,用于增强语义分割任务中的特征表达能力。该模块通过三分支串联膨胀卷积结构快速扩大感受野,采用双路径融合机制(基础信息路径+多尺度信息路径)实现高效上下文聚合。相比传统卷积块,MFACB在保持轻量化的同时显著提升了多尺度特征捕捉能力,实验表明其性能优于基础残差块。该模块支持自定义膨胀率和步长调整,可灵活嵌入不同网络阶段,适用于需要特征增强的视觉任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 311

YOLOv8 智能交通违章检测 - 压线/越线行驶检测详解

本文提出了一种基于YOLOv8的智能交通违章检测方案,重点解决车辆压线/越线行驶的识别问题。系统采用多技术融合方案:YOLOv8检测车辆、ByteTrack跟踪轨迹、传统或深度学习方法识别车道线,并通过几何计算判断车辆是否违规跨越实线。文章详细介绍了技术难点(如车道线分类、透视变形处理)、判定流程、系统架构和核心代码实现,包括车道线检测、违章逻辑判断和可视化模块。同时指出了现有方案的局限性,建议通过引入逆透视变换和专用车道线分割模型来提升准确率。该纯视觉方案具有低成本、易部署的特点,适用于智能交通监控场景。

u010117029的博客 177

VB.NET里面的Event机制

自从VB6开始,Event这个东西就已经深入了VB系列程序中间。在VB6中,我们是简单的通过诸如TextBox1_TextChanged这样一个函数了解到当文字变化的时候,就能够自动触发这个函数。进入了.NET之后,是我们有幸第一次看到了Event的真面目。现在我们在VB.NET里面直接写入下面的函数     Private Sub TextBox1_TextChanged(ByVal send

u010240338的专栏 4726

基于ESP32Cam摄像头+YOLOv3完成图像识别_355

本项目正是在此背景下提出,设计一个基于ESP32Cam摄像头的图像识别系统,通过WIFI热点通信实现图像数据的传输,并利用上位机(Windows与Android平台的QT APP)实时显示原始图像与识别结果,实现目标检测、识别与标注功能。

595

vb和vb.net事件机制

学习java事件前,回顾了下vb6和vb.net的事件机制,总结在这里,供对比用。     事件是面对对象中对象间通信的方法。事件发生者(又叫事件源)发生一个事件时,通过发送一条消息,给事件接受者(事件处理者),事件接受者可以做出响应的处理。比如在某登录界面中,单击一个按钮,系统会验证用户的用户名和密码是否正确。用户单击按钮后,按钮(事件源)发出了单击事件,产生了自己被单击的消息给窗体,窗体(事

xqf的小站 3005

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

VB.NET中的Event机制

自从VB6开始,Event这个东西就已经深入了VB系列程序中间。在VB6中,我们是简单的通过诸如TextBox1_TextChanged这样一个函数了解到当文字变化的时候,就能够自动触发这个函数。进入了.NET之后,是我们有幸第一次看到了Event的真面目。现在我们在VB.NET里面直接写入下面的函数     Private SubTextBox1_TextChanged(ByVal sende

程序人生,学海无涯 2450

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

不得不明白的vb.net Delegate-只供入门

Event Delegate 在好多地方多看到了,比如在学习web user control 的时侯,还有vb.net remoting object 的时候。 我看了不少文章后,也不是很明白。我在这里写下来,主要是为了我自己以后的回故。同时,也想让大家参考。 要理解event delegate, 当然要先明白什么是event. 其实简单的想,就是"回叫"的机制,她解决一个依赖的问题。 比如真...

weixin_33785972的博客 1653

GetInvocationList of an event in VB.NET

 Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required. GetInvocationList of an event in VB.NET u

MinSen 1188
上一篇: 什么是ERP和ERP的作用
下一篇: 过滤某几个重复字段
DiscussQuestions
博客等级 码龄19年 28粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值