如何检测NavigationControl导航控件的背景区域被点击?
问题描述
我有一个NavigationControl导航控件,其前方有一个ComboBox组合框:
当用户点击NavControl的背景区域(青绿色部分)时,NavControl会获得焦点并移至ComboBox前方,导致ComboBox在NavControl失去焦点前无法点击。我编写了以下子程序来解决该问题,但点击NavControl左侧的任意选项卡时它也会触发:
Private Sub NavControl_GotFocus() cbxSearch.SetFocus End Sub
请问NavControl是否有属性可以区分背景被点击还是选项卡被点击?类似如下逻辑:
Private Sub NavControl_GotFocus() 'if navcontrol.tabclicked = "" then cbxSearch.SetFocus 'end if End Sub
解决方案
Access的NavigationControl本身没有直接区分“点击背景”和“点击选项卡”的属性,但可以通过两种方法实现需求:
方法1:利用Current事件做标志判断
NavigationControl的Current事件仅在用户切换选项卡时触发,我们可以用一个全局变量做标志,区分点击来源:
Dim isTabClicked As Boolean Private Sub NavControl_Current() isTabClicked = True End Sub Private Sub NavControl_GotFocus() If Not isTabClicked Then cbxSearch.SetFocus End If '重置标志,避免影响下一次判断 isTabClicked = False End Sub
逻辑:点击选项卡时会先触发Current事件,将标志设为True,此时GotFocus不会执行焦点转移;点击背景时不会触发Current,标志保持False,自动把焦点切回ComboBox。
方法2:通过点击坐标精准判断
利用MouseDown事件获取点击的坐标,结合选项卡的实际宽度范围,判断是否点击了背景区域:
Private Sub NavControl_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) '根据你的控件实际情况调整选项卡区域的宽度阈值(示例为150) If X > 150 Then Me.Tag = "BackgroundClicked" Else Me.Tag = "TabClicked" End If End Sub Private Sub NavControl_GotFocus() If Me.Tag = "BackgroundClicked" Then cbxSearch.SetFocus End If Me.Tag = "" End Sub
逻辑:在MouseDown时记录点击位置的标记,GotFocus时根据标记决定是否转移焦点。需要自己测试控件的选项卡宽度,调整判断的X值。
内容的提问来源于stack exchange,提问作者MaybeOn8
相关产品推荐
相关产品推荐

