| How to Add Tooltips for Controls to an MFC Modal Dialog BoxID: Q141758 
 | 
To make the CToolTipCtrl class work correctly, you must call the
CToolTipCtrl::RelayEvent() function. This makes it possible for the
mouse messages to be passed to the tooltip control.
For a non-modal dialog box window in an MFC application, use the window's
CWnd::PreTranslateMessage() function to call CToolTipsCtrl::RelayEvent().
However, for a modal dialog box in MFC versions prior to 4.0, the
CDialog::PreTranslateMessage() function is not called because modal dialog
boxes have their own message loops.
In versions of MFC 4.0 and later, this is not a problem because of changes
to the implementation of DoModal. Therefore, to use CToolTipCtrl in a modal
dialog box, you need a different approach for versions prior to 4.0. This
article gives you step-by-step example that shows how to use the
CToolTipCtrl class in a MFC modal dialog box for 4.0 and prior versions.
   CAboutDialog::PreTranslateMessage(MSG* pMsg)
   {
        if (NULL != m_pToolTip)
            m_pToolTip->RelayEvent(pMsg);
        return CDialog::PreTranslateMessage(pMsg);
   } 
   class CAboutDlg : public CDialog
   {
   public:
       CAboutDlg();
       // Dialog Data
       //{{AFX_DATA(CAboutDlg)
       enum { IDD = IDD_ABOUTBOX };
       CButton   m_btOK;
       //}}AFX_DATA
       CToolTipCtrl* m_pToolTip;
       //...
   }; 
   CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
   {
       m_pToolTip = NULL;
   }
   CAboutDlg::~CAboutDlg()
   {
       delete m_pToolTip;
   } 
   BOOL CAboutDlg::OnInitDialog()
   {
      CDialog::OnInitDialog();
       //Set up the tooltip
       m_pToolTip = new CToolTipCtrl;
       if(!m_pToolTip->Create(this))
       {
           TRACE("Unable To create ToolTip\n");
           return TRUE;
       }
       if(m_pToolTip->AddTool(this, "About Box"))
       {
           TRACE("Unable to add Dialog to the tooltip\n");
       }
       if (m_pToolTip->AddTool(&m_btOK,"OK Button"))
       {
           TRACE("Unable to add OK button to the tooltip\n");
       }
       m_pToolTip->Activate(TRUE);
       return TRUE;
   } 
   class CTooltipsApp : public CWinApp
   {
       //...
   public:
       HWND    m_hwndDialog;
       CToolTipCtrl*   m_gpToolTip;
       //...
   }; 
   CTooltipsApp::CTooltipsApp()
   {
       m_hwndDialog = NULL;
       m_gpToolTip = NULL;
   } 
   BOOL CTooltipsApp::ProcessMessageFilter(int code, LPMSG lpMsg)
   {
       if (m_hwndDialog != NULL)
           if (lpMsg->hwnd == m_hwndDialog ||
               ::IsChild(m_hwndDialog, lpMsg->hwnd))
           {
               if (NULL != m_gpToolTip)
                   m_gpToolTip->RelayEvent(lpMsg);
           }
           return CWinApp::ProcessMessageFilter(code, lpMsg);
   } 
   class CAboutDlg : public CDialog
   {
   public:
       CAboutDlg();
       // Dialog Data
       //{{AFX_DATA(CAboutDlg)
       enum { IDD = IDD_ABOUTBOX };
       CButton   m_btOK;
       //}}AFX_DATA
       CToolTipCtrl* m_pToolTip;
       //...
   }; 
   CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
   {
       m_pToolTip = NULL;
   }
   CAboutDlg::~CAboutDlg()
   {
       delete m_pToolTip;
   } 
   BOOL CAboutDlg::OnInitDialog()
   {
       CDialog::OnInitDialog();
       ((CTooltipsApp*)AfxGetApp())->m_hwndDialog=m_hWnd;
       if (!m_pToolTip)
       {
           m_pToolTip = new CToolTipCtrl;
           if(!m_pToolTip->Create(this))
          {
               TRACE("Unable To create ToolTip\n");
               return TRUE;
         }
           ((CTooltipsApp*)AfxGetApp())->m_gpToolTip = m_pToolTip;
           if(m_pToolTip->AddTool(this, "About Box"))
           {
               TRACE("Unable to add Dialog to the tooltip\n");
           }
           if (m_pToolTip->AddTool(&m_btOK,"OK Button"))
           {
               TRACE("Unable to add OK button to the tooltip\n");
           }
           m_pToolTip->Activate(TRUE);
       }
      return TRUE;//return TRUE unless you set the focus to a control
                  //EXCEPTION: OCX Property Pages should return FALSE
    } 
   void CAboutDlg::PostNcDestroy( )
   {
       CDialog::PostNcDestroy();
       ((CToolTipsApp*)AfxGetApp())->m_hwndDialog= NULL;
       ((CToolTipsApp*)AfxGetApp())->m_gpToolTip= NULL;
   } Additional query words: 2.10 2.20 3.10 3.20 3.10 3.20 4.00
Keywords          : kbcode kbMFC KbUIDesign kbVC 
Version           : 2.10 2.20 4.00
Platform          : NT WINDOWS 
Issue type        : Last Reviewed: July 28, 1999