Как получить многострочную подсказку в MFC

Прямо сейчас у меня есть всплывающая подсказка, когда я наводю курсор мыши на поле ввода. Проблема в том, что эта подсказка содержит несколько сообщений об ошибках, и все они в одной длинной строке. Мне нужно, чтобы каждое сообщение об ошибке было в отдельной строке. Сообщения об ошибках содержатся в 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
}

1 ответ

Решение

Создание многострочных всплывающих подсказок описано здесь в библиотеке MSDN - прочитайте раздел "Реализация многострочных подсказок". Вы должны отправить TTM_SETMAXTIPWIDTH сообщение в элемент управления ToolTip в ответ на TTN_GETDISPINFO уведомление, чтобы заставить его использовать несколько строк. В вашей строке вы должны разделить строки \r\n,

Кроме того, если ваш текст содержит более 80 символов, вы должны использовать lpszText член NMTTDISPINFO структура вместо копирования в szText массив.

Другие вопросы по тегам