2008-09-30 9 views
6

W tej chwili mam wskazówkę narzędzia, która pojawia się po najechaniu kursorem na pole edycji. Problem polega na tym, że ta wskazówka zawiera wiele komunikatów o błędach i wszystkie znajdują się w jednym długim wierszu. Muszę mieć każdy komunikat o błędzie w osobnej linii. Komunikaty o błędach są zawarte w CString z nową linią, która je oddziela.Jak uzyskać etykietę z wieloma liniami w MFC

Mój istniejący kod znajduje się poniżej.

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 
} 

Odpowiedz

10

Tworzenie multilinii podpowiedzi wyjaśniono here w bibliotece MSDN - zapoznać się z sekcją „Wdrażanie wielowierszowe podpowiedzi”. Powinieneś wysłać wiadomość o treści TTM_SETMAXTIPWIDTH do kontrolki ToolTip w odpowiedzi na powiadomienie TTN_GETDISPINFO, aby wymusić użycie wielu linii. W łańcuchu należy oddzielić linie od \r\n.

Ponadto, jeśli tekst ma więcej niż 80 znaków, należy użyć struktury lpszText o strukturze NMTTDISPINFO zamiast kopiowania do macierzy szText.

+0

Używałem \ n. Zmieniłem go na \ r \ n, ale wygląda na to, że nie pomogło. – JonDrnek

+0

Zauważyłem, że podpowiedzi akceptują \ n, \ r \ n i \ r jako prawidłowe podziały wierszy. Mogłem nawet wymieszać je w tej samej podpowiedzi. Wynika to z błędów/niespójności w oprogramowaniu, które naprawimy, ale działa. – Aardvark

+0

Aby użyć lpszText, możesz zrobić tak: '' 'pTTT-> lpszText = const_cast (static_cast (strTipText));' '' – Mangs

Powiązane problemy