Dialog - Tooltiptext 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;
    // [...]
    

Anmelden zum Antworten