Размер всплывающей подсказки ограничен 80 символами, даже если значение maxtipwidth равно 32767 - PullRequest
1 голос
/ 09 июля 2019

У меня есть проект MFC C ++, в котором используется структура NMTTDISPINFO. Все работает правильно, когда текст всплывающей подсказки меньше 80 символов, но иногда мне нужно использовать текст, который больше 80 символов.

Как я читал в MSDN, я должен использовать lpszText, а не sztext.

Структура NMTTDISPINFOA

Мой код:

TTooltipText& tiTxt = *(TTooltipText*)nmhdr;
::SendMessage(NMHDR(tiTxt).hwndFrom, TTM_SETMAXTIPWIDTH, 0, SHRT_MAX);
CString pricesStr = GetPrices();
tiTxt.lpszText = pricesStr.GetBuffer(pricesStr.GetLength());

Но, к сожалению, этот код не работает, пожалуйста, помогите?

Ответы [ 2 ]

0 голосов
/ 21 июля 2019

Сначала создайте всплывающую подсказку следующим образом:

HWND CreateToolTip(HWND hwndParent)
{
   // Create a tooltip.
    HWND hwndTT = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL,
    WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    hwndParent, NULL, hInst, NULL);

    SetWindowPos(hwndTT, HWND_TOPMOST, 0, 0, 0, 0,
     SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);

    //Set up "tool" information. In this case, the "tool" is the entire parent window

  TOOLINFO ti = { 0 };
  ti.cbSize = sizeof(TOOLINFO);
  ti.uFlags = TTF_SUBCLASS;
  ti.hwnd = hwndParent;
  ti.hinst = hInst;
  ti.lpszText = LPSTR_TEXTCALLBACK; // this to use tooltip notify message

  GetClientRect(hwndParent, &ti.rect);

  SendMessage(hwndTT, TTM_SETMAXTIPWIDTH, 0, 500);

   // Associate the tooltip with the "tool" window.
  SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM)(LPTOOLINFO)&ti);
}

Примечание: использование LPSTR_TEXTCALLBACK означает, что вы должны определить обработчик сообщения TTN_NEEDTEXT

ON_NOTIFY(TTN_NEEDTEXT, 0, HandleTooltipText)

Наконец, мы определяем обработчик сообщения TTN_NEEDTEXT как:

void HandleTooltipText(NMHDR* nmhdr, LRESULT*)
{
    NMTTDISPINFO* toolTip = (NMTTDISPINFO*)nmhdr;
    CString prices = GetPrices();
    if (toolTip->hdr.code == TTN_GETDISPINFO)
    {
       toolTip->lpszText = new TCHAR[prices.GetLength() + 1];
       memset(toolTip->lpszText, 0, (prices.GetLength() + 1) * sizeof(TCHAR));
       _tcscpy_s(toolTip->lpszText, prices.GetLength() + 1, prices.GetString());
       toolTip->hinst = 0;
    }
}
0 голосов
/ 10 июля 2019

Я не могу воспроизвести вашу проблему с приложением win32.

С SendMessage(hwndTT, TTM_SETMAXTIPWIDTH, 0, 150); я получаю многострочные подсказки, подобные этим:

enter image description here

Без SendMessage(hwndTT, TTM_SETMAXTIPWIDTH, 0, 150); Я получаю однострочные подсказки, подобные этой:

enter image description here

Код, который я использую (c ++), как показано ниже, основан на официальном документе :

void CreateToolTipForRect(HWND hwndParent)
{
    // Create a tooltip.
    HWND hwndTT = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL,
        WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
        hwndParent, NULL, hInst, NULL);

    SetWindowPos(hwndTT, HWND_TOPMOST, 0, 0, 0, 0,
        SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);

    // Set up "tool" information. In this case, the "tool" is the entire parent window.

    TOOLINFO ti = { 0 };
    ti.cbSize = sizeof(TOOLINFO);
    ti.uFlags = TTF_SUBCLASS;
    ti.hwnd = hwndParent;
    ti.hinst = hInst;
    ti.lpszText = (LPSTR)"this string length is more than 80 !!!!!!!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-80-!!!!!!!!!!!!!!!";

    GetClientRect(hwndParent, &ti.rect);

    SendMessage(hwndTT, TTM_SETMAXTIPWIDTH, 0, 150);

    // Associate the tooltip with the "tool" window.
    SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM)(LPTOOLINFO)&ti);
}
...