现在,当我将鼠标悬停在编辑框上时,我会弹出一个工具提示.问题是这个工具提示包含多个错误消息,它们都在一个长行中.我需要将每条错误消息都放在自己的行上.错误消息包含在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 }
ChrisN.. 12
MSDN库中介绍了创建多行工具提示- 阅读"实现多行工具提示"部分.您应该向TTM_SETMAXTIPWIDTH
ToolTip控件发送一条消息,以响应TTN_GETDISPINFO
通知以强制它使用多行.在你的字符串中,你应该用\r\n
.
此外,如果您的文本超过80个字符,则应使用结构的lpszText
成员NMTTDISPINFO
而不是复制到szText
数组中.
MSDN库中介绍了创建多行工具提示- 阅读"实现多行工具提示"部分.您应该向TTM_SETMAXTIPWIDTH
ToolTip控件发送一条消息,以响应TTN_GETDISPINFO
通知以强制它使用多行.在你的字符串中,你应该用\r\n
.
此外,如果您的文本超过80个字符,则应使用结构的lpszText
成员NMTTDISPINFO
而不是复制到szText
数组中.