如何在MFC中获得多行工具提示
时间:2020-03-06 14:55:24 来源:igfitidea点击:
现在,当我将鼠标悬停在编辑框上时,会弹出一个工具提示。问题在于此工具提示包含多个错误消息,并且它们都排成一排。我需要每个错误消息都在自己的行上。错误消息包含在CString中,并用新行将它们分开。
我现有的代码如下。
BOOL OnToolTipText(UINT, NMHDR* pNMHDR, LRESULT* pResult) { ASSERT(pNMHDR->code == TTN_NEEDTEXTA || pNMHDR->code == TTN_NEEDTEXTW); // need to handle both ANSI and UNICODE versions of the message TOOLTIPTEXTA* pTTTA = (TOOLTIPTEXTA*)pNMHDR; TOOLTIPTEXTW* pTTTW = (TOOLTIPTEXTW*)pNMHDR; // TCHAR szFullText[256]; CString strTipText=_T(""); UINT nID = pNMHDR->idFrom; if (pNMHDR->code == TTN_NEEDTEXTA && (pTTTA->uFlags & TTF_IDISHWND) || pNMHDR->code == TTN_NEEDTEXTW && (pTTTW->uFlags & TTF_IDISHWND)) { // idFrom is actually the HWND of the tool nID = ::GetDlgCtrlID((HWND)nID); } //m_errProjAccel[ch] contains 1 or more error messages each seperated by a new line. if((int)nID >= ID_PROJECTED_ACCEL1 && (int)nID < ID_PROJECTED_ACCEL1 + PROJECTED_ROWS -1 ) { int ch = nID - ID_PROJECTED_ACCEL1; strTipText = m_errProjAccel[ch]; } #ifndef _UNICODE if (pNMHDR->code == TTN_NEEDTEXTA) lstrcpyn(pTTTA->szText, strTipText, sizeof(pTTTA->szText)/sizeof(pTTTA->szText[0])); else _mbstowcsz(pTTTW->szText, strTipText, sizeof(pTTTA->szText)/sizeof(pTTTA->szText[0])); #else if (pNMHDR->code == TTN_NEEDTEXTA) _wcstombsz(pTTTA->szText, strTipText, sizeof(pTTTA->szText)/sizeof(pTTTA->szText[0])); else lstrcpyn(pTTTW->szText, strTipText, sizeof(pTTTA->szText)/sizeof(pTTTA->szText[0])); #endif *pResult = 0; // bring the tooltip window above other popup windows ::SetWindowPos(pNMHDR->hwndFrom, HWND_TOP, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOOWNERZORDER); return TRUE; // message was handled }
解决方案
在MSDN库中的"执行多行工具提示"一节中对创建多行工具提示进行了说明。我们应该向ToolTip控件发送" TTM_SETMAXTIPWIDTH"消息,以响应" TTN_GETDISPINFO"通知,以使其强制使用多行。在字符串中,应使用\ r \ n
分隔行。
另外,如果文本超过80个字符,则应使用NMTTDISPINFO结构的
lpszText成员,而不是复制到
szText`数组中。