Wie erstelle ich ein ToolTip Fenster richtig
-
Also ich bekomme es echt nicht hin. Ich habe hier einen Listview mit einigen Elementen für die möchte ich Tooltips anzeigen. Also soweit ich da in der MSDN durchblicke erzeuge ich ein extra Fenster für Tooltips, etwa so:
HWND Create_ToolTipWnd(void){ DWORD style; HWND TT; style = WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP; TT = CreateWindowEx(0, TOOLTIPS_CLASS, 0, style, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hHauptfenster, 0, hInstance, 0); //hHauptfenster + hInstance wurden vorher schon vergeben SetWindowPos(TT, HWND_TOPMOST,0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); SendMessage(TT, TTM_ACTIVATE, TRUE, 0); return TT; }so jetzt möchte ich das mein Listviewfenster Tooltips anzeigen kann, damm muss ich irgendwie was machen und jetzt hängt es bei mit
void RegisterToolTipWindow(HWND hWnd){ TOOLINFO ti; memset(&ti, 0, sizeof(ti)); ti.cbSize = sizeof(ti); // ti.uFlags = ?; ti.hwnd = hWnd; //mein Listviewfenster // ti.uId = ?; // ti.rect = ?; // ti.hinst = ?; ti.lpszText = LPSTR_TEXTCALLBACK; //erhält Text bei : TTN_NEEDTEXT SendMessage(hToolTips, TTM_ADDTOOL, 0, &ti); }Also ich peil das nicht so ganz, ich muss doch nicht etws für jeden Item im Listview einen Tooltip hinzufügen, kann mir da bitte mal jemand helfen, ich sitz hier schon ewig dran, danke.
-
Du benötigst nur einen Tooltip für das Control.
Wenn jetzt der Tooltip ausgelöst wird, dan erhälst Du einen WM_NOTIFY Nachricht mit TTN_NEEDTEXT, diese musst Du beantworten.
http://msdn2.microsoft.com/en-us/library/bb760293(VS.85).aspxAnsonten steht in der MSDN wie immer alles

http://msdn2.microsoft.com/en-us/library/bb760252(VS.85).aspx
-
Danke für die Antwort, leider hilft mir das nur bedingt weiter da ich immer noch nicht weiss wie ich das Tooltip Fenster mit meinem Listview Childfenster verknüpfe. Das Beispiel in der MSDN zeigt wie das Tooltip Fenster mit einer Control verknüpft wird, aber ich habe für mein Listview Childfenster keine Control ID, dasmit dem "TTN_NEEDTEXT" habe ich soweit vertanden und denke daß ich es auch umsetzen kann wenn ich mal das Tooltipfenster mit meinem Listview verbunden habe. Könntest du mir vieleicht noch saen wie ich die TOOLINFO Struktur zu initialisieren habe um diese Verknüpfung herzustellen, danke schon mal.
-
1. Hat jedes Control (außer Top-Level Fenstern) eine Control ID.
2. Genügt das Handle vollkommen. Schau Dir bitte das erste Tool-Snippet bei dem Sample an, da wird auch mit Addtool ein HWND verbunden: Creating a ToolTip for a Control
-
Also, soweit bin ich nun gekommen mit meinen Tooltips im Listview Fenster.
Voraussetungen: LV-Fenster wurde gesubclassed, TT-Fenster erzeugt, LV-Fenster dem TT-Fenster zugeordnet. Mit dem Code weiter unten sind folgende Funktionen realisiert:
- es erscheint eine Tooltipanzeige, wenn sich die Maus über einen Item/Subitem befindet
- eine eventuell vorhandene Anzeige wird ausgeblendet, wenn die Maus das LV Fenster verlässt
- eine eventuell vorhandene Anzeige wird ausgeblendet, wenn sich die Maus nicht über eine Item/Subitem befindet
- ein Positionstracking wird nur dann vorgenommen, wenn sich ein Item- oder Subitemindex geändert hatFehlende Funktionen:
- der TT wird sofort eingeblendet, jedoch soll er erst 1 Sekunde nach verharren der Maus über eine Item eingeblendet werden.
- der TT wird nicht ausgeblendet wenn sich die Maus länger als 5 Sekunden nicht bewegtWie kann ich nun diese noch fehlenden Funktionen realisieren? Hier erstmal der Code:
TOOLINFO ti; static boolean mouse_out = TRUE; static int Item = -1, SubItem = -1; /* ============================================== ein Tolltipfenster wird zugeordnet ============================================== */ void ToolTips_RegisterWindow(HWND hWnd){ memset(&ti, 0, sizeof(ti)); ti.cbSize = sizeof(TOOLINFO); ti.uFlags = TTF_IDISHWND | TTF_SUBCLASS; ti.hwnd = hWnd; ti.uId = (UINT_PTR)hWnd; SendMessage(wnd.ToolTips, TTM_ADDTOOL, 0, (LPARAM)&ti); //wnd.ToolTips wurde vorher erstellt } /* ============================================== das Listview Childfenster wurde vorher ge-subclassed ============================================== */ LRESULT CALLBACK Subclassed_Listview(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){ switch(message){ case WM_MOUSELEAVE:{ SendMessage(wnd.ToolTips, TTM_TRACKACTIVATE, (WPARAM)FALSE, (LPARAM)&ti); mouse_out = TRUE; break; } case WM_MOUSEMOVE:{ char buffer[128]; LVHITTESTINFO ht = {0}; if(mouse_out == TRUE){ TRACKMOUSEEVENT tme; tme.cbSize = sizeof(tme); tme.hwndTrack = hWnd; tme.dwFlags = TME_LEAVE; _TrackMouseEvent(&tme); SendMessage(wnd.ToolTips, TTM_TRACKACTIVATE, (WPARAM)TRUE, (LPARAM)&ti); mouse_out = FALSE; } ht.pt.x = GET_X_LPARAM(lParam); ht.pt.y = GET_Y_LPARAM(lParam); ListView_SubItemHitTest(hWnd, &ht); if(((Item != ht.iItem) || (SubItem != ht.iSubItem)) && (ht.iItem != -1) && (ht.iSubItem != -1)){ sprintf(buffer, "Item: %i\nSubitem: %i", ht.iItem, ht.iSubItem); //Multiline-Tooltip ti.lpszText = buffer; SendMessage(wnd.ToolTips, TTM_SETMAXTIPWIDTH, (WPARAM)0, (LPARAM)200); //aktiviert Multiline-Tooltip SendMessage(wnd.ToolTips, TTM_SETTOOLINFO, 0, (LPARAM)&ti); ClientToScreen(hWnd, &ht.pt); SendMessage(wnd.ToolTips, TTM_TRACKPOSITION, 0, (LPARAM)MAKELONG(ht.pt.x + 10, ht.pt.y + 20)); }else if ((ht.iItem == -1) || (ht.iSubItem == -1)){ //keine Items -> keine Anzeige ti.lpszText = NULL; SendMessage(wnd.ToolTips, TTM_SETTOOLINFO, 0, (LPARAM)&ti); } Item = ht.iItem; SubItem = ht.iSubItem; break; } } return CallWindowProc(OriginalMainWndProc, hWnd, message, wParam, lParam); }
-
desperate progman schrieb:
Fehlende Funktionen:
- der TT wird sofort eingeblendet, jedoch soll er erst 1 Sekunde nach verharren der Maus über eine Item eingeblendet werden.
- der TT wird nicht ausgeblendet wenn sich die Maus länger als 5 Sekunden nicht bewegtAuch diese Fragen beantwortet die MSDN.
Du musst Dir nur mal die möglichen Nachrichten ansehen. Es wundert wohl nicht dass diese entsprechenden Funktionen sich hinter TTM_SETDELAYTIME verbergen.
http://msdn2.microsoft.com/en-us/library/aa932371.aspx
-
Dank, ich habs hinbekommen, mein Fehler war TTM_SETTOOLINFO anstelle von TTM_UPDATETIPTEXT einzusetzen. Die TT-Control läuft nun einwandfrei mit meinen Listview- und Treeviefenstern.