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