Windows желтая подсказка многострочная? - PullRequest
5 голосов
/ 03 декабря 2010

Можно ли сделать желтую подсказку в многострочном Windows?

http://img830.imageshack.us/img830/6117/tooltip.gif

Я пытался с \n, но он не работает.

РЕДАКТИРОВАТЬ:

Это функция, которая есть в моем коде.Я следовал инструкциям MSDN, но не смог заставить его работать (см. Комментарий: // Multiline tooltip).

void CreateToolTipForRect(HWND hwndParent)
{
    if (!bCanCreateToolTips)
        return;
    // Get list of areas we want tooltips on
    NSUI::TButton* tbt;
    tbt = gUserInterface->buttonList;

    HWND hwndTT;

    // Array to store all tooltip texts
    static char string[100][ RM_SCROLLTEXT_MAXLEN + 2 ];

    // Go through the list
    while (tbt != NULL)
    {
        // Check id there is a tooltip text defined for this area
        int sid = GetResourceIdFromButtonId(tbt->id);
        if (sid == -1)
        {
            tbt = tbt->next;
            continue;
        }

        if (!ttwnd[tbt->id])
        {
            // Create a ToolTip.
            hwndTT = CreateWindowEx(WS_EX_TOPMOST,
                TOOLTIPS_CLASS, NULL,
                WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,                       
                CW_USEDEFAULT, CW_USEDEFAULT,
                CW_USEDEFAULT, CW_USEDEFAULT,
                hwndParent, NULL, (( QunicApp * )CQMainGetApp())->CQWinApp_GetHInst(),NULL);

            ttwnd[tbt->id] = hwndTT;

            SetWindowPos(hwndTT, HWND_TOPMOST,
                0, 0, 0, 0,
                SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
            // Get tooltip from resources
            int res = LoadString((( QunicApp * )CQMainGetApp())->CQWinApp_GetHInst(), sid, string[tbt->id], RM_SCROLLTEXT_MAXLEN );
        }
        // Set up "tool" information.
        TOOLINFO ti = { 0 };
        ti.cbSize = sizeof(TOOLINFO);
        ti.uFlags = TTF_SUBCLASS;
        ti.hwnd = hwndParent;
        ti.hinst = (( QunicApp * )CQMainGetApp())->CQWinApp_GetHInst();

        ti.lpszText = string[tbt->id];

        // Set area
        ti.rect.left = tbt->tx;
        ti.rect.right = tbt->bx;
        ti.rect.top = tbt->ty;
        ti.rect.bottom = tbt->by;

        // Associate the ToolTip with the "tool" window.
        SendMessage(ttwnd[tbt->id], TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);

        // Multiline tooltip - Ilija tried with this
        /*LPNMTTDISPINFO pInfo = (LPNMTTDISPINFO)tbt;
        SendMessage(pInfo->hdr.hwndFrom, TTM_SETMAXTIPWIDTH, 0, 150);*/

        tbt = tbt->next;
    }
    // Extra one, area or button is not known yet
    // Create a ToolTip.
    hwndTT = CreateWindowEx(WS_EX_TOPMOST,
        TOOLTIPS_CLASS, NULL,
        WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,                       
        CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT,
        hwndParent, NULL, (( QunicApp * )CQMainGetApp())->CQWinApp_GetHInst(),NULL);

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

    // Set up "tool" information.
    TOOLINFO ti = { 0 };
    ti.cbSize = sizeof(TOOLINFO);
    ti.uFlags = TTF_SUBCLASS;
    ti.hwnd = hwndParent;
    ti.hinst = (( QunicApp * )CQMainGetApp())->CQWinApp_GetHInst();

    // Get tooltip from resources
    int res = LoadString( ti.hinst, IDS_PREVIEW, string[99], RM_SCROLLTEXT_MAXLEN );

    ti.lpszText = string[99];

    // Set area
    ti.rect.left = 7;
    ti.rect.right = 104;
    ti.rect.top = 131;
    ti.rect.bottom = 145;

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

Спасибо,
Илья

Ответы [ 4 ]

7 голосов
/ 03 декабря 2010

Есть 3 вида подсказок.Ваш скриншот показывает подсказку отслеживания.Затем есть многострочная подсказка, отправьте TTM_SETMAXTIPWIDTH и ответьте на TTN_GETDISPINFO.И есть всплывающие подсказки, задайте флаг стиля окна TTS_BALLOON.Последние два соответствуют вашему счету.

В статье SDK есть хорошие примеры кода.

1 голос
/ 15 октября 2011

Вы можете заставить стандартный элемент управления всплывающей подсказки выполнять многострочное использование следующего трюка:

В вашем обработчике TTN_NEEDTEXT:

// force multi-line tool tips
::SendMessage(pNMHDR->hwndFrom, TTM_SETMAXTIPWIDTH, 0, kToolTipWidth);

Независимо от установки ширины, тогда я могучтобы нарисовать кончики muiltiline:

pToolTipText->lpszText = _T("blah blah blah\r\nmore blah blah\r\nline 3 of blah");

Где kToolTipWidth - некоторая полезная максимальная ширина, скажем, 600-800.

Как ни странно, мне нужно переиздать это сообщение в обработчике TTN_NEEDTEXT, а не толькоскажем создание окна.Это верно для нашего приложения MFC, где MFC использует глобальный элемент управления всплывающей подсказки для каждого потока, который, вероятно, сбрасывается к значениям по умолчанию каждый раз, когда создается новый диалог.Поэтому вполне возможно, что для приложения, не поддерживающего MFC, вы сможете инициализировать его только один раз.

Наслаждайтесь!

0 голосов
/ 02 января 2011

Я обнаружил, что \ n работает для обычных всплывающих подсказок, но ни \ n, ни \ r \ n не работают для всплывающих подсказок. Я не использую Unicode.

0 голосов
/ 03 декабря 2010

Windows использует \r\n для разрывов строк.Попробуйте вместо этого, это должно работать.См. MSDN .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...