【问题标题】:Changing cursor for ToolBarButton in Windows Forms在 Windows 窗体中更改 ToolBarButton 的光标
【发布时间】:2017-09-25 10:46:10
【问题描述】:

请注意:

在这篇文章中,我指的是过时的 ToolBarButton不是 ToolStripButton

我正在实现一个帮助功能,您可以在其中进入帮助模式以显示某些 ui 元素的帮助。将鼠标悬停在附加了此类帮助的元素上后,光标应更改为 Cursors.Help。这适用于大多数元素,但不适用于ToolBarButtons,因为它缺少.Cursor 属性。

到目前为止,我一直在做的是:

Private Sub EnterHelpMode() 
    helpMode = True
    toolBar.Cursor = Cursor.Help
    ' ... other help-related stuff
End Sub

不幸的是,这给了整个ToolBar 那个帮助图标。我如何实现相同的行为但仅适用于ToolBarButtons?我还尝试使用ToolBar 上的MouseEnter 事件,但与ButtonClick 事件不同的是,这个事件没有给我ToolBarButtonClickEventArgs 参数,所以我无法确定哪个ToolBarButton 被悬停(哪个有道理,因为源并不总是ToolBarButton,而ButtonClick 是)。

提前致谢

【问题讨论】:

  • 这不是正确的方法,也不是标准的方法。 Capture 属性是关键,单击帮助按钮时将其设置为 true。您现在可以完全控制 Cursor.Current 并获取所有 MouseMove 事件。进行点击测试以查看悬停的控件或工具条项目并相应地更改 Cursor.Current。获得 MouseDown 时停止帮助模式并显示相关主题。
  • 谢谢,我看看能不能搞定
  • @HansPassant 我无法使用ToolBarButton 进行命中测试,因为它缺少ClientRectangle 方法。关于如何做到这一点的任何建议?
  • 您必须再次以相反的方式执行此操作。使用窗体的 GetChildAtPoint() 方法来查找被悬停的控件。这将返回一个 ToolStrip,现在您可以使用它的 GetItemAt() 方法来获取 ToolStripItem。
  • 哦,糟糕。好吧,关于相同的配方,测试 ToolBar,然后迭代其 Button 以针对其 Rectangle 进行命中测试。

标签: .net vb.net winforms mouseevent


【解决方案1】:

修改为使用帮助模式:

Dim HelpMode as Boolean = False  ' a global variable

Private Sub tsButton_Click(sender As Object, e As EventArgs) Handles tsbUpdte.Click
    HelpMode = True
    Me.Cursor = Cursors.Cross
End Sub


Private Sub HelpForControls_MouseDown(sender As Object, e As EventArgs) Handles tsButton1.MouseDown, tsButton2.MouseDown
    If HelpMode = True Then
        Me.Cursor = Cursors.Default 
        Dim oName as String = CType(Sender, ToolStripButton).Name   ' this works only for ToolStripButtons        
        Call ShowHelp(oName)   ' show some help content using a dedicated sub
        HelpMode = False
        Exit Sub   ' terminate function
    End If
End Sub

Private Sub ShowHelp(StrName as String)
    SELECT CASE StrName
       Case "BtnEdit" : MsgBox("This button will allow you to edit selected record.")
       Case "BtnDelete" : MsgBox("This button will allow you to delete selected record.")
    End Select
End Sub

您也可以使用 Me.Capture 并检查单击的内容(如 cmets 中所建议的那样),但我没有使用此属性的经验。

【讨论】:

  • 我说的是ToolBarButton。也许我只是不知道怎么做,但他们不让我听 MouseEnter(我已经试过了),正如我所说,我不能改变他们的光标
  • 是的,按照建议,您需要使用 HelpMode。我会修改我的答案,希望它能帮助指导你......
  • 你的对象tsButton1是什么类型的?
  • 这是按钮。因此,正如评论所暗示的,这仅适用于按钮(或 1 组对象类型)。如果您需要混合对象(即图片框、按钮、组合框...),则必须在接收对象名称的行上展开逻辑(CType(sender,Button).Name)。也许有一个方法(我不知道)可以获取 Name 属性,而不管对象的类型...如果您使用其他方法(.Capture),我认为您也将需要这个子例程。
  • 啊! “虽然 ToolStripButton 替换并扩展了以前版本的 ToolBarButton 控件,但如果您选择,则保留 ToolBarButton 以便向后兼容和将来使用。” - 这表示 MS。老实说,我不确定你可以用 TBB 做什么,它甚至不在我的 VisualStudio 的工具箱中,我什至不记得在那里见过它。我想知道,您是如何将 ToolBar 加入到您的项目中的……
猜你喜欢
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 2011-04-04
相关资源
最近更新 更多