如何阻止在VB6中从上下文菜单选择选项时出现额外的上下文菜单?

3
我正在维护一个包含ComponentOne VSFlexGrid 7.0的VB6表单应用程序。我们有一个自定义上下文菜单,允许用户执行一些特殊的复制和粘贴操作。最近,我们遇到了以下问题:
  1. 在其中一个单元格中突出显示一些文本。
  2. 右键单击单元格,文本仍然突出显示。
  3. 选择其中一个上下文菜单选项。
  4. 所请求的上下文菜单操作发生。
  5. 另一个类似于此处(链接)显示的上下文菜单出现,其中包括“从右到左的阅读顺序”,“打开IME”和“重新转换”等选项。
如何使第二个上下文菜单消失?我已尝试了Microsoft Knowledge Base描述的方法,但迄今为止没有成功。我的WindowProc函数如下:
Function WindowProc(ByVal hw As Long, _
                    ByVal uMsg As Long, _
                    ByVal wParam As Long, _
                    ByVal lParam As Long) As Long

    Select Case uMsg
        Case WM_RBUTTONUP
            frmMain.PopupMenu frmMain.mnuPopUp
        Case Else
            WindowProc = CallWindowProc(lpPrevWndProc, hw, _
                                       uMsg, wParam, lParam)
    End Select
End Function

复制操作完成后,我看到的uMsg值为15(WM_PAINT)和32(WM_SETCURSOR)。我还注意到,当我没有在单元格中突出显示文本时,会触发一个表单级别的MouseUp事件,但是当我在单元格中突出显示文本时,它不会触发。

请有更深入了解VB6和/或ComponentOne的人给我更多关于发生的事件序列以及如何防止这个额外的上下文菜单出现的详细信息。


1
您在网格上有“BeforeMouseDown”事件吗?如果是右键单击,请尝试设置“Cancel = True”。 - wqw
@wqw:是的,设置Cancel = True确实可以隐藏额外的上下文菜单。不过,在BeforeMouseDown中执行似乎有点早了。如果是稍后触发的事件,比如MouseDown或MouseUp,它仍然有效吗? - David
我认为MouseDown/Up不会触发,但是没有办法取消菜单挂钩的WM_RBUTTONUP。WM_CONTEXTMENU是一种更文明的方法,但它是由DefWindowProc实现的,并且没有要求自定义控件调用它,因此您的网格可能不支持它 - 您必须进行测试。 - wqw
@wqw:请把你的评论写成答案。我想我会接受它。我仍然需要听取正在解决这个错误的开发人员的意见。他在另一个办公室,我代表他提出了这个问题。 - David
2个回答

2

您应该处理WM_CONTEXTMENU来显示上下文菜单,而不是WM_RBUTTONUP(因为不仅右键单击可以触发它)。


+1. 我认为这开始指向了正确的方向。你看到我在原帖中提到的额外上下文菜单了吗? - David
不,我没有使用你的代码,但那个消息是触发真正上下文菜单的。如果你覆盖了它,那么真正的菜单就不应该显示出来。 - Deanna

1
BeforeMouseDown事件中,如果用户右键单击,请尝试设置Cancel = True

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接