5 votes

Infobulle jaune de Windows multiligne ?

Est-il possible de rendre l'infobulle jaune multiligne dans Windows ?

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

J'ai essayé avec \n mais cela ne fonctionne pas.

EDITAR:

Voici la fonction que j'ai dans mon code. J'ai suivi les instructions de MSDN mais je n'ai pas réussi à la faire fonctionner (voir le commentaire : // 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);
}

Gracias,
Ilija

7voto

Hans Passant Points 475940

Il existe trois types d'infobulles. Votre capture d'écran montre une infobulle de suivi. Ensuite, il y a une infobulle multiligne, envoyez TTM_SETMAXTIPWIDTH et répondez à TTN_GETDISPINFO. Et il y a les bulles d'aide, en spécifiant le drapeau de style de fenêtre TTS_BALLOON. Ces deux dernières options vous conviennent.

Il y a de bons exemples de code dans le Article du SDK pour eux.

2voto

Mordachai Points 3234

Vous pouvez forcer le contrôle d'infobulle standard à faire du multiligne en utilisant l'astuce suivante :

Dans votre gestionnaire TTN_NEEDTEXT :

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

Quoi qu'il en soit, en définissant la largeur, je suis en mesure de dessiner des pointes de muiltiline :

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

Où kToolTipWidth est une largeur maximale utile, par exemple 600-800.

Curieusement, je dois réémettre ce message dans le gestionnaire TTN_NEEDTEXT, et pas seulement à la création de la fenêtre. C'est vrai pour notre application MFC, où MFC utilise un contrôle d'info-bulle global par thread, qui est probablement réinitialisé aux valeurs par défaut à chaque fois qu'un nouveau dialogue est créé. Il est donc possible que pour une application non MFC, vous puissiez l'initialiser une seule fois.

Bonne lecture !

0voto

Woody Points 1

J'ai constaté que \n fonctionne pour les infobulles normales, mais ni l'un ni l'autre ne fonctionne pour les infobulles \n ni \r\n fonctionne pour les bulles d'aide. Je n'utilise pas l'Unicode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X