解决这个问题最简单的方法就是修改控件中IOleInPlaceActiveObject接口。代码不长,不过原理挺复杂的。
部分代码如下:
子类控件窗体,在消息WM_SETFOCUS中实现如下代码:
Dim pOleObject As IOleObject
Dim pOleInPlaceSite As IOleInPlaceSite
Dim pOleInPlaceFrame As IOleInPlaceFrame
Dim pOleInPlaceUIWindow As IOleInPlaceUIWindow
Dim pOleInPlaceActiveObject As IOleInPlaceActiveObject
Dim PosRect As RECT
Dim ClipRect As RECT
Dim FrameInfo As OLEINPLACEFRAMEINFO
'Get in-place frame and make sure it is set to our in-between
'implementation of IOleInPlaceActiveObject in order to catch
'TranslateAccelerator calls
Set pOleObject = Me
Set pOleInPlaceSite = pOleObject.GetClientSite
pOleInPlaceSite.GetWindowContext pOleInPlaceFrame, pOleInPlaceUIWindow, VarPtr(PosRect), VarPtr(ClipRect), VarPtr(FrameInfo)
CopyMemory pOleInPlaceActiveObject, m_IPAOISHook.ThisPointer, 4
pOleInPlaceFrame.SetActiveObject pOleInPlaceActiveObject, vbNullString
If Not pOleInPlaceUIWindow Is Nothing Then
pOleInPlaceUIWindow.SetActiveObject pOleInPlaceActiveObject, vbNullString
End If
CopyMemory pOleInPlaceActiveObject, 0&, 4
这样可以处理TAB键的焦点问题,但方向键就无效了。
完整的解决方案你可以参看http://www.vbaccelerator.com/home/index.asp,作者在自己的自定义控件里都解决了你所说的问题,细心研究一下就可以了。