You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 11:20:06