2008-09-30 5 views
6

Ngay bây giờ, tôi có một mẹo công cụ bật lên khi tôi di chuột qua hộp chỉnh sửa. Vấn đề là mẹo công cụ này chứa nhiều thông báo lỗi và tất cả chúng đều nằm trong một hàng dài. Tôi cần phải có mỗi thông báo lỗi trên một dòng riêng. Các thông báo lỗi được chứa trong một CString với một dòng mới phân tách chúng.Làm thế nào để tôi có một chú giải công cụ đa dòng trong MFC

Mã hiện tại của tôi ở bên dưới.

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 
} 

Trả lời

10

Tạo tooltips multiline được giải thích here trong thư viện MSDN - đọc "Thực hiện Multiline ToolTips" phần. Bạn nên gửi thông báo TTM_SETMAXTIPWIDTH tới điều khiển ToolTip để phản hồi thông báo TTN_GETDISPINFO để buộc thông báo sử dụng nhiều dòng. Trong chuỗi của bạn, bạn nên tách các dòng với \r\n.

Ngoài ra, nếu văn bản của bạn có hơn 80 ký tự, bạn nên sử dụng thành viên lpszText của cấu trúc NMTTDISPINFO thay vì sao chép vào mảng szText.

+0

Tôi đang sử dụng \ n. Tôi đã thay đổi nó thành \ r \ n nhưng có vẻ như nó không giúp được gì. – JonDrnek

+0

Tôi thấy rằng các chú giải công cụ chấp nhận \ n, \ r \ n và \ r làm các ngắt dòng hợp lệ. Tôi thậm chí đã có thể trộn chúng trong cùng một tooltip. Điều này là do lỗi/mâu thuẫn trong phần mềm mà chúng tôi sẽ khắc phục, nhưng nó hoạt động. – Aardvark

+0

Để sử dụng lpszText bạn có thể làm như sau: '' 'pTTT-> lpszText = const_cast (static_cast (strTipText));' '' – Mangs