使 ShowHint 在具有多个不同 Rect 的自定义控件上工作,每个 Rect 都有自己的 Hint

Make ShowHint work on custom control with several different Rects, each with their own Hint

使用 C++ Builder 2009

我有一个继承自 TCustomControl 的自定义控件,我在上面绘制了几个带有内容等的正方形 (TRect)

我现在想在将鼠标悬停在每个方块上时显示提示,但我不确定如何最好地实现这一点。

我试图简单地使用 TCustomControlShowHint,并在我将鼠标悬停在方块上时更改 Hint,但问题是控件不再显示提示在它第一次消失之后,除非我离开控制然后回到它。 我希望我可以简单地 'reset' 它是从一个方块悬停到另一个方块时的状态,但它不起作用。

假设我的方法一开始是错误的,请告诉我应该怎么做才能达到预期的效果?

if (State == rsHover && Item->FState != rsHover) // Not in the rsHover state yet, but going to
    {
    if (Item->Hint.Length())
        {
        if (ShowHint)
            {
            // Attempt to reset Hint's internal working, to no avail
            Hint = L"" ;
            ShowHint = false ;
            }

        Hint = Item->Hint ;

        ShowHint = true ;
        }
    else
        {
        ShowHint = false ;
        }
    }
else if (State != rsHover)
    {
    ShowHint = false ;
    }

实现此功能的正确方法是让您的组件处理 CM_HINTSHOW 消息。消息的 LParam 值将是指向 THintInfo 记录的指针,您可以根据需要自由修改其字段(特别是 HintStrCursorRect)。

要访问记录,您可以

  • 直接将 LParam 类型转换为 THintInfo*

  • 将整个 TMessage 类型转换为 TCMHintShow,然后访问其 HintInfo 字段。

通过定义您自己的 CursorRect 矩形,您可以“[将您的控件] 分成几个提示区域”,每个区域具有不同的 HintStr 值。 CursorPos 字段指示鼠标在控件中的当前位置。当鼠标移出当前CursorRect之外时,控件会收到新的CM_HINTSHOW消息,您可以根据需要更新CursorRectHintStr字段。