2008-09-30 4 views
6

Im Moment habe ich eine QuickInfo, die erscheint, wenn ich den Mauszeiger über ein Bearbeitungsfeld bewege. Das Problem besteht darin, dass diese QuickInfo mehrere Fehlermeldungen enthält und sich alle in einer langen Zeile befinden. Ich muss jede Fehlermeldung in einer eigenen Zeile haben. Die Fehlermeldungen sind in einem CString mit einer neuen Zeile enthalten, die sie voneinander trennt.Wie erhalte ich eine Multithread-Tooltip in MFC

Mein bestehender Code ist unten.

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 
} 

Antwort

10

Erstellen mehrzeilige Tooltips erklärt here in der MSDN-Bibliothek - die "Durchführungs mehrzeilige Tooltips" Sektion. Sie sollten eine TTM_SETMAXTIPWIDTH Nachricht an das ToolTip-Steuerelement in Reaktion auf eine TTN_GETDISPINFO Benachrichtigung senden, um es zu zwingen, mehrere Zeilen zu verwenden. In Ihrer Zeichenfolge sollten Sie Zeilen mit \r\n trennen.

Auch, wenn Ihr Text mehr als 80 Zeichen ist, sollten Sie das lpszText Mitglied der NMTTDISPINFO Struktur anstelle des Kopierens in die szText Array.

+0

Ich benutzte \ n. Ich habe es in \ r \ n geändert, aber es scheint nicht geholfen zu haben. – JonDrnek

+0

Ich habe festgestellt, dass Tooltips \ n, \ r \ n und \ r als gültige Zeilenumbrüche akzeptieren. Ich war sogar in der Lage, sie im selben Tooltip zu mischen. Dies liegt an Fehlern/Inkonsistenzen in der Software, die wir beheben werden, aber es funktioniert. – Aardvark

+0

Um den lpszText zu verwenden, könnte man folgendes tun: '' 'pTTT-> lpszText = const_cast (statischer_cast (strTipText));' '' – Mangs

Verwandte Themen