VB中LostFocus、GotFocus事件的改进

王朝厨房·作者佚名  2007-01-04
宽屏版  字体: |||超大  

重庆邮电学院 徐原

---- 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连带程序一起关掉。

---- 本程序在VB6.0企业版中调试通过。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有