8

現在、編集ボックスにカーソルを合わせるとポップアップするツール ヒントがあります。問題は、このツール ヒントに複数のエラー メッセージが含まれており、それらがすべて 1 行に長いことです。各エラー メッセージをそれぞれの行に表示する必要があります。エラー メッセージは、新しい行で区切られた 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
}
4

1 に答える 1

13

複数行のツールチップの作成については、MSDN ライブラリのこちらで説明されています。「複数行のツールチップの実装」セクションをお読みください。複数行の使用を強制するにTTM_SETMAXTIPWIDTHは、通知に応答して ToolTip コントロールにメッセージを送信する必要があります。TTN_GETDISPINFO文字列では、行を で区切る必要があります\r\n

また、テキストが 80 文字を超える場合は、配列にコピーするのではなくlpszText、構造体のメンバーを使用する必要があります。NMTTDISPINFOszText

于 2008-09-30T14:20:03.297 に答える