精华内容
下载资源
问答
  • VB的事件源DOC文档

    2008-12-10 15:30:04
    VB的事件源DOC文档VB的事件源DOC文档VB的事件源DOC文档
  • 当你们听到VB的事件驱动.......你们想到的答案是什么呢?无论你们想到什么样的答案...我在这里都详细加实例解说一下...其实很简单,不管你明不明白这个词的涵义...其实在你打开VB写程序的第一天开始你都在用...转载...
    各位在使用VB的正规或不正规的程序员们...当你们听到VB的事件驱动.......你们想到的答案是什么呢?
    无论你们想到什么样的答案...我在这里都详细加实例解说一下...其实很简单,不管你明不明白这个词的涵义...其实在你打开VB写程序的第一天开始你都在用...

    转载(www.5201413.com)

    -------------------------------------------------------------------------------------------

    VB 程式有两种工作模式—主动模式及事件驱动模式,主动模式与传统的 DOS 程式很像,程式载入系统後就会一直执行,直到结束为止,事件驱动模式则会在程式载入系统後,先暂时停止执行,直到事件发生时,才驱动对应的事件程序而执行某段程式,执行此段程式之後,又会暂停执行,等待下一次事件的发生。

    主动模式的程式在 Windows 3.1 底下是被禁止的,主要的原因是 Windows 3.1 不是真正的多工作业系统,而为了让不同程式能够同时执行,Windows 规定每一个程式必须不定时地呼叫 Yield、GetMessage、PeekMessage 等 API 函数(VB 程式则是呼叫 DoEvents),而当程式呼叫这些函数时,Windows 就会趁此一时机把 CPU 交给其他程式使用,也因此让每一个程式都有机会使用 CPU 而达到多工作业的目的。

    但如果有某一个程式忽略了此一规定,它就会一直霸占着 CPU 不放,而使得整个 Windows 的作业环境像当掉一样,不过这个问题到了 Windows 95 及 NT 之後,已经不再存在,因为 Windows 95 及 NT 具有主动切换各个程式使用 CPU 权利的能力,所以即使某一程式进入了无穷回圈,Windows 依然会在一小段时间後将 CPU 的使用权转移给其他程式,我们可以把 Windows 与程式之间的关系表示成图-1:
     
    尽管主动模式的程式在 Windows 底下不再有问题,但笔者必须强调的是事件驱动模式才是 Windows 程式的主流,为什麽呢?在 Windows 的多工作业环境底下,萤幕的输出、键盘的输入、滑鼠的输入…等,都必须由 Windows 来统筹管理,如果每个程式都想主动控制这些输出与输入装置,势必造成你抢我抢的混乱现象,反观事件驱动模式是以物件为核心,程式的执行是把负责不同工作的物件派到 Windows 的工作环境底下,接着这些物件就会静候 Windows 所产生的事件,然後加以处理,由於事件是由 Windows 统筹管理以及产生的,因此不同程式之间便能够在 Windows 的环境底下共同生存及工作。

    除了从多工作业的角度来看,事件驱动模式的程式也比较容易管理,由於我们会引用不同的物件以处理不同的工作,因此便比较不会把某一项工作的程式写得太大,而造成将来侦错及维护的困难。

    --------------------------------------------------------------------------------
    VB 的事件回溯到 Windows 的讯息
    --------------------------------------------------------------------------------

     
    以上是从 VB 的角度来看事件,尽管笔者说 Windows 会产生事件以驱动物件,但比较正确的说法是 Windows 先产生讯息,经由 VB 的转化才成为事件,然後才驱动物件的,如图-2。

    事件的产生乃源自於 Windows 的讯息

    但是 VB 是如何把讯息转化成事件的呢?而讯息又是什麽东西呢?请回忆我们在 46 期介绍的 hWnd(handle of window),它代表视窗的唯一识别码,由於许多物件都有 hWnd 这个属性,所以我们可以把物件表示成图-3,而视窗是 Windows 传递讯息的对象,这便使得 VB 得以将讯息转化成事件,进而驱动物件中的事件程序。
     
    物件与视窗的关系

    至於 VB 怎样把讯息转化成事件的呢?在视窗的内部,有一样最重要的东西称为「视窗程序」(window procedure),它的用途是接收来自 Windows 的讯息,当 VB 建立物件(视窗)时,也会提供一个视窗程序,用以接受来自 Windows 的讯息、处理讯息、并且会将某些讯息转化成为事件,进而驱动物件的事件程序,只是它始终是隐藏的,所以对大部分的 VB 程式设计人员来说,并不晓得有这一号人物存在。


    将讯息转化成事件的藏镜人是视窗程序

     
    --------------------------------------------------------------------------------
    认识视窗程序
    --------------------------------------------------------------------------------

     

    关於视窗程序,如果表示成 VB 的函数,则如下:

     

    Function WndProcName(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long,
    ByVal lParam As Long) As Long
         Select Case Msg
             Case WM_???? ' 讯息-1
                 ...
             Case WM_???? ' 讯息-2
                 ...
             Case Else
                 ret = DefWindowProc(hWnd, Msg, wParam, lParam)     End Select
        WndProcName = ret
    End Function 

    首先来看视窗程序的四个参数:

    hWnd:handle of window,这个不必再解释了吧!
    Msg:讯息编号,用来表示 Windows 所传递过来的是怎样的讯息。在 Win32api.txt 档案中,我们可以找到许多以 WM_(表示 Window Message) 为开头的常数定义,例如「Public Const WM_LBUTTONDOWN = &H201」,其中常数符号部分(例如 LBUTTONDOWN 表示 Left Button Down)可以让我们望文生义,而常数数值部分(&H201)则是讯息的编号。而视窗程序会利用 If Msg = WM_???? 或 Select Case Msg/Case WM_???? 叙述来判断收到的讯息是否为某一种讯息,进而加以处理。
    wParam 及 lParam:这两个参数称为讯息参数,其意义会随着讯息(参数二 Msg)的不同而有所不同,想了解每一种讯息参数的意义,则必须查阅 SDK(Software Development Kits) 参考手册,不过 SDK 参考手册蛮贵的,但您可以在以下两个地方寻得 SDK 的线上参考手册:(1) VC++ (2) MSDN/CD (Microsoft Developer Network/CD)。
     

    至於视窗程序之中最值得注意的地方是 DefWindowProc API 函数,这是 Windows 为了减少视窗程序的负担所提供的函数,由於 Windows 可能传递给视窗程序的讯息多达数百种,而大部分讯息是不需要特别处理的,此时若呼叫 DefWindowProc,可将讯息交由 API 代为处理。

     
    VB 提供的视窗程序
    --------------------------------------------------------------------------------
     

    如果是自己撰写视窗程序,可以自由地处理收到的讯息,不过在 VB 程式中,视窗程序是由 VB 提供的,以下让笔者先来介绍 VB 所提供的视窗程序是如何处理讯息、以及如何产生事件以驱动物件的。

     

    刚才笔者说过 Windows 的讯息多达数百种,对 VB 所提供的视窗程序而言,也一样不处理那麽多讯息,所以大部分的情况都是呼叫 DefWindowProc 交由 API 代劳。但由於 VB 提供的物件都含有某些事件,因此当 VB 的视窗程序收到讯息时,会判断此一讯息是否应转化成为事件,例如 LBUTTONDOWN 讯息应转化成为 MouseDown 事件,如果是,则判断程式中是否含有该事件的事件程序(例如 Form_MouseDown),如果有,则呼叫此一事件程序,参考图-4 就不难了解其间的运作过程。

     
    笔者觉得视窗程序与事件程序在概念上并没有太大的差别,但不可否认的 VB 的视窗程序会吃掉了许多讯息(也就是说这些讯息并不会产生对应的事件),VB 这麽做也不是没有道理,只保留最为常用的讯息可减少程式设计人员的负担,而实际上,也可以提升程式的执行效能。不过话说回来,因为许多讯息被 VB 吃掉了,这也使得 VB 程式无法完成某些特殊的功能,过去 VB 一直被批评为容易使用但功能不足,这是重要的原因,不过这种现象到了 VB 5.0 以後,有了重大的改变,请继续读下去,稍後笔者就会说明。

     
    --------------------------------------------------------------------------------
    VB 程式具有 Callback 的能力
    --------------------------------------------------------------------------------

     
    想要强化 VB 的视窗程序是可能的,不过这必须先了解 Callback 的工作模式。

     
    Windows 会传递讯息给视窗程序,但何谓传递呢?其实就是 Windows 准备好 hWnd、Msg、wParam、lParam 参数,然後呼叫 VB 所提供的函数(视窗程序),这原本是没什麽特别的事情,但由於平常都是由应用程式(或 VB)来呼叫 Windows 的,而讯息的传递则是由 Windows 倒回来呼叫应用程式,故称为 Callback。


    想要强化 VB 的视窗程序首先必撰写好强化的程序,并且把这个程序设定成 Windows 可以 Callback 的程序,此时最重要的一件事情是告诉 Windows 此一程序的「位址」,但 VB 4.0 以前的版本却无法取得程序的位址,因此举凡与 Callback 有关的程式设计都与 VB 程式无缘,不过到5.0 版以後,VB 提供了 AddressOf 叙述可供程式取得程序的位址,也因此为 VB 程式开启了 Callback 的後门。
     

    Callback 程式范例
    --------------------------------------------------------------------------------
     

    接下来让笔者举个 VB 程式的 Callback 范例,首先请开启 VB 的线上手册(选取 VB 功能表的「说明/线上手册」),然後寻找「AddressOf」关键字,在找到的几个主题中,请选取「AddressOf 运算子范例」,然後依照指示将范例移植到程式中,最後执行程式,结果此一程式会列举系统中的字型,并且显示在表单上的 ListBox 中, 

    VB 的 AddressOf 范例

     

    此一范例的重点在於 EnumFontFamilies API 函数的呼叫(位於 Module1 的 FillListWithFonts 的副程式),EnumFontFamilies 的用途是列举系统的所有字型,但由於系统的字型数目是可变的,因此 Windows 规定呼叫此一函数时必须传入一个 Callback 程序让 Windows 把列举得到的字型一一传递给这个程序,为了将 Callback 程序的位址传给 Windows,我们可以发现 EnumFontFamilies 的参数叁如下:

     
    AddressOf EnumFontFamProc

     

    作用就是取得 EnumFontFamProc 程序的位址。



    --------------------------------------------------------------------------------
    强化 VB 的视窗程序
    --------------------------------------------------------------------------------

     

    由於 VB 的视窗程序是隐藏起来的,所以我们无法改变其中的程式码,但如果已知 hWnd,那麽 Windows 允许我们换掉既有的视窗程序,假设我们想将 Form1 预设的视窗程序改成我们所撰写的视窗程序(假设名称是 WndProc),则呼叫的 API 如下:

     

    ret = SetWindowLong(Form1.hWnd, GWL_WNDPROC, AddressOf WndProc)

     

    如此一来,VB 预设给 Form1 的视窗程序就会失效,而取而代之的是 WndProc 视窗程序,所以接下来就由 WndProc 来接收 Windows 的讯息了。

     

    视窗程序的插队游戏
    --------------------------------------------------------------------------------
     

    利用以上方法来改变 Form 的视窗程序,乍看之下,好像还不错,但实际却很危险,为什麽呢?想想,当我们想换掉某一个视窗程序时,至少要提供与原视窗程序相同的功能,而 VB 的视窗程序到底提供了哪些功能,我们并不清楚,所谓破坏容易建设难啊!解决此一问题,其根本原理请参考图-6,作法上是在原视窗程序前面插入另一个视窗程序,用以撷取我们希望处理的讯息,进而达到强化原视窗程序的效果,至於不处理的讯息,则呼叫 CallWindowProc 将讯息交由原视窗程序来处理,如此一来便不至於破坏原视窗程序的功能。此一作法 Windows 称之为 SubClassing,笔者则称之为视窗程序的插队游戏,要玩插队游戏,还有一些细节要注意。

     

    图-6 在原有的视窗程序之前插入另一个视窗程序

     

    记录原视窗程序的位址
    --------------------------------------------------------------------------------
     

    由於我们必须将不处理的讯息丢回原视窗程序,所以呼叫:

     

    ret = SetWindowLong(Form1.hWnd, GWL_WNDPROC, AddressOf WndProc)

     

    改变 Form1 的视窗程序之前,必须先记录原视窗程序的位址,方法如下:

     

    Dim prevWndProc As Long

    prevWndProc = GetWindowLong(Form1.hWnd, GWL_WNDPROC)

     

    传回值 prevWndProc 即为 Form1 原视窗程序的位址。

     

    插队用视窗程序的写法
    --------------------------------------------------------------------------------
     

    首先假设插队视窗程序的目的只为了插队,但插队之後什麽是也不做,那麽此一视窗程序收到讯息时,就原原本本地呼叫原视窗程序,则 WndProc 视窗程序如下:

     

    Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

    WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)

    End Function

     

    比较值得注意的是 CallWindowProc 的第一个参数必须传入原视窗程序的位址 prevWndProc

     

    如果想要在插队的视窗程序中处理某些讯息,则结构如下:

     

    Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long,
    ByVal lParam As Long) As Long     Select Case Msg
             Case WM_xxxx
                 ... 处理 WM_xxxx 的程式
             Case WM_xxxx
                 ... 处理 WM_xxxx 的程式
             Case Else
            WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
         End SelectEnd Function 

    取消插队行为

    --------------------------------------------------------------------------------


    一旦发生插队的行为,在视窗结束以前,一定要取消插队行为,否则程式会当掉,此时须将原视窗程序的位址设定回 Form1,如下:


    ret = SetWindowLong(Form1.hWnd, GWL_WNDPROC, prevWndProc)

     
    实例解析解说


    --------------------------------------------------------------------------------
    Option Explicit
    Public prevWndProc As Long

    Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

    Debug.Print hWnd, Msg, wParam, lParam

    WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)

    End Function

     

    在此一 .bas 程式中有几件事值得注意:

     

    Option Explicit 叙述:撰写呼叫 Windows API 的程式时,最好利用此一叙述禁止使用未宣告的变数,因为呼叫 Windows API 时,一旦资料型别不符合就很容易产生错误。
    prevWndProc 变数:用来记录原视窗程序的位址。
    视窗程序内容:在此一视窗程序中,暂时不处理任何讯息,因此直接呼叫 CallWindowProc 将讯息传给原视窗程序,此外也利用 Debug.Print 将视窗程序的几个参数显示出来,藉以了解讯息传递给视窗程序的情况。
     

    Option Explicit
    Private Sub Form_Load()
         Dim ret As Long
         prevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
         ret = SetWindowLong(Me.hWnd, GWL_WNDPROC, AddressOf WndProc)
    End SubPrivate Sub Form_Unload(Cancel As Integer)
         Dim ret As Long
         ret = SetWindowLong(Me.hWnd, GWL_WNDPROC, prevWndProc)
    End Sub 

    此一 .frm 程式的重点在於 Form_Load 及 Form_Unload 事件程序,其中笔者在 Form_Load 事件程序中(也就是 Form 载入时),将 WndProc.bas 的 WndProc 视窗程序插在原视窗程序之前,而在 Form_Unload 事件程序中则将原视窗程序还原回来。(特别注意:想结束程式,请按下 Form 的关闭钮,不要使用 VB 的结束钮,否则 Form_Unload 将不会被执行到)

     


    --------------------------------------------------------------------------------
    强化视窗程序的实例
    --------------------------------------------------------------------------------

     

    延续前面的 WndProc.vbp 程式,让我们来观察两个强化 VB 原视窗程序的实例。

     

    利用 WM_QUERYOPEN 讯息禁止视窗还原
    --------------------------------------------------------------------------------
     

    WM_QUERYOPEN 讯息发生於视窗由「最小化」还原时,在此笔者想利用此一讯息让视窗一直保留在最小化的状态,首先假设我们不利用此一讯息,而想利用 VB 既有的事件来达成相同的目的,那麽想到的方法是在 Form_Resize 事件程序中撰写以下程式:

     

    Private Sub Form_Resize()
         If WindowState <> vbMinimized Then
             WindowState = vbMinimized
         End If
    End Sub 

    这一段程式确实可以让视窗一直保持在最小化的状态,但使用者将视窗还原时,视窗会被先还原,然後才再缩小,结果可以看到视窗被还原然後又被缩小的过程。如果我们利用 WM_QUERYOPEN 讯息,则 WndProc 视窗程序只要如下修改即可:

     

    Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long,
    ByVal lParam As Long) As Long     If Msg = WM_QUERYOPEN Then
             ' 吃掉此一讯息,不再传递给原视窗程序
             ' 也就是不让原视窗程序得到视窗还原的讯息
         Else
            WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
         End If
    End Function 

    以上程式十分简单,只要在 WM_QUERYOPEN 讯息发生时,不再呼叫原视窗程序,使得原视窗程序不知有 WM_QUERYOPEN 讯息发生,於是便不会由最小化还原回来。

    非显示区的滑鼠事件


    --------------------------------------------------------------------------------

    VB 既有的事件中,只含有视窗「显示区」(client rect)的滑鼠事件,当我们把滑鼠移到非显示区(例如视窗标题区),则收不到 MouseMove 事件,假设我们的需求是:「滑鼠移到视窗上面时,即让视窗变成使用中」,若单纯使用事件程序来撰写程式,则如下:

     
    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

    Me.SetFocus

    End Sub

     

    但这个程式有点小瑕疵,那就是滑鼠移到非显示区,而没有移到显示区时,程式并没有作用,为了让程式能够收到滑鼠移到非显示区的讯息,我们可以撰写以下的视窗程序:
     

    Function WndProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long,
    ByVal lParam As Long) As Long     Dim ret As Long
         If Msg = WM_NCMOUSEMOVE Then
             Form1.SetFocus
         End If
        WndProc = CallWindowProc(prevWndProc, hwnd, Msg, wParam, lParam)
    End Function 

    在以上程式中,判断 Msg 是否等於 WM_NCMOUSEMOVE 讯息,便可得知使用者是否将滑鼠移到了非显示区,而由於我们不想改变视窗的行为,所以紧接着又呼叫了 CallWindowProc 将讯息传给原视窗程序。

    转载于:https://www.cnblogs.com/wskaihd/archive/2007/05/23/756819.html

    展开全文
  • VB Event 事件演示程序

    2009-02-06 09:25:18
    一个简单的关于VB的事件处理过程的演示程序,可以通过这种思想处理一些繁琐的过程^_^
  • “本节课程一起学习VB中常用的鼠标事件”VB是一种可视化编程语言,UI设计非常的方便。其用户交互中最为重要的方式是鼠标...01—鼠标事件的含义鼠标事件是指,用户使用鼠标发生的某个动作时触发的相应的事件。有时候...
     本节课程一起学习VB中常用的鼠标事件VB是一种可视化编程语言,UI设计非常的方便。其用户交互中最为重要的方式是鼠标,此前我们介绍过鼠标的单击事件。那么本节课程我们一起来详细的学习鼠标的各种事件。鼠标常用事件包括:Click、DblClick、MouseMove、MouseDown、MouseUp。01鼠标事件的含义鼠标事件是指,用户使用鼠标发生的某个动作时触发的相应的事件。有时候一个动作会触发多个事件。例如:鼠标单击时,不仅会触发Click事件,还会引发 MouseDown、MouseUp事件。鼠标事件及动作对应关系如下:Click 鼠标单击DblClick 鼠标双击MouseMove 鼠标移动MouseDown 鼠标按下MouseUp 鼠标抬起鼠标事件过程的建立:在代码区域,首先选中一个控件,然后选中想要的事件类型,然后系统便会自动为我们创建一个事件过程的代码框架了。我们只需要在其中编写相应的代码即可。05197fa46e6f638b835285253a2825e8.png02鼠标事件发生的顺序单击鼠标时:会依次发生MouseDownMouseUpClick事件双击鼠标时:会依次发生MouseDown、MouseUp、Click、DblClickMouseUp事件简单做一个程序验证一下,如下:首先绘制一个界面,一个窗体、一个标签控件、一个按钮。aca47b2e8c763486a51c9542ff3feceb.png然后编写代码,如下:
    Private Sub Command1_Click()    Me.ClsEnd SubPrivate Sub Label1_Click()      Print "click"End SubPrivate Sub Label1_DblClick()      Print "Dbclick"End SubPrivate Sub Label1_MouseDown(Button  _As Integer, Shift As Integer, X As Single, Y As Single)      Print "MouseDown"End SubPrivate Sub Label1_MouseUp(Button  _As Integer, Shift As Integer, X As Single, Y As Single)      Print "MouseUp"End Sub
    最后,运行程序,测试下单击和双击文本框的效果。

    单击标签

    2699bcc79bf8c77171520ff34d14521e.png

     双击标签

    adace65a8eb0d4eb92dd9044ca06376c.png03鼠标事件的参数以按钮的鼠标按下事件为例,其事件过程如下:

    Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

    其中有4个参数,它们的含义分别为:Button:该参数用来区别用户是通过鼠标的左键、右键或中键中的哪一个按下的。Button=1时,是鼠标左键;Button=2时,是鼠标右键;Button=4时,是鼠标中键。Shift:该参数用于判断用户在单击鼠标的同时是否按下了功能按键,功能键为Shift、Ctrl、Alt,当按下Shift键时,Shift=1,当按下Ctrl键时,Shift=2,当按下Alt键时,Shift=4。如果用户同时按下其中多个功能键,则Shift参数值等于它们对应的值之和。例如按下Shift和Ctrl按键时,Shift参数值为3。X:当前鼠标的坐标xY:当前鼠标的坐标y举例:30ae7db4bc4bfb74823f35f9c9d318c2.png代码如下:
    Private Sub Command1_MouseDown(Button  _As Integer, Shift As Integer, X As Single, Y As Single)      If Button = 1 Then Print "按了左键"      If Button = 2 Then Print "按了右键"      If Button = 4 Then Print "按了中键"      Print "Shift值:" & Shift      Print "鼠标位置:" & X & " " & Y      PrintEnd Sub
    04实例操作需求:设计一个贱贱的《来抓我》游戏,游戏界面中只有两个按钮,玩家目标是用鼠标点击到按钮则算胜利。当然,游戏可不会这么简单,因为当鼠标移动到按钮时,按钮的位置就会改变,所以能不能点到鼠标就看你的毅力和运气啦。界面设计:6b48fed4a3148a5ead59a419225768be.png代码设计:
    Private Sub Command1_Click()      MsgBox "你真厉害"End SubPrivate Sub Command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)      Command1.Left = Rnd * (Me.Width - Command1.Width)      Command1.Top = Rnd * (Me.Height - Command1.Height)End SubPrivate Sub Command2_Click()      MsgBox "你真厉害"End SubPrivate Sub Command2_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)      Command2.Left = Rnd * (Me.Width - Command2.Width)      Command2.Top = Rnd * (Me.Height - Command2.Height)End Sub
    运行效果:c1b7b1fd7e3d917bacb8a244d064281d.pngc1b7b1fd7e3d917bacb8a244d064281d.pngc1b7b1fd7e3d917bacb8a244d064281d.png醉了,抓了几分钟还没抓到,我要砸鼠标啦~~
    展开全文
  • VB自定义事件

    2016-10-14 17:49:00
    关于vb自定义事件,看了很多博客都是抄同一篇,第一次看时候没看明白,现在自己弄清楚了重新整理下。 首先定义一个事件(必须定义在窗体或类模块中本文定义在类模块MyClass),  Public Event MyEvents(ByVal ...

    关于vb自定义事件,看了很多博客都是抄的同一篇,第一次看的时候没看明白,现在自己弄清楚了重新整理下。

    首先定义一个事件(必须定义在窗体或类模块中本文定义在类模块MyClass), 

    Public Event MyEvents(ByVal str1 As String) 

    同时在MyClass 中定义个触发该事件的函数

    Sub MyData(ByVal str1 As String)
      RaiseEvent MyEvents(str1)
    End Sub

    然后在需要触发该事件的窗体 Form1 中定义该类模块

    Private WithEvents class1 As MyClass

    在窗体中添加按钮 Command1 ,Command1点击时调用函数 MyData

    Private Sub Command1_Click()
      Set class1 = New MyClass
      class1.MyData ("FirstEvent")
    End Sub

    在Form1 中写触发事件class1_MyEvents,class1为From1 中定义的类模块,MyEvents为MyClass中的事件,这个名称是固定的,否则无法触发

    Public Sub class1_MyEvents(ByVal str1 As String)
      MsgBox "【" & str1 & "】触发了该事件!"
    End Sub

     

    转载于:https://www.cnblogs.com/KEY-FCQ/p/5961454.html

    展开全文
  • vbvb.net事件机制

    千次阅读 2013-06-25 12:35:17
    学习java事件前,回顾了下vb6和vb.net的事件机制,总结在这里,供对比用。  事件是面对对象中对象间通信的方法。事件发生者(又叫事件源)发生一个事件时,通过发送一条消息,给事件接受者(事件处理者),事件...

    学习java事件前,回顾了下vb6和vb.net的事件机制,总结在这里,供对比用。

        事件是面对对象中对象间通信的方法。事件发生者(又叫事件源)发生一个事件时,通过发送一条消息,给事件接受者(事件处理者),事件接受者可以做出响应的处理。比如在某登录界面中,单击一个按钮,系统会验证用户的用户名和密码是否正确。用户单击按钮后,按钮(事件源)发出了单击事件,产生了自己被单击的消息给窗体,窗体(事件接受者)在自身代码窗口中进行响应的处理。

     

    我们分别看下在vbvb.net中是怎么实现事件机制的。

        在vb6中,使用Event关键字定义事件,raiseEvent发出事件消息,在接受者的类中使用WithEvent表明自己是某个类的事件的接受者,我们看这样两段代码:

        首先建立一个窗体,是一个登录窗体,输入用户名和密码后,点击登陆按钮可以登陆,代码(vb6)如下,使用了WithEvent来接收验证类(verifyClass)的消息:

    Option Explicit
    
    '本句代码表明该窗体能接受验证类的事件消息
    Private WithEvents vfClass As VerifyClass
    
    Private Sub cmdLogin_Click()
        '定义用户名和密码
        Dim userName As String
        Dim password As String
        '定义返回结果
        Dim Result As Boolean
        Set vfClass = New VerifyClass
        
        userName = txtUserName.Text
        password = txtPassword.Text
        
        '将用户名和密码传到验证类进行验证
        Result = vfClass.Verify(userName, password)
        
    End Sub
    
    Private Sub Form_Load()
    
    End Sub
    
    '引发验证失败事件后,在此处可以进行相应处理
    Private Sub vfClass_loginFail(ByVal userName As String)
        MsgBox (userName + "登录失败")
    End Sub
    '验证成功事件
    Private Sub vfClass_LoginSuccess(ByVal userName As String)
         MsgBox (userName + "登录成功")
    End Sub
    
    接下来添加一个类模块,是登陆窗体中用到的验证类(verifyClass)的代码,里面定义(Event)了并引发(raiseEvent)了事件:

    Option Explicit
    
    '定义验证成功和失败的事件
    Public Event LoginSuccess(ByVal userName As String)
    Public Event loginFail(ByVal userName As String)
    
    '验证方法:对用户名和密码进行验证
    Public Function Verify(ByVal userName As String, ByVal password As String) As Boolean
        Dim blnResult As Boolean
        
        If userName = "123" And password = "123" Then
            '如果正确,发出登陆成功的消息
            RaiseEvent LoginSuccess(userName)
            blnResult = True
        Else
            '错误则发出登陆失败的消息
            RaiseEvent loginFail(userName)
             blnResult = False
        End If
        Verify = blnResult
        
    End Function
    


    vb.net中事件的实现机制同vb基本相同,并且有了优化,通过Handles关键字,使事件实现的机制更灵活,handles可以使多个事件到同一个事件处理程序:

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click, Button3.Click
            System.Windows.Forms.MessageBox.Show("我被触发了")
    End Sub

    也可以通过AddHandler动态的绑定事件处理程序,即可以根据当时的条件选择将要绑定的事件处理程序,看下面这个例子。

    首先定义一个person类,有走路这个事件,在走路方法中触发走路事件

    Public Class Person
    
        Public Event walked(ByVal Distance As Integer)
    
        Public Sub walk(ByVal Distance As Integer)
            RaiseEvent walked(Distance)
        End Sub
    
    End Class
    


    接下来新建一个窗体类,窗体上有一个文本框和一个按钮,代码如下

    Public Class Form1
        '本句代码表明该窗体能接受验证类的事件消息
        Public WithEvents objPerson As Person
    
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click
            objPerson = New Person()
            '满足条件下才执行绑定操作
            If (TextBox1.Text = "1") Then
                '满足条件,执行动态绑定,将事件绑定到某方法,该方法转变成事件处理程序
                AddHandler objPerson.walked, AddressOf Person_walk
                objPerson.walk(50)
            Else
                System.Windows.Forms.MessageBox.Show("您输入的文本不是1")
            End If
    
        End Sub
        '触发的事件将绑定到本事件处理程序
        Public Sub Person_walk(ByVal Distance As Integer)
            System.Windows.Forms.MessageBox.Show("a person walked" + Distance.ToString() + " kilometer!")
        End Sub
    
    End Class

    这就是vb和vb.net的事件处理机制,等学了java事件机制后将进行对比。



    展开全文
  • VB键盘事件详解

    2021-01-29 19:44:23
    “ 本节课程一起学习VB键盘事件。” 键盘事件的作用: 获得键盘输入信息,只有获得焦点对象才能接受键盘事件。 键盘事件有三种: KeyPress、KeyDown、KeyUp KeyPress: 按了键盘某键时触发,返回键盘Ascii...
  • VB 对象用户事件

    2010-06-07 09:44:35
    VB 对象用户事件 VB 对象用户事件
  • VB 对象系统事件

    2010-06-07 09:43:44
    VB 对象系统事件 VB 对象系统事件
  • VB对象的事件和方法

    2020-09-15 12:44:45
    对象的事件: 事件是指对象对于外部动作的响应,当对象发生了某个事件,就会执行相应的代码,这段代码被称为“事件过程”。 事件是Visual Basic预先编辑好的并且能够被对象识别的的动作,VB采用的是事件驱动机制,当...
  • VB无法直接捕捉XMLHTTP的事件,因为它不支持COM的事件,如何解决呢MSDN提供了三种使用OnReadyStateChange事件的方法:1.使用Timer轮询readystate属性2.使用带WithEvents声明的DomDocument对象load Xml3.自定义一个类,在...
  • VB6自定义事件怎么定义 VB6自定义事件怎么定义 VB6自定义事件怎么定义 VB6自定义事件怎么定义 VB6自定义事件怎么定义 VB6自定义事件怎么定义 VB6自定义事件怎么定义 VB6自定义事件怎么定义 VB6...
  • VB常用控件的事件详解
  • 对象的事件:事件是指对象对于外部动作的响应,当对象发生了某个事件,就会执行相应的代码,这段代码被称为“事件过程”。事件是Visual Basic预先编辑好的并且能够被对象识别的的动作,VB采用的是事件驱动机制,当...
  • VB窗体事件的问题

    2012-04-05 16:36:27
    VB运行程序是,一个工程中包含很多窗体事件,为什么运行时出现是一个窗体呢?VB新手,希望各位高手们给予指点!!谢谢
  • VB键盘事件shift参数,vb*mask

    千次阅读 2016-11-26 12:43:09
    VB 键盘按键事件的shift参数以及vbshiftmask,vbctrlmask,vbaltmask前瞻:1.shift参数值表 以及 vb*mask 值表2.ShiftDown=(Shift And vbShiftMask)>0如何理解正文:1.shift参数值表 以及 vb*mask 值表比如这两个函数...
  • VB picturebox控件拖动事件
  • VB事件编写.doc

    2020-05-13 21:33:53
    VB.NET事件编写对初学者有时一头雾水,网上讲解代码往往写繁琐,让初学者看了大半天,实战几小时才弄半明半白。
  • \VB keypress事件中键盘上每个键KeyAscii值
  • “本节课程一起学习VB键盘事件。”键盘事件的作用:获得键盘输入信息,只有获得焦点对象才能接受键盘事件。键盘事件有三种:KeyPress、KeyDown、KeyUpKeyPress:按了键盘某键时触发,返回键盘Ascii码值...
  • 事件申明如下:event event_name(parameterlist)在事件所在的类里还得必须声明一个过程来触发事件sub execute_envet raiseevent event_nameend sub在定义事件之后,还得为事件指定相应的事件过程,否则
  • 事件委托支持为同一个DOM元素注册多个同类型事件可将事件分为事件捕获和事件冒泡机制事件委托的作用通过事件委托我们可以减少页面中的事件监听函数,提升性能例子解析注册多个事件用以往注册事件的方法,如果存在多个...
  • VB 事件

    2008-06-25 11:44:00
    一直以来,只知道使用类、对象、事件,就是没有试过自定义类的事件,通过查找了很多资料后才得到以下结论,在这里做一个笔记以后需要时再使用: 假设有类FxDraw 1.新建一个事件,如 Public Event FxEvents() 2....
  • 只贴了核心代码,意思是vb6做的一个窗体中含有WebBrowser控件,点击控件里的网页,触发了vb的事件,该部分代码已经完成,但是出现一个问题,就是网页中的input竟然无法输入,请问如何解决此问题? Private Sub ...
  • VB事件大全

    2014-10-29 21:53:02
    Change 事件示例 本例在 TextBox 控件中显示水平滚动条 Value 属性数值。要尝试这个例子,需创建一个带有 TextBox 控件及 HScrollBar 控件窗体,然后将码粘贴到一个带有水平滚动条 (HScrollBar 控件) 和 ...
  • VB事件

    2007-08-20 18:34:00
    公共事件 BackColorChanged 当 BackColor 属性值更改时发生。 BackgroundImageChanged 当 BackgroundImage 属性值更改时发生。
  • 高手论声明VB.NET事件

    2012-10-31 18:24:13
    如果在运行线程后采用循环查询方法显然影响了交互性,VB.NET事件是从线程方法返回数据好方法,文章有详细介绍。 AD: VB.NET经过长时间发展,很多用户都很了解VB.NET事件了,这里我...
  • VB事件和方法区别

    万次阅读 2012-08-19 21:30:07
    你可以把人体看作窗体对象,耳朵作为窗体上一个控件,比如说你听到了一句话,这时就激活了耳朵OnLister事件, Private sub 耳朵_OnLister(ByVal 说话人 as 人) select case 说话人 case 老婆: call ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,058
精华内容 1,223
关键字:

vb的事件