Dialog - Tooltiptext Maximallänge?



  • Hallo!

    Ich würde gerne wissen, wie man die Maximallänge von Tooltiptexten los wird.
    Das hilft nicht:

    m_pToolTip->SetMaxTipWidth(1000);
    

    Vor allem bekommt man da teilweise Zeichensalat angezeigt. 😞

    Sowas halt (nur mehr Text vorne):

    Dies ist ein TooltÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

    Aber nur, wenn ich den String so hinzufüge:

    m_pToolTip->AddTool(&m_edtZusatzzeile, _T("Blabla, irgendwelcher langer Text..."));
    

    wenn ich das über die Stringtabelle mache, wird einfach abgeschnitten.

    m_pToolTip->AddTool(&m_edtZusatzzeile, IDS_TT_ZUSATZZEILE);
    


  • Hi,
    Bin zwar kein MFC'ler 😉 aber IMHO brauchst Du ne Textcallback-Prozedur.

    Hier gibt Infos dazu (Ist aber WinAPI): http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/tooltip/tooltip.asp



  • bei mir ist nach den 79. zeichen schluss - bisher hatts gereicht #gg

    ich denk mir das problem ist das es nicht vorgesehen ist das eine lange zeile ist, in richtigen tooltips macht man ne zweite zeile draus
    ich denk mir das problem bei dir ist das selbe wie bei mir, das man keine zweite zeile machen kann da es in der statusleile landet

    probiere mal den tooltip mit MoveWindow selber zu vergroessern {an der stelle wo ich es aus den sichtbaren bereich verschieb}
    bezweifle aber das das funktioniert /=



  • Mr Evil schrieb:

    probiere mal den tooltip mit MoveWindow selber zu vergroessern {an der stelle wo ich es aus den sichtbaren bereich verschieb}
    bezweifle aber das das funktioniert /=

    In der Statusleiste passiert es ja auch - und da verwende ich ja den Tooltiptext. 😉
    Und lang genug ist sie. 😃



  • ich weiss, bei mir ist genau das selbe problem, der string is cutted nach der 79 stelle



  • Also, nen Zeilenumbruch rausparsen wäre ja kein Problem, aber der String ist einfach zu Ende. 😕
    Und die Tooltips müssen lang sein. Man soll halt gleich wissen, was das da ist unter der Maus.



  • CodeFinder schrieb:

    Hi,
    Bin zwar kein MFC'ler 😉 aber IMHO brauchst Du ne Textcallback-Prozedur.

    Hier gibt Infos dazu (Ist aber WinAPI): http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/tooltip/tooltip.asp

    Da ich zum Testen garantiert länger brauche, weil ich Callbacks nicht genauer kenne...
    Da ist dann keine Maximallänge?



  • estartu schrieb:

    Da ist dann keine Maximallänge?

    Japs 🙂 .
    Hab mich grad mal dran gesetzt und Dir n Programm gebastelt, das funktioniert perfekt.
    Ist auch nur das Wesentlichste drin, dann sollte die Einarbeitungszeit relativ gering sein (und kommentiert
    ist es auch, wenn auch etwas spartanisch 😃 )
    Soll ich Dir das schicken (Mit Projektordner ist es vllt. einfacher/schneller nach zu vollziehen 😉 ) ?

    Wenn ja, gib mal Deine E-Mail-Adresse ...



  • Wow, das ist ja lieb von dir. 😮 (hier fehlt der Jubelsmilie)
    Schick es bitte an: mail@estartu.de

    Werd ich dann gleich morgen früh mal ausprobieren. 🙂



  • Hehe...^^, Jo kein Problem; Habs dir geschickt 😉 .



  • Wow, das sieht wirklich einfach aus. 👍
    Dann werde ich mal versuchen, das zu übertragen. 🙂



  • estartu schrieb:

    Wow, das sieht wirklich einfach aus. 👍

    Ist es auch und da MFC ja nur n Wrapper für die WinAPI sollte sich das auch umwandeln lassen 😉 .

    Wenn Du n Fehler findest bzw. Fragen hast, schreib mir einfach ne Mail.



  • lad doch mal auf hoch für alle user



  • anfrage schrieb:

    lad doch mal auf hoch für alle user

    Hab kein WS ... aber ich kann ja den QC posten, ist das Recht 😉 ?



  • ja, poste den mal bitte
    das wäre echt super 😉



  • Okli, dokli hier ist er.

    Sind ingesamt 3 Quellcodedateien (.cpp) und eine Headerdatei (.h).

    ➡ MainWndProc.cpp

    #include <Windows.h>
    #include <CommCtrl.h>
    
    #include "Globals.h"
    
    // Dieser Text wird im Tooltitip angezeigt
    // (Global damit es übersichtlicher wird):
    TCHAR szTooltitipText[] =
    	TEXT("The following example is a simple window process "
    		 "functition that supports tracking Tooltip. It requests "
    		 "the current positition of the mouse pointer by using "
    		 "the GetCursorPos functition and then adds 15 pixels to "
    		 "the x- and y-coordinates, so the Tooltip appears "
    		 "slightly below and to the right of the pointer. "
    		 "GetCursorPos returns the screen coordinates of the "
    		 "cursor in a POINT structure. Note that the example "
    		 "relies on the value of a global variable, g_bIsVisible, "
    		 "to determine whether the applicatition should send the "
    		 "TTM_TRACKPOSItitiON message. For the purpose of this "
    		 "example, g_bIsVisible is a Boolean variable that another "
    		 "functition sets to TRUE upon sending the TTM_TRACKACTIVATE "
    		 "message to actitivate the Tooltip. This way, if the Tooltip "
    		 "is inactitive, the addititional overhead to calculate and "
    		 "send a message is not incurred.");
    // Breite des ToolTip-Fensters:
    const UINT uiToolTipWidth = 500;
    
    LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uiMessage, WPARAM wParam, LPARAM lParam)
    {
    	static HWND hWndToolTip;
    
    	switch(uiMessage)
    	{
    		case WM_CREATE:
    			TOOLINFO tiToolInfo;
    			RECT	 rcClient;
    			// ToolTip-Fenster erstellen:
    			hWndToolTip = CreateWindowEx
    				(
    				  0L, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_NOPREFIX,
    				  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
    				  CW_USEDEFAULT, hWnd, NULL, g_hInst, NULL
    				);
    			// Client-Area des Hauptfensters ermitteln
    			// in der der ToolTip angezeigt wird.
    			GetClientRect(hWnd, &rcClient);
    			// Informations-Struktur für ToolTip füllen:
    			tiToolInfo.cbSize		= sizeof(TOOLINFO);
    			tiToolInfo.uFlags		= TTF_SUBCLASS;
    			tiToolInfo.hwnd			= hWnd;
    			tiToolInfo.hinst		= g_hInst;
    			tiToolInfo.uId			= 0;
    			tiToolInfo.lpszText		= LPSTR_TEXTCALLBACK;
    			/*
    			Hinweis:
    			Immer wenn das Tooltip seinen Text 'benötigt',
    			also angezeigt werden muss, wird eine Nachricht
    			WM_NOTIFY (siehe Message-Handler) gesendet, in
    			der der Text gesetzt wird.
    			*/
    			tiToolInfo.rect.left	= rcClient.left;
    			tiToolInfo.rect.top		= rcClient.top;
    			tiToolInfo.rect.right	= rcClient.right;
    			tiToolInfo.rect.bottom	= rcClient.bottom;
    			// Tooltip an das Fenster zuweisen:
    			SendMessage(hWndToolTip, TTM_ADDTOOL, 0,
    					    reinterpret_cast<LPARAM>(&tiToolInfo));
    			break;
    
    		case WM_NOTIFY: {
    			// Zeiger auf Info-Strukur der Nachricht ermitteln:
    			LPNMHDR pNmHdr = reinterpret_cast<LPNMHDR>(lParam);
    			switch(pNmHdr->code)
    			{
    				case TTN_GETDISPINFO: {
    					// Zeiger auf Tooltip-Info-Strukur ermitteln:
    					LPNMTTDISPINFO pTTd = reinterpret_cast<LPNMTTDISPINFO>(pNmHdr);
    					SendMessage(pNmHdr->hwndFrom, TTM_SETMAXTIPWIDTH, 0, uiToolTipWidth);
    					pTTd->lpszText = szTooltitipText; // <- (langen) Text setzen
    					} break;
    			}
    			} break;
    
    		case WM_DESTROY:
    			PostQuitMessage(0);
    			break;
    
    		default:
    			return (DefWindowProc(hWnd, uiMessage, wParam, lParam));
    	}
    
    	return (0L);
    }
    

    __________________________________________________________________________

    ➡ WinMain.cpp

    #include <Windows.h>
    #include <CommCtrl.h>
    
    #include "Globals.h"
    
    LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uiMessage, WPARAM wParam, LPARAM lParam);
    
    HINSTANCE g_hInst;
    
    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char* pszCmdLine, int iCmdShow)
    {
        HWND		hWndMain;
        MSG			msgApp;
        WNDCLASSEX	wndclex;
    	TCHAR		szAppClass[] = TEXT("DemoWndClass");
    	TCHAR		szMWndName[] = TEXT("ToolTip-Demo Application -by CodeFinder");
    
        g_hInst = hInst;
    
    	InitCommonControls();
    
    	memset(&wndclex, 0, sizeof(WNDCLASSEX));
    
    	wndclex.cbSize			= sizeof(WNDCLASSEX);
        wndclex.style			= 0;
        wndclex.lpfnWndProc		= reinterpret_cast<WNDPROC>(MainWndProc);
        wndclex.cbClsExtra		= 0;
        wndclex.cbWndExtra		= 0;
        wndclex.hInstance		= hInst;
        wndclex.hIcon			= LoadIcon(NULL, IDI_APPLICATION);
        wndclex.hCursor			= LoadCursor(NULL, IDC_ARROW);
        wndclex.hbrBackground	= reinterpret_cast<HBRUSH>(1 + COLOR_BTNFACE);
        wndclex.lpszMenuName	= NULL;
        wndclex.lpszClassName	= szAppClass;
    
        if(!RegisterClassEx(&wndclex))
    		return (1);  
    
        hWndMain = CreateWindowEx(0L, szAppClass, szMWndName, WS_SYSMENU,
    							  CW_USEDEFAULT, CW_USEDEFAULT, 360, 280,
    							  NULL, NULL, hInst, NULL);
    
    	ShowWindow(hWndMain, iCmdShow);
    	UpdateWindow(hWndMain);
    
    	while(GetMessage(&msgApp, NULL, 0, 0))
    	{
    		TranslateMessage(&msgApp);
    		DispatchMessage(&msgApp);
    	}
    
    	return (msgApp.wParam);
    }
    

    __________________________________________________________________________

    ➡ Libraries.cpp

    // Common-Control-Library:
    #pragma comment(lib, "comctl32.lib")
    

    __________________________________________________________________________

    ➡ Globals.h

    #include <Windows.h>
    
    extern HINSTANCE g_hInst;
    

    Voila 👍 . Wenns Fragen gibt, fragt einfach 😉 .

    EDIT: Irgendwie hat der das nicht so formatiert, wie er soll, naja egal :p .



  • Eine Zeile fehlt mir aktuell noch:

    case TTN_GETDISPINFO: {
                        // Zeiger auf Tooltip-Info-Strukur ermitteln:
                        LPNMTTDISPINFO pTTd = reinterpret_cast<LPNMTTDISPINFO>(pNmHdr);
                        SendMessage(pNmHdr->hwndFrom, TTM_SETMAXTIPWIDTH, 0, uiToolTipWidth);
    // Welche ID hat das Control unter der Maus?
                        pTTd->lpszText = szTooltitipText; // <- (langen) Text setzen
                        } break;
    

    Ich will ja nicht überall den gleichen Tooltip haben. 😉

    Ich habe zwar das hier gefunden, aber da steht nichts von einer ID - aber immerhin mal was von der 80 Zeichen Grenze.
    Ist auch iritierend, dass nur im Windows CE Teil was dazu zu stehen scheint. 😕



  • estartu schrieb:

    // Welche ID hat das Control unter der Maus?

    Ich weiß leider nicht wie die MFC-Äquivalenten dazu heißen, aber ich würds so machen:

    POINT ptCursor;
    GetCursorPos(&ptCursor);
    UINT uiWndIDCursor = static_cast<UINT>(GetWindowLongPtr(WindowFromPoint(ptCursor), GWL_ID));
    

    estartu schrieb:

    Ich will ja nicht überall den gleichen Tooltip haben.

    Hm Du willst also auf einem Fenster (sowohl Childs als auch Parents) verschiedene ToolTips unterbringen ?

    EDIT: Vertipper ... :p



  • CodeFinder schrieb:

    Hm Du willst also auf einem Fenster (sowohl Childs als auch Parents) verschiedene ToolTips unterbringen ?

    Ich habe ja z.B. mehrere Edits in einem View.
    Und da soll pro Edit ein anderer Text angezeigt werden, nämlich immer der für das, wo gerade der Mauszeiger ist.

    Momentan habe ich das gerade so gelöst, dass ich die ControlID mit AddTool als Tooltiptext nehme und in OnTtnTooltipShow auslese und dann den langen Text setze.
    Das war bisher die zufriedenstellendste Notlösung. 😉

    Ich gucke gleich mal, ob ich das mit deinem Tip nun besser hinbekomme.
    Danke. 🙂



  • estartu schrieb:

    CodeFinder schrieb:

    Hm Du willst also auf einem Fenster (sowohl Childs als auch Parents) verschiedene ToolTips unterbringen ?

    Ich habe ja z.B. mehrere Edits in einem View.

    Dann übergib einfach als Handle an die ToolTip-Info-Struktur den Handle des betroffenen Edit-Controls.
    Dann wird automatisch der Client-Bereich des entsprechenden Edits genommen 😉 .

    Vgl. Code hier:

    // unter WM_CREATE...
    // [...]
    tiToolInfo.hwnd            = hWnd;
    // [...]
    

Log in to reply