实现如下:当鼠标放到一个控件上,就显示一个提示。
关键代码:
在头文件TipDlg.h中添加成员变量: CToolTipCtrl m_tip; 在对话框初始化中 BOOL CTipDlg::OnInitDialog() { CDialogEx::OnInitDialog(); ... // TODO: 在此添加额外的初始化代码 m_tip.Create(this); m_tip.AddTool(GetDlgItem(IDC_NUM), _T("Please add number in here.")); m_tip.AddTool(GetDlgItem(IDC_NAME), _T("Please input name in here.")); m_tip.AddTool(GetDlgItem(IDC_DEPT), _T("Please select department in here.")); m_tip.AddTool(GetDlgItem(IDC_ADD), _T("ADD")); m_tip.AddTool(GetDlgItem(IDC_DEL), _T("DELETE")); m_tip.AddTool(GetDlgItem(IDC_MOD), _T("MODIFY")); m_tip.AddTool(GetDlgItem(IDC_LIST), _T("The information of employee.")); m_tip.Activate(TRUE); m_list.InsertColumn(0, _T("Number"), 0, 100); m_list.InsertColumn(1, _T("Name"), 0, 120); m_list.InsertColumn(2, _T("Department"), 0, 120); m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); LPCTSTR szDept[] = { _T("Human Resource"), _T("Reserch & Development"), _T("Finance"), _T("Testing") }; int n = sizeof(szDept) / sizeof(szDept[0]); CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_DEPT); for (int i = 0; i < n; ++i) pComb->AddString(szDept[i]); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE } 3. 添加一个虚函数 PreTranslateMessage BOOL CTipDlg::PreTranslateMessage(MSG* pMsg) { // TODO: 在此添加专用代码和/或调用基类 m_tip.RelayEvent(pMsg);//将鼠标消息传递给ToolTip控件进行处理。 return CDialogEx::PreTranslateMessage(pMsg); }
动态添加提示信息:
关键代码:
1. 添加成员函数 CString GetListText(); BOOL SetTipText(UINT id, NMHDR *pHdr, LRESULT* pResult); 2. 手动添加消息映射 ON_NOTIFY_EX(TTN_NEEDTEXT, 0, SetTipText)//自己添加 3. 在cpp文件中编写函数 CString CTipDlg::GetListText() { POSITION ps = m_list.GetFirstSelectedItemPosition(); int nn = m_list.GetNextSelectedItem(ps); int n=m_list.GetSelectedCount(); if (n<1) return _T("no information."); int nSel = m_list.GetSelectionMark(); CString str; str.Format(_T("Number: %s Name: %s Department: %s"), m_list.GetItemText(nSel, 0), m_list.GetItemText(nSel, 1), m_list.GetItemText(nSel, 2)); return str; } #pragma warning(disable:4996) // 可以使用 strcpy sprintf 等,而不是必须使用MS提供的安全函数 strcpy_s sprintf_s 等 BOOL CTipDlg::SetTipText(UINT id, NMHDR *pHdr, LRESULT* pResult) { TOOLTIPTEXT *pText = (TOOLTIPTEXT*)pHdr; UINT nID = pHdr->idFrom; if (pText->uFlags & TTF_IDISHWND) { nID = ::GetDlgCtrlID((HWND)nID); switch (nID) { case IDC_LIST: //动态赋值提示文字,默认限于80个字符。 //(超出80,出现崩溃 // STATUS_STACK_BUFFER_OVERRUN encountered // Tip.exe 已触发了一个断点。) _tcscpy(pText->lpszText, GetListText()); return TRUE; } } return FALSE; } 若想显示多行,在OnInitDialog()中添加一句: m_tip.SetMaxTipWidth(1000);