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.


  • Mod

    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).aspx

    Ansonten 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.


  • Mod

    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 hat

    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 bewegt

    Wie 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);
    }
    

  • Mod

    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 bewegt

    Auch 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.


Anmelden zum Antworten