text: //  --------------------------------------------------------------------------
  //  Module Name: Tooltip.cpp
  //
  //  Copyright (c) 2000, Microsoft Corporation
  //
  //  Class that implements displaying a tooltip balloon.
  //
  //  History:    2000-06-12  vtan        created
  //  --------------------------------------------------------------------------
  
  #include "shellprv.h"
  #include "Tooltip.h"
  
  BOOL IsBiDiLocalizedSystem( void );
  
  //  --------------------------------------------------------------------------
  //  CTooltip::CTooltip
  //
  //  Arguments:  hInstance   =   HINSTANCE of hosting process/DLL.
  //              hwndParent  =   HWND of the parenting window.
  //
  //  Returns:    <none>
  //
  //  Purpose:    Constructor for CTooltip. Creates a tooltip window and
  //              prepares it for display.
  //
  //  History:    2000-06-12  vtan        created
  //  --------------------------------------------------------------------------
  
  CTooltip::CTooltip (HINSTANCE hInstance, HWND hwndParent) :
      _hwnd(NULL),
      _hwndParent(hwndParent)
  
  {
      DWORD   dwExStyle;
  
      if (((GetWindowLongA(hwndParent, GWL_EXSTYLE) & WS_EX_LAYOUTRTL) != 0) || IsBiDiLocalizedSystem())
      {
          dwExStyle = WS_EX_LAYOUTRTL;
      }
      else
      {
          dwExStyle = 0;
      }
      _hwnd = CreateWindowEx(dwExStyle,
                             TOOLTIPS_CLASS,
                             NULL,
                             WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP | TTS_BALLOON,
                             CW_USEDEFAULT,
                             CW_USEDEFAULT,
                             CW_USEDEFAULT,
                             CW_USEDEFAULT,
                             hwndParent,
                             NULL,
                             hInstance,
                             NULL);
      if (_hwnd != NULL)
      {
          TBOOL(SetWindowPos(_hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE));
          (LRESULT)SendMessage(_hwnd, CCM_SETVERSION, COMCTL32_VERSION, 0);
  
          TOOLINFO toolInfo = { 0 };
  
          toolInfo.cbSize = sizeof(toolInfo);
          toolInfo.uFlags = TTF_TRANSPARENT | TTF_TRACK;
          toolInfo.uId = PtrToUint(_hwnd);
          (LRESULT)SendMessage(_hwnd, TTM_ADDTOOL, 0, reinterpret_cast<LPARAM>(&toolInfo));
          (LRESULT)SendMessage(_hwnd, TTM_SETMAXTIPWIDTH, 0, 300);
      }
  }
  
  //  --------------------------------------------------------------------------
  //  CTooltip::~CTooltip
  //
  //  Arguments:  <none>
  //
  //  Returns:    <none>
  //
  //  Purpose:    Destructor for the CTooltip class. This destroys the tooltip
  //              window created. If the parent of the tooltip window is
  //              destroyed before this is invoked user32!DestroyWindow will
  //              cause the trace to fire. The object's lifetime must be
  //              carefully managed by the user of this class.
  //
  //  History:    2000-06-12  vtan        created
  //  --------------------------------------------------------------------------
  
  CTooltip::~CTooltip (void)
  
  {
      if (_hwnd != NULL)
      {
          TBOOL(DestroyWindow(_hwnd));
          _hwnd = NULL;
      }
  }
  
  //  --------------------------------------------------------------------------
  //  CTooltip::SetPosition
  //
  //  Arguments:  lPosX   =   X position of the balloon tip window (screen).
  //              lPosY   =   Y position of the balloon tip window (screen).
  //
  //  Returns:    <none>
  //
  //  Purpose:    Positions the tooltip window at the given screen co-ordinates.
  //              If the parameters are defaulted then this positions the
  //              tooltip relative to the parent.
  //
  //  History:    2000-06-12  vtan        created
  //  --------------------------------------------------------------------------
  
  void    CTooltip::SetPosition (LONG lPosX, LONG lPosY)  const
  
  {
      if ((lPosX == LONG_MIN) && (lPosY == LONG_MIN))
      {
          RECT    rc;
  
          TBOOL(GetWindowRect(_hwndParent, &rc));
          lPosX = (rc.left + rc.right) / 2;
          lPosY = rc.bottom;
      }
      (LRESULT)SendMessage(_hwnd, TTM_TRACKPOSITION, 0, MAKELONG(lPosX, lPosY));
  }
  
  //  --------------------------------------------------------------------------
  //  CTooltip::SetCaption
  //
  //  Arguments:  dwIcon      =   Icon type to set for the tooltip caption.
  //              pszCaption  =   Caption of the tooltip.
  //
  //  Returns:    <none>
  //
  //  Purpose:    Sets the tooltip caption.
  //
  //  History:    2000-06-12  vtan        created
  //  --------------------------------------------------------------------------
  
  void    CTooltip::SetCaption (DWORD dwIcon, const TCHAR *pszCaption)          const
  
  {
      (LRESULT)SendMessage(_hwnd, TTM_SETTITLE, dwIcon, reinterpret_cast<LPARAM>(pszCaption));
  }
  
  //  --------------------------------------------------------------------------
  //  CTooltip::SetText
  //
  //  Arguments:  pszText     =   Content of the actual tooltip.
  //
  //  Returns:    <none>
  //
  //  Purpose:    Sets the tooltip text.
  //
  //  History:    2000-06-12  vtan        created
  //  --------------------------------------------------------------------------
  
  void    CTooltip::SetText (const TCHAR *pszText)                              const
  
  {
      TOOLINFO toolInfo = { 0 };
  
      toolInfo.cbSize = sizeof(toolInfo);
      toolInfo.uId = PtrToUint(_hwnd);
      toolInfo.lpszText = const_cast<TCHAR*>(pszText);
      (LRESULT)SendMessage(_hwnd, TTM_UPDATETIPTEXT, 0, reinterpret_cast<LPARAM>(&toolInfo));
  }
  
  //  --------------------------------------------------------------------------
  //  CTooltip::Show
  //
  //  Arguments:  <none>
  //
  //  Returns:    <none>
  //
  //  Purpose:    Shows the tooltip window.
  //
  //  History:    2000-06-12  vtan        created
  //  --------------------------------------------------------------------------
  
  void    CTooltip::Show (void)                                                 const
  
  {
      TOOLINFO toolInfo = { 0 };
  
      toolInfo.cbSize = sizeof(toolInfo);
      toolInfo.uId = PtrToUint(_hwnd);
      (LRESULT)SendMessage(_hwnd, TTM_TRACKACTIVATE, TRUE, reinterpret_cast<LPARAM>(&toolInfo));
  }
  
  