2008-09-30 8 views
6

? Ahora mismo, tengo una información sobre herramientas que aparece cuando sobrevivo sobre un cuadro de edición. El problema es que esta información sobre herramientas contiene múltiples mensajes de error y todos están en una sola línea larga. Necesito que cada mensaje de error esté en su propia línea. Los mensajes de error están contenidos en una CString con una nueva línea que los separa.¿Cómo obtengo una información sobre herramientas de múltiples líneas en MFC

Mi código existente está por debajo.

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 
} 

Respuesta

10

Creación de la información de herramientas de varias líneas se explica here en la biblioteca de MSDN - Leer la sección "Ejecución de varias líneas sobre herramientas". Debe enviar un mensaje TTM_SETMAXTIPWIDTH al control ToolTip en respuesta a una notificación TTN_GETDISPINFO para forzarlo a utilizar varias líneas. En su cadena, debe separar las líneas con \r\n.

Además, si el texto es más de 80 caracteres, se debe utilizar el lpszText miembro de la estructura NMTTDISPINFO en lugar de copiar en la matriz szText.

+0

Estaba usando \ n. Lo cambié a \ r \ n pero no parece haber ayudado. – JonDrnek

+0

Encontré que la información sobre herramientas acepta \ n, \ r \ n y \ r como saltos de línea válidos. Incluso he sido capaz de mezclarlos en la misma información sobre herramientas. Esto se debe a errores/inconsistencias en el software que corregiremos, pero funciona. – Aardvark

+0

Para usar lpszText puede hacer esto: '' 'pTTT-> lpszText = const_cast (static_cast (strTipText));' '' – Mangs

Cuestiones relacionadas