Winapi Windows 10中的Win32工具提示灰线错误

Winapi Windows 10中的Win32工具提示灰线错误,winapi,vb6,tooltip,windows-10,multiline,Winapi,Vb6,Tooltip,Windows 10,Multiline,自Windows XP时代以来,我们多年来一直在使用代码在遗留的VB6组件中创建经典的Win32多行工具提示。除Windows10外,它在所有最新版本的MS Windows(7,8.1)中都能正常工作。此操作系统中的工具提示中将显示一条寄生的水平灰线。此问题的最佳演示是包含多行文本的工具提示窗口(主提示文本为多行和/或工具提示具有粗体标题): 正确的工具提示应如下所示(Windows 8.1中的屏幕): 以下是当工具提示窗口没有平铺/图标,但仅包含多行文字时,相同问题的又一个示例: 这条寄

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

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

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

这条寄生灰线也出现在单行工具提示中-尽管乍看起来并不明显:

可能是什么?这是Windows10中的一个bug,还是工具提示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
Public函数Create(ByVal ParentHwnd尽可能长)为布尔值
暗淡的lWinStyle和长的一样
如果m_lthwnd 0,则
破坏窗口m_lTTHwnd
如果结束
m_lParentHwnd=ParentHwnd
lWinStyle=TTS_ALWAYSTIP或TTS_NOPREFIX
m_lTTHwnd=CreateWindowExA(0&_
工具提示\u类_
vbNullString_
lWinStyle_
CW_使用默认值_
CW_使用默认值_
CW_使用默认值_
CW_使用默认值_
0&, _
0&, _
App.hInstance_
0&)
'现在设置我们的工具提示信息结构
Dim tiA作为TOOLINFOA
作为工具信息的Dim tiW
如果g_bIsNt那么
有提示
.lSize=Len(tiW)
.lFlags=TTF_子类或TTF_IDISHWND
.hWnd=m_lParentHwnd
.lId=m_lParentHwnd'0
.hInstance=App.hInstance
.lpStr=strprprtr(mvarTipText)
以
其他的
与tiA
.lSize=Len(tiA)
.lFlags=TTF_子类或TTF_IDISHWND
.hWnd=m_lParentHwnd
.lId=m_lParentHwnd
.hInstance=App.hInstance
.lpStr=mvarTipText
以
如果结束
'添加工具提示结构
如果g_bIsNt那么
发送消息m_lTTHwnd,TTM_ADDTOOLW,0&,tiW
其他的
发送消息m_lTTHwnd、TTM_ADDTOOLA、0和tiA
如果结束
'如果我们想要一个标题或图标
如果mvarTitle vbNullString或mvarIcon IGToolTipIconOne,则
如果g_bIsNt那么
发送消息m_lTTHwnd、TTM_SETTITLEW、mvarIcon、ByVal StrPtr(mvarTitle)
其他的
发送消息m_lTTHwnd、TTM_SETTITLEA、mvarIcon、ByVal mvarTitle
如果结束
如果结束
'设置时间参数
SendMessageByLongA m_lTTHwnd、TTM_SETDELAYTIME、TTDT_autoop、mvarVisibleTime
SendMessageByLongA m_lTTHwnd、TTM_SETDELAYTIME、TTDT_INITIAL、mvarDelayTime
“根据MSDN,我们应该将TTM_SETMAXTIPWIDTH设置为正值
'以启用多行工具提示
SendMessageByLongA m_lTTHwnd,TTM_SETMAXTIPWIDTH,0,100000
端函数

为了解决这个问题,我们不应该设置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

看到“正确”工具提示的图像会很有趣。Windows 10被匆忙推出以满足人为的最后期限,毫不奇怪它有一些错误:)我看到你的一个未记录的Windows功能注释,它将宽度设置为2147483647像素…@AlexK.,幸运的是现在是,但这不是问题的根源。我尝试了不同的LPRAM值,但没有改变。@MarkHurd,天哪,我没有注意到这条灰线也出现在单行工具提示中!!让我更新我的问题。