ToolTip did not Show in parent window

Grailly 1 Reputation point
2022-02-01T20:19:22.377+00:00

Hi , Professor

Am Trying to Display tooltip with text " This is tooltip " , but did not show i followd the msdn instruction also

Could you give me the right code

my code is

public ti As TOOLINFO

Sub CreateToolTipInEveryWhereOfParent(Dlg As Longptr)

htip=CreateWindowEx(WS_EX_TOPMOST,"tooltips_class32,"MyTip",WS_POPUP+TTS_ALWAYSTIP+TTS_SHOWBALLOON,0,0,0,0,0,Dlg,0,0)

'htip return non zero

if htip<>0 Then
DestroyWindow htip
Else
With ti
.cbSize=LenB(ti)
.hwnd=Dlg
.dwTrack=TTF_TRACK+TTF_ABSOLUTE
.Uid=0 ' because show only in parent window not somewhere in screen mouse moved
GetClientRect Dlg,.cRect
End With
SendMessageA htip,&H401,0,ti
SendMessageA htip,&H404,True,ti
End If

End Sub

in NewWindowProc
put in WM_MOUSEMOVE

CreateToolTipInEveryWhereOfParent hWnd

anybody can test and put a photo and modification of my code , plz ?

Developer technologies | Windows Presentation Foundation
Windows development | Windows API - Win32
Microsoft 365 and Office | Access | Development
Developer technologies | Visual Basic for Applications
Developer technologies | VB
{count} votes

2 answers

Sort by: Most helpful
  1. RLWA32 51,536 Reputation points
    2022-07-19T12:46:51.23+00:00

    Following example creates a tracking tooltip in a Windows Form -

    Public Class Form1  
        Dim hTooltip As IntPtr  
        Dim hInst As IntPtr  
        Dim tool As Win32.TOOLINFO  
        Dim ret As IntPtr  
        Dim OldX As Integer = -1  
        Dim OldY As Integer = -1  
        Dim IsActivated As Boolean = False  
      
        Private Function MakeLParam(ByVal LoWord As Integer, ByVal HiWord As Integer) As IntPtr  
            Return ((HiWord << 16) Or (LoWord And &HFFFF)) 'New IntPtr  
        End Function  
      
        Private Sub Form1_MouseLeave(sender As Object, e As EventArgs) Handles MyBase.MouseLeave  
            ret = Win32.SendMessage(hTooltip, Win32.TTM_TRACKACTIVATE, 0, tool)  
            OldX = -1  
            OldY = -1  
            IsActivated = False  
        End Sub  
      
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load  
            hInst = Win32.GetModuleHandle(IntPtr.Zero)  
            hTooltip = Win32.CreateWindowEx(Win32.WindowStylesEx.WS_EX_TOOLWINDOW Or Win32.WindowStylesEx.WS_EX_TOPMOST,  
                        Win32.TOOLTIPS_CLASS, String.Empty,  
                        Win32.WindowStyles.WS_POPUP Or Win32.TTS_ALWAYSTIP Or Win32.TTS_BALLOON Or Win32.TTS_NOPREFIX,  
                        0, 0, 0, 0, Handle, IntPtr.Zero, hInst, IntPtr.Zero)  
            If hTooltip <> IntPtr.Zero Then  
                tool.cbSize = Marshal.SizeOf(Of Win32.TOOLINFO)  
                tool.hinst = hInst  
                tool.hwnd = Handle  
                tool.uFlags = Win32.TTF_IDISHWND Or Win32.TTF_TRACK Or Win32.TTF_ABSOLUTE  
                tool.uId = Handle  
                tool.lpszText = String.Empty  
                tool.lParam = IntPtr.Zero  
                ret = Win32.SendMessage(hTooltip, Win32.TTM_ADDTOOLW, 0, tool)  
                ret = Win32.SendMessage(hTooltip, Win32.TTM_SETTITLEW, Win32.TTI_INFO, "Title for Tooltip")  
            End If  
        End Sub  
      
        Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles MyBase.MouseMove  
            If (OldX <> e.X Or OldY <> e.Y) Then  
                OldX = e.X  
                OldY = e.Y  
      
                Dim strCoord As String = e.X.ToString() + ", " + e.Y.ToString()  
                tool.lpszText = strCoord  
                ret = Win32.SendMessage(hTooltip, Win32.TTM_UPDATETIPTEXTW, 0, tool)  
      
                Dim pt As Point = PointToScreen(e.Location)  
                Dim lp As IntPtr = MakeLParam(pt.X, pt.Y)  
                ret = Win32.SendMessage(hTooltip, Win32.TTM_TRACKPOSITION, 0, lp)  
      
                If Not IsActivated Then  
                    ret = Win32.SendMessage(hTooltip, Win32.TTM_TRACKACTIVATE, 1, tool)  
                    IsActivated = True  
                End If  
            End If  
        End Sub  
      
    End Class  
      
    Public Class Win32  
        <StructLayout(LayoutKind.Sequential)>  
        Public Structure RECT  
            Public Left As Integer  
            Public Top As Integer  
            Public Right As Integer  
            Public Bottom As Integer  
        End Structure  
      
        Public Const TOOLTIPS_CLASS As String = "tooltips_class32"  
      
        Public Const WM_CREATE As Integer = &H1  
        Public Const WM_USER As Integer = &H400  
      
        Public Const TME_LEAVE As Integer = &H2  
      
        Public Const TTS_ALWAYSTIP As Integer = &H1  
        Public Const TTS_NOPREFIX As Integer = &H2  
        Public Const TTS_NOANIMATE As Integer = &H10  
        Public Const TTS_NOFADE As Integer = &H20  
        Public Const TTS_BALLOON As Integer = &H40  
        Public Const TTS_CLOSE As Integer = &H80  
        Public Const TTS_USEVISUALSTYLE As Integer = &H100 ' Use themed hyperlinks  
      
        Public Const TTF_IDISHWND As Integer = &H1  
      
        '// Use this to center around trackpoint in trackmode  
        '// -Or- to center around tool in normal mode.  
        '// Use TTF_ABSOLUTE to place the tip exactly at the track coords when  
        '// in tracking mode.  TTF_ABSOLUTE can be used in conjunction with TTF_CENTERTIP  
        '// to center the tip absolutely about the track point.  
      
        Public Const TTF_CENTERTIP As Integer = &H2  
        Public Const TTF_RTLREADING As Integer = &H4  
        Public Const TTF_SUBCLASS As Integer = &H10  
        Public Const TTF_TRACK As Integer = &H20  
        Public Const TTF_ABSOLUTE As Integer = &H80  
        Public Const TTF_TRANSPARENT As Integer = &H100  
        Public Const TTF_PARSELINKS As Integer = &H1000  
        Public Const TTF_DI_SETITEM As Integer = &H8000       ' valid only On the TTN_NEEDTEXT callback  
      
        ' ToolTip Icons (Set with TTM_SETTITLE)  
        Public Const TTI_NONE As Integer = 0  
        Public Const TTI_INFO As Integer = 1  
        Public Const TTI_WARNING As Integer = 2  
        Public Const TTI_ERROR As Integer = 3  
        Public Const TTI_INFO_LARGE As Integer = 4  
        Public Const TTI_WARNING_LARGE As Integer = 5  
        Public Const TTI_ERROR_LARGE As Integer = 6  
      
      
        Public Const TTM_ACTIVATE As Integer = WM_USER + 1  
        Public Const TTM_SETDELAYTIME As Integer = WM_USER + 3  
        Public Const TTM_ADDTOOLA As Integer = WM_USER + 4  
        Public Const TTM_ADDTOOLW As Integer = WM_USER + 50  
        Public Const TTM_DELTOOLA As Integer = WM_USER + 5  
        Public Const TTM_DELTOOLW As Integer = WM_USER + 51  
        Public Const TTM_NEWTOOLRECTA As Integer = WM_USER + 6  
        Public Const TTM_NEWTOOLRECTW As Integer = WM_USER + 52  
        Public Const TTM_RELAYEVENT As Integer = WM_USER + 7 ' Win7 :  wParam = GetMessageExtraInfo() When relaying WM_MOUSEMOVE  
      
        Public Const TTM_GETTOOLINFOA As Integer = WM_USER + 8  
        Public Const TTM_GETTOOLINFOW As Integer = WM_USER + 53  
      
        Public Const TTM_SETTOOLINFOA As Integer = WM_USER + 9  
        Public Const TTM_SETTOOLINFOW As Integer = WM_USER + 54  
      
        Public Const TTM_HITTESTA As Integer = WM_USER + 10  
        Public Const TTM_HITTESTW As Integer = WM_USER + 55  
        Public Const TTM_GETTEXTA As Integer = WM_USER + 11  
        Public Const TTM_GETTEXTW As Integer = WM_USER + 56  
        Public Const TTM_UPDATETIPTEXTA As Integer = WM_USER + 12  
        Public Const TTM_UPDATETIPTEXTW As Integer = WM_USER + 57  
        Public Const TTM_GETTOOLCOUNT As Integer = WM_USER + 13  
        Public Const TTM_ENUMTOOLSA As Integer = WM_USER + 14  
        Public Const TTM_ENUMTOOLSW As Integer = WM_USER + 58  
        Public Const TTM_GETCURRENTTOOLA As Integer = WM_USER + 15  
        Public Const TTM_GETCURRENTTOOLW As Integer = WM_USER + 59  
        Public Const TTM_WINDOWFROMPOINT As Integer = WM_USER + 16  
        Public Const TTM_TRACKACTIVATE As Integer = WM_USER + 17 ' wParam = True / False start End  lparam = LPTOOLINFO  
        Public Const TTM_TRACKPOSITION As Integer = WM_USER + 18 ' lParam = dwPos  
        Public Const TTM_SETTIPBKCOLOR As Integer = WM_USER + 19  
        Public Const TTM_SETTIPTEXTCOLOR As Integer = WM_USER + 20  
        Public Const TTM_GETDELAYTIME As Integer = WM_USER + 21  
        Public Const TTM_GETTIPBKCOLOR As Integer = WM_USER + 22  
        Public Const TTM_GETTIPTEXTCOLOR As Integer = WM_USER + 23  
        Public Const TTM_SETMAXTIPWIDTH As Integer = WM_USER + 24  
        Public Const TTM_GETMAXTIPWIDTH As Integer = WM_USER + 25  
        Public Const TTM_SETMARGIN As Integer = WM_USER + 26 ' lParam = lprc  
        Public Const TTM_GETMARGIN As Integer = WM_USER + 27 ' lParam = lprc  
        Public Const TTM_POP As Integer = WM_USER + 28  
        Public Const TTM_UPDATE As Integer = WM_USER + 29  
        Public Const TTM_GETBUBBLESIZE As Integer = WM_USER + 30  
        Public Const TTM_ADJUSTRECT As Integer = WM_USER + 31  
        Public Const TTM_SETTITLEA As Integer = WM_USER + 32 ' wParam = TTI_ *, lParam = Char * szTitle  
        Public Const TTM_SETTITLEW As Integer = WM_USER + 33 ' wParam = TTI_ *, lParam = wchar * szTitle  
      
        Public Const TTM_POPUP As Integer = WM_USER + 34  
        Public Const TTM_GETTITLE As Integer = WM_USER + 35 ' wParam = 0, lParam = TTGETTITLE *  
      
        <StructLayout(LayoutKind.Sequential)>  
        Public Structure TOOLINFO  
            Public cbSize As Integer  
            Public uFlags As Integer  
            Public hwnd As IntPtr  
            Public uId As IntPtr  
            Public rect As RECT  
            Public hinst As IntPtr  
            <MarshalAs(UnmanagedType.LPWStr)>  
            Public lpszText As String  
            Public lParam As IntPtr  
            Public lpReserved As IntPtr  
        End Structure  
      
        <StructLayout(LayoutKind.Sequential)>  
        Public Structure _TRACKMOUSEEVENT  
            Public cbSize As Integer  
            Public dwFlags As Integer  
            Public dwHoverTime As Integer  
            Public hwndTrack As IntPtr  
        End Structure  
      
        Public Enum WindowStyles As UInteger  
            WS_BORDER = &H800000  
            WS_CAPTION = &HC00000  
            WS_CHILD = &H40000000  
            WS_CLIPCHILDREN = &H2000000  
            WS_CLIPSIBLINGS = &H4000000  
            WS_DISABLED = &H8000000  
            WS_DLGFRAME = &H400000  
            WS_GROUP = &H20000  
            WS_HSCROLL = &H100000  
            WS_MAXIMIZE = &H1000000  
            WS_MAXIMIZEBOX = &H10000  
            WS_MINIMIZE = &H20000000  
            WS_MINIMIZEBOX = &H20000  
            WS_OVERLAPPED = &H0  
            WS_OVERLAPPEDWINDOW = WS_OVERLAPPED Or WS_CAPTION Or WS_SYSMENU Or WS_SIZEFRAME Or WS_MINIMIZEBOX Or WS_MAXIMIZEBOX  
            WS_POPUP = &H80000000UI  
            WS_POPUPWINDOW = WS_POPUP Or WS_BORDER Or WS_SYSMENU  
            WS_SIZEFRAME = &H40000  
            WS_SYSMENU = &H80000  
            WS_TABSTOP = &H10000  
            WS_VISIBLE = &H10000000  
            WS_VSCROLL = &H200000  
        End Enum  
      
        Public Enum WindowStylesEx As UInteger  
            WS_EX_ACCEPTFILES = &H10  
            WS_EX_APPWINDOW = &H40000  
            WS_EX_CLIENTEDGE = &H200  
            WS_EX_COMPOSITED = &H2000000  
            WS_EX_CONTEXTHELP = &H400  
            WS_EX_CONTROLPARENT = &H10000  
            WS_EX_DLGMODALFRAME = &H1  
            WS_EX_LAYERED = &H80000  
            WS_EX_LAYOUTRTL = &H400000  
            WS_EX_LEFT = &H0  
            WS_EX_LEFTSCROLLBAR = &H4000  
            WS_EX_LTRREADING = &H0  
            WS_EX_MDICHILD = &H40  
            WS_EX_NOACTIVATE = &H8000000  
            WS_EX_NOINHERITLAYOUT = &H100000  
            WS_EX_NOPARENTNOTIFY = &H4  
            WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE Or WS_EX_CLIENTEDGE  
            WS_EX_PALETTEWINDOW = WS_EX_WINDOWEDGE Or WS_EX_TOOLWINDOW Or WS_EX_TOPMOST  
            WS_EX_RIGHT = &H1000  
            WS_EX_RIGHTSCROLLBAR = &H0  
            WS_EX_RTLREADING = &H2000  
            WS_EX_STATICEDGE = &H20000  
            WS_EX_TOOLWINDOW = &H80  
            WS_EX_TOPMOST = &H8  
            WS_EX_TRANSPARENT = &H20  
            WS_EX_WINDOWEDGE = &H100  
        End Enum  
      
        <DllImport("user32.dll", CharSet:=CharSet.Unicode, SetLastError:=True)>  
        Public Shared Function CreateWindowEx(  
         ByVal dwExStyle As WindowStylesEx,  
         ByVal lpClassName As String,  
         ByVal lpWindowName As String,  
         ByVal dwStyle As WindowStyles,  
         ByVal x As Integer,  
         ByVal y As Integer,  
         ByVal nWidth As Integer,  
         ByVal nHeight As Integer,  
         ByVal hWndParent As IntPtr,  
         ByVal hMenu As IntPtr,  
         ByVal hInstance As IntPtr,  
         ByVal lpParam As IntPtr) As IntPtr  
        End Function  
      
        <DllImport("user32.dll", CharSet:=CharSet.Unicode)>  
        Public Shared Function SendMessage(ByVal hWnd As IntPtr,  
                                           ByVal Msg As Integer,  
                                           ByVal wParam As Integer,  
                                           ByRef lParam As Win32.TOOLINFO) As IntPtr  
        End Function  
      
        <DllImport("user32.dll", CharSet:=CharSet.Unicode)>  
        Public Shared Function SendMessage(ByVal hWnd As IntPtr,  
                                           ByVal Msg As Integer,  
                                           ByVal wParam As Integer,  
                                           ByVal lParam As String) As IntPtr  
        End Function  
      
        <DllImport("user32.dll", CharSet:=CharSet.Unicode)>  
        Public Shared Function SendMessage(ByVal hWnd As IntPtr,  
                                           ByVal Msg As Integer,  
                                           ByVal wParam As Integer,  
                                           ByVal lParam As IntPtr) As IntPtr  
        End Function  
      
        <DllImport("kernel32.dll", CharSet:=CharSet.Unicode, SetLastError:=True)>  
        Public Shared Function GetModuleHandle(ByVal lpModuleName As IntPtr) As IntPtr  
        End Function  
      
    End Class  
      
      
    

    222237-tooltip.png

    1 person found this answer helpful.
    0 comments No comments

  2. Junjie Zhu - MSFT 21,731 Reputation points
    2022-02-04T07:19:53.957+00:00

    Hello,
    Welcome to Microsoft Q&A!

    According the document of CreateWindowExA

    HWND CreateWindowExA(  
      [in]           DWORD     dwExStyle,  
      [in, optional] LPCSTR    lpClassName,  
      [in, optional] LPCSTR    lpWindowName,  
      [in]           DWORD     dwStyle,  
      [in]           int       X,  
      [in]           int       Y,  
      [in]           int       nWidth,  
      [in]           int       nHeight,  
      [in, optional] HWND      hWndParent,  
      [in, optional] HMENU     hMenu,  
      [in, optional] HINSTANCE hInstance,  
      [in, optional] LPVOID    lpParam  
    );  
    

    In your code htip=CreateWindowEx(WS_EX_TOPMOST,"tooltips_class32,"MyTip",WS_POPUP+TTS_ALWAYSTIP+TTS_SHOWBALLOON,0,0,0,0,0,Dlg,0,0)

    The width and height of the Window are both zero. You should enter the correct width and height.

    https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-createwindowexa#syntax

    Thank you.


    If the answer is the right solution, please click "Accept Answer" and kindly upvote it. If you have extra questions about this answer, please click "Comment".
    Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.


Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.