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 ?

Windows Presentation Foundation
Windows Presentation Foundation
A part of the .NET Framework that provides a unified programming model for building line-of-business desktop applications on Windows.
2,671 questions
Windows API - Win32
Windows API - Win32
A core set of Windows application programming interfaces (APIs) for desktop and server applications. Previously known as Win32 API.
2,422 questions
VB
VB
An object-oriented programming language developed by Microsoft that is implemented on the .NET Framework. Previously known as Visual Basic .NET.
2,568 questions
Access Development
Access Development
Access: A family of Microsoft relational database management systems designed for ease of use.Development: The process of researching, productizing, and refining new or existing technologies.
821 questions
{count} votes

2 answers

Sort by: Most helpful
  1. RLWA32 40,286 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 14,751 Reputation points Microsoft Vendor
    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.