PSS ID Number: Q141758
Article Last Modified on 07-31-2001
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 4.00
Keywords: kbcode kbDlg kbMFC kbToolTip KbUIDesign kbVC210 kbVC220 kbVC400 kbGrpDSMFCATL kbDialog
Issue Type: kbhowto
Technology: kbAudDeveloper kbMFC