即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

VB怎么样触发焦点事件和失去焦点事件

编程语言 qq_35767600 15℃ 0评论

VB中有一个LostFocus事件和一个GotFocus事件,看名字似乎是当当前窗口失去焦点或得到焦点时触发的事件。但在实际应用时却发现当这个窗口和Windows中其他窗口进行切换时并没有触发这两个事件。现在解析一下这两个事件。 





—- Form_LostFocus、Form_GotFocus是指的是一个MDI主父窗体调用了多个子窗体,当这些子窗体之间切换时,就触发这两个事件;当一个窗体中的多个文本框,鼠标点击另一个文本框时,也会触发这两个此事件,文本框在 Windows内部实际上也是一个窗口。 





—- Windows内部是通过消息来触发事件的,这两个事件在Windows内部对应的消息是WM_NCACTIVATE,当该消息的wParam为0时表示是失去焦点,为非0时表示得到焦点。在模块中: 





Public Declare Function SetWindowLong Lib 


“user32” Alias “SetWindowLongA” _


(ByVal hwnd As Long, ByVal nIndex As Long, 


ByVal dwNewLong As Long) As Long 





Public Declare Function DefWindowProc Lib 


“user32” Alias “DefWindowProcA”_


(ByVal hwnd As Long, ByVal wMsg As Long,


ByVal wParam As Integer, ByVal_


lParam As Long) As Long 





Public Declare Function CallWindowProc Lib


“user32” Alias “CallWindowProcA” _


(ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, 


ByVal Msg As Long, ByVal _


wParam As Long, ByVal lParam As Long) As Long 





Public Const WM_NCACTIVATE = &H86 


Public Const GWL_WNDPROC = (-4) 


Public OldWndProc& 





Public Function Hook&(ByVal hWnd1&) 


OldWndProc = SetWindowLong(hWnd1,


GWL_WNDPROC, AddressOf NewWndProc) 


Hook = OldWndProc 


End Function 





Public Sub UnHook(ByVal hWnd1&) 


SetWindowLong hWnd1, GWL_WNDPROC, OldWndProc 


End Sub 





Public Function NewWndProc&(ByVal hWnd1&, ByVal uMsg&,


ByVal wParam&, ByVal lParam&) 


If uMsg = WM_NCACTIVATE Then 


   If wParam = 0 Then ’失去焦点


      Form1.Caption = “失去焦点” 


       注释:在这里加入在失去焦点时想要执行的代码


   Else


              Form1.Caption = “得到焦点”  


        ’在这里加入在得到焦点时想要执行的代码


   End If 


End If 


NewWndProc = CallWindowProc(OldWndProc, 


hWnd1, uMsg, wParam, lParam) 


End Function 





窗口中代码如下: 





Private Sub Form_Load() 


Hook Form1.hwnd 


End Sub 





Private Sub Form_QueryUnload(Cancel As Integer,


UnloadMode As Integer) 


UnHook Form1.hwnd 


End Sub 





—- 注意:在编写“失去焦点”和“得到焦点”的代码时,不要使用VB本身自带的函数,如: MsgBox()和Print()等,因为这里不支持,要用MessageBox()、TextOut()等API函数来代替,否则VB会出现“非法保护性错误”而把VB连带程序一起关掉。 




转载请注明:CodingBlog » VB怎么样触发焦点事件和失去焦点事件

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情