【问题标题】:Win32 tooltip gray line bug in Windows 10Windows 10 中的 Win32 工具提示灰线错误
【发布时间】:2015-10-23 10:38:30
【问题描述】:

自 Windows XP 时代以来,我们多年来一直在使用在我们的旧版 VB6 组件中创建经典 Win32 多行工具提示的代码。它在除 Windows 10 之外的所有最新版本的 MS Windows(7、8.1)中都能正常工作。此操作系统的工具提示中出现一条寄生的水平灰线。这个问题的最佳演示是一个包含多行文本的工具提示窗口(主要提示文本是多行的和/或工具提示有一个粗体标题):

正确的工具提示应该如下所示(来自 Windows 8.1 的屏幕):

当工具提示窗口没有平铺/图标但仅包含多行文本时,以下是同一问题的另一个示例:

这条寄生灰线也出现在单行工具提示中 - 虽然乍一看并不明显:

可能是什么?是 Windows 10 中的错误,还是工具提示 API 发生了变化?


下面是用于初始化工具提示的方法代码:

Public Function Create(ByVal ParentHwnd As Long) As Boolean
   Dim lWinStyle As Long

   If m_lTTHwnd <> 0 Then
      DestroyWindow m_lTTHwnd
   End If

   m_lParentHwnd = ParentHwnd

   lWinStyle = TTS_ALWAYSTIP Or TTS_NOPREFIX

   m_lTTHwnd = CreateWindowExA(0&, _
      TOOLTIPS_CLASS, _
      vbNullString, _
      lWinStyle, _
      CW_USEDEFAULT, _
      CW_USEDEFAULT, _
      CW_USEDEFAULT, _
      CW_USEDEFAULT, _
      0&, _
      0&, _
      App.hInstance, _
      0&)

   'now set our tooltip info structure
   Dim tiA As TOOLINFOA
   Dim tiW As TOOLINFOW
   If g_bIsNt Then
      With tiW
         .lSize = Len(tiW)
         .lFlags = TTF_SUBCLASS Or TTF_IDISHWND
         .hWnd = m_lParentHwnd
         .lId = m_lParentHwnd '0
         .hInstance = App.hInstance
         .lpStr = StrPtr(mvarTipText)
      End With
   Else
      With tiA
         .lSize = Len(tiA)
         .lFlags = TTF_SUBCLASS Or TTF_IDISHWND
         .hWnd = m_lParentHwnd
         .lId = m_lParentHwnd
         .hInstance = App.hInstance
         .lpStr = mvarTipText
      End With
   End If

   'add the tooltip structure
   If g_bIsNt Then
      SendMessage m_lTTHwnd, TTM_ADDTOOLW, 0&, tiW
   Else
      SendMessage m_lTTHwnd, TTM_ADDTOOLA, 0&, tiA
   End If

   'if we want a title or we want an icon
   If mvarTitle <> vbNullString Or mvarIcon <> igToolTipIconNone Then
      If g_bIsNt Then
         SendMessage m_lTTHwnd, TTM_SETTITLEW, mvarIcon, ByVal StrPtr(mvarTitle)
      Else
         SendMessage m_lTTHwnd, TTM_SETTITLEA, mvarIcon, ByVal mvarTitle
      End If
   End If

   ' set the time parameters
   SendMessageByLongA m_lTTHwnd, TTM_SETDELAYTIME, TTDT_AUTOPOP, mvarVisibleTime
   SendMessageByLongA m_lTTHwnd, TTM_SETDELAYTIME, TTDT_INITIAL, mvarDelayTime

   'according to MSDN, we should set TTM_SETMAXTIPWIDTH to a positive value
   'to enable multiline tooltips
   SendMessageByLongA m_lTTHwnd, TTM_SETMAXTIPWIDTH, 0, 100000
End Function

【问题讨论】:

  • 看到“正确”工具提示的图像会很有趣。
  • Windows 10 赶在人为的最后期限前推出,难怪它有一些错误 :)
  • 我看到您的 一个未记录的 Windows 功能 评论将宽度设置为 2147483647 像素 ...
  • @AlexK.,幸好现在是documented,但这不是问题的根源。我为 TTM_SETMAXTIPWIDTH 尝试了不同的 lParam 值,但没有任何改变。
  • @MarkHurd,天哪,我没有注意到这条灰线也出现在单行工具提示中!让我更新一下我的问题。

标签: winapi vb6 tooltip windows-10 multiline


【解决方案1】:

为了解决这个问题,我们不应该设置TOOLINFO结构的hwnd字段。对应的部分代码应该是这样的:

'now set our tooltip info structure
Dim tiA As TOOLINFOA
Dim tiW As TOOLINFOW
If g_bIsNt Then
   With tiW
      .lSize = Len(tiW)
      .lFlags = TTF_SUBCLASS Or TTF_IDISHWND
      .lId = m_lParentHwnd
      .hInstance = App.hInstance
      .lpStr = StrPtr(mvarTipText)
   End With
Else
   With tiA
      .lSize = Len(tiA)
      .lFlags = TTF_SUBCLASS Or TTF_IDISHWND
      .lId = m_lParentHwnd
      .hInstance = App.hInstance
      .lpStr = mvarTipText
   End With
End If

【讨论】:

    猜你喜欢
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多