2010-12-03 8 views
5

Ist es möglich, einen gelben Tooltip in Windows multiline zu machen?Windows gelb Tooltip Multiline?

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

Ich habe versucht, mit \n aber es funktioniert nicht.

EDIT:

Dies ist die Funktion, die ich in meinem Code haben. Ich habe die Anweisungen von MSDN befolgt, konnte aber nicht funktionieren (siehe Kommentar: // 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); 
} 

Danke,
Ilija

Antwort

0

verwendet Windows \r\n für Zeilenumbrüche. Probieren Sie es stattdessen, es sollte funktionieren. Siehe MSDN.

+0

Warum -1? Wer auch immer abgelehnt hat, hast du das wirklich versucht? – ybungalobill

+0

Es funktioniert nicht ... In dem Link, den Sie gesendet haben, funktioniert es, wenn Sie zuvor TTM_SETMAXTIPWIDTH verwenden ... aber für mich nichts funktioniert ... BTW, -1 ist nicht meins :) –

7

Es gibt 3 Arten von Tooltips. Dein Screenshot zeigt eine Tracking-Tooltip. Dann gibt es einen mehrzeiligen Tooltip, sende TTM_SETMAXTIPWIDTH und antworte auf TTN_GETDISPINFO. Und es gibt Sprechblasen-QuickInfos, geben Sie das TTS_BALLOON-Fensterstil-Flag an. Die letzteren beiden passen zu Ihrer Rechnung.

Es gibt gute Codebeispiele im SDK article für sie.

+0

Hans, danke für die Antwort. Ich folgte Anweisungen aus dem Link, konnte es aber nicht funktionieren. Ich bin nicht erfahrener C++ Benutzer, also habe ich Probleme, das zu verstehen. Ich habe meine Frage und den eingefügten Code der aktuellen Funktion bearbeitet, die ich ändern soll. Könntest du bitte überprüfen, was ich falsch gemacht habe? Vielen Dank!! –

+1

Versuchen Sie es mit 'SendMessage (..., TTM_SETMAXTIPWIDTH, 0, MAXINT);'. – wj32

+0

vielleicht ist der erste Parameter in 'SendMessage' falsch? –

0

Ich habe festgestellt, dass \ n für normale Tooltips funktioniert, aber weder \ n noch \ r \ n funktionieren für QuickInfos. Ich verwende kein Unicode.

1

Sie können die Standard-Tooltip Kontrolle zwingen mehrzeilige mit dem folgenden Trick zu tun:

In Ihrem TTN_NEEDTEXT Handler:

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

Egal, indem die Breite einstellen, dann bin ich in der Lage muiltiline zu zeichnen Tipps:

Wo kToolTipWidth ist einige nützliche maximale Breite, sagen 600-800.

Seltsamerweise muss ich diese Nachricht im TTN_NEEDTEXT-Handler erneut ausgeben, und nicht nur bei der Fenstererstellung. Dies gilt für unsere MFC-Anwendung, bei der MFC eine globale Tooltipp-Steuerung pro Thread verwendet, die bei jedem Erstellen eines neuen Dialogfelds wahrscheinlich auf die Standardwerte zurückgesetzt wird. Es ist also möglich, dass Sie eine Nicht-MFC-App nur einmal initialisieren können.

Viel Spaß!