winforms 在自定义控件内创建工具提示并链接到该控件

kg7wmglp  于 2022-12-14  发布在  其他
关注(0)|答案(1)|浏览(99)

我有一个带有多个窗体的vb.NET应用程序。(这个问题适用于任何.NET项目)目前许多应用程序的窗体上都有PictureBox控件。我希望此控件的行为标准化,因此我创建了一个带有setter、选项和事件的自定义类。
以前每个表单都有自己的ToolTip对象来显示下载的图像,但我不想在每个表单上重新定义它-所以我在控件中将imageToolTip定义为全局变量,并在OnHandleCreated方法中创建它并设置处理程序。
但它们从不触发。

Public Class ItemPreviewBox
    Inherits PictureBox
    Private imageToolTip As ToolTip
    Private _ItemType, _ItemNum As String
    Private _ColorID As Integer
    Private _Thumb As Boolean
    Private _Label As Label = New Label
    
    Protected Overrides Sub OnHandleCreated(e As EventArgs)
        MyBase.OnHandleCreated(e)
        imageToolTip = New ToolTip With {
            .OwnerDraw = True
        }
        imageToolTip.SetToolTip(Me, "")
    
        SizeMode = PictureBoxSizeMode.Zoom
        Cursor = Cursors.Hand
    
        AddHandler imageToolTip.Popup, AddressOf HandlePopup
        AddHandler imageToolTip.Draw, AddressOf HandleDraw
        AddHandler Click, AddressOf HandleClick
    
    End Sub
    
    Private Sub HandlePopup(sender As ToolTip, e As PopupEventArgs)
        Log("Tooltip Popped Up")
        If _ItemType Is Nothing Then e.Cancel = True
        e.ToolTipSize = New Size(250, 200)
    End Sub
    
    Private Sub HandleDraw(sender As ToolTip, e As DrawToolTipEventArgs)
        If _ItemType Is Nothing Then Exit Sub
        LogVerbose("opening image tooltip")
        e.Graphics.Clear(SystemColors.Info)
        Dim imgFileName = CacheImage(_ItemType, _ItemNum, _ColorID, _Thumb) 'Returns a string
        Log($"{e.AssociatedControl.Name} - {e.AssociatedControl.Location.X},{e.AssociatedControl.Location.Y} top={e.AssociatedControl.Top} left=top={e.AssociatedControl.Left}")
        e.Graphics.DrawImage(Image.FromFile(imgFileName), New Rectangle(0, 0, 250, 200))
    End Sub

Click事件(与工具提示无关)会触发。
我也尝试过将工具提示代码移到所属窗体的Shown事件中(用控件的名称替换“Me”),它工作得很好。
工具提示是否需要将窗体而不是控件作为其父级?当自定义PictureBox为时,是否有任何方法可以示例化自定义工具提示?

inb24sb2

inb24sb21#

我在ToolTip的文档中找不到这一点,但根据CodeProject上的一篇文章:
动态设定控件的工具提示需要快显事件,但如果以空字串参数呼叫SetToolTip,控件的快显事件将会停止。(https://www.codeproject.com/Tips/59501/Implementing-Dynamic-ToolTips-Preventing-SetToolTi
我设置了一个空字符串,因为我只打算显示一个图像,否则效率会很低。将SetToolTip行更改为

imageToolTip.SetToolTip(Me, "Lorem Ipsum")

解决了问题。

相关问题