Mein Tooltip wird gar nicht angezeigt!



  • Wo soll denn das Icon dargestellt werden? In der TNA? Dann brauchst du eine Nachrichtenschleife.



  • Das Problem bei Deinem Programm ist folgendes:
    Es startet, packt ein Icon in den System-Tray und wird sofort wieder beendet ohne das Du das Icon entfernst!

    Nur deshalb siehst Du das Icon da unten! Fahr mal mit der Maus drüber und es wird verschwinden, gell?
    Was Du da gebastelt hast ist ein Resource-Leak, mehr nicht...

    Dann nochwas:
    Wenn Du keine Messages mit Deinem Program,m verarbeiten möchtest, warum registrierst Du Dir dann eine mittels RegisterWindowMessage? Wer, außer Dir, glaubst Du verarbeitet diese Systemweit eindeutige, nur Deinem Programm bekannte Message, wenn nicht Du?

    Also, wie bereits gesagt: Ohne Nachrichtenschleife/prozedur wird das nix.
    Und, bitte räume auf beim Beenden (entferne das Icon aus dem Systemtray, gib das Handle auf das Icon (hIcon) frei usw.)



  • Ok, aber warum wird die Tooltip nicht angezeigt, dieser Ballong? Ich hab auch mein PSDK (SDK) drauf um das zu nutzen. In der MSDN stand auch ein Beispielcode und den habe ich auch mal reingemacht, aber da kam auch kein Ballong :(!



  • Er wird nicht angezeigt, weil sich dein Programm sofort wieder beendet.



  • Am Programm beenden liegt es nicht! Ich hab jetzt mal ein Fenster erzeugt und das Icon Tray so gemacht das es nicht beendet wird und trotzdem kommt kein "ToolTip"!

    #define _WIN32_IE 0x0600 
    
    #include <windows.h>
    #include <commctrl.h>
    
    #include "resource.h"
    
    #define WM_ICONCLICK (WM_APP+0)
    
    void fnToolTip(HWND, WPARAM, LPARAM, char *);
    void fnIconTray(HWND, BOOL);
    
    LRESULT CALLBACK fnWndProc(HWND, UINT, WPARAM, LPARAM);
    
    HINSTANCE hPREV_OF;
    HICON hIcon;
    
    static UINT s_uTaskbarRestart;
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdLine)
    {
    
    MSG msg;
    HWND hWnd;
    
    WNDCLASS wndclass;
    hPREV_OF = hInstance;
    
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = fnWndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = (HICON)LoadIcon(hInstance, reinterpret_cast<const char *>(IDI_ICON1));
    wndclass.hCursor = LoadCursor(hInstance, IDC_HAND);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName = 0;
    wndclass.lpszClassName = reinterpret_cast<LPCTSTR>("mywindow");
    
    if (!RegisterClass(&wndclass))
    {
    
    	MessageBox(NULL, reinterpret_cast<LPCTSTR>("Leider konnte die Klasse nicht geladen werden!"), reinterpret_cast<LPCTSTR>("WNDCLASS"), MB_ICONERROR);
    
    }
    
    hWnd = CreateWindow("mywindow", 
    					"MyWindow", 
    					WS_OVERLAPPEDWINDOW, 
    					CW_USEDEFAULT, 
    					CW_USEDEFAULT,
    					CW_USEDEFAULT,
    					CW_USEDEFAULT,
    					NULL, 
    					NULL, 
    					hInstance, 
    					NULL);
    
    ShowWindow(hWnd, iCmdLine);
    UpdateWindow(hWnd);  
    
    while(GetMessage(&msg, NULL, 0,0))
    {
    
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    
    }
    
    return msg.wParam;
    
    }
    
    void fnToolTip(HWND hWnd, WPARAM wParam, LPARAM lParam, char *szText)
    {
    
    	TOOLINFO ti; 
    	HWND ToolTip; 
    
    	ToolTip = CreateWindowEx(WS_EX_TOPMOST, 
    		TOOLTIPS_CLASS, 
            NULL, 
            TTS_BALLOON, 
            CW_USEDEFAULT, 
            CW_USEDEFAULT, 
            CW_USEDEFAULT, 
            CW_USEDEFAULT, 
            hWnd, 
            NULL, 
            hPREV_OF, 
            NULL 
            ); 
    
        SetWindowPos(ToolTip, 
            HWND_TOPMOST, 
            0, 
            0, 
            0, 
            0, 
            SWP_NOMOVE); 
    
        ti.cbSize = sizeof(TOOLINFO); 
        ti.uFlags = TTF_SUBCLASS; 
        ti.hwnd = hWnd; 
        ti.hinst = hPREV_OF; 
        ti.uId = 0; 
    	ti.lpszText = szText; 
    
        ti.rect.left = 0; 
        ti.rect.top = 0; 
        ti.rect.right = 100; 
        ti.rect.bottom = 100; 
    
        SendMessage(ToolTip, TTM_ACTIVATE, (WPARAM) wParam, (LPARAM) lParam);
    
    }
    
    void fnIconTray(HWND hWnd, BOOL bAnzeigen)
    {
    
    	NOTIFYICONDATA tsym; 
    
        ZeroMemory (&tsym, sizeof (NOTIFYICONDATA));
    
        if (bAnzeigen)
        {
            tsym.cbSize = sizeof (NOTIFYICONDATA);
            tsym.hWnd   = hWnd;
            tsym.uID    = IDI_ICON1;
            tsym.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
            tsym.uCallbackMessage = NULL;
            tsym.hIcon  = hIcon;
            strcpy (tsym.szTip, "http://www.rp-homepage.com");
            Shell_NotifyIcon (NIM_ADD, &tsym);
        }
    
        else
        {
            tsym.cbSize = sizeof (NOTIFYICONDATA);
            tsym.hWnd   = hWnd;
            tsym.uID    = IDI_ICON1;
            tsym.uFlags = 0;
            Shell_NotifyIcon (NIM_DELETE, &tsym);
        }
    
    }
    
    LRESULT CALLBACK fnWndProc(HWND hWnd, UINT mSG, WPARAM wParam, LPARAM lParam)
    {
    
    switch(mSG)
    {
    
    case WM_CREATE:
    
    	s_uTaskbarRestart = RegisterWindowMessage (TEXT("TaskbarCreated"));
    
    	hIcon = (HICON)LoadImage (hPREV_OF, "icon1.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE);
    
    	fnIconTray(hWnd, TRUE);
    
    	fnToolTip(hWnd, wParam, lParam, "Hallo!!");
    
    	break;
    
    case WM_ICONCLICK:
    
    	switch(lParam)
        {
    
    	case WM_LBUTTONUP: // linke Maustaste
    
    		MessageBox (hWnd, "Maustaste links", "Taskbar Icon", NULL);
    
    		break;
    
    	case WM_RBUTTONUP: // rechte Maustaste
    
    		MessageBox (hWnd, "Maustaste rechts", "Taskbar Icon", NULL);
    
    		break;
    
    	}
    
    	return 0;
    
    	case WM_CLOSE:
    
    		DestroyIcon (hIcon); 
    		PostQuitMessage(0);
    
    		break;
    
    default:
    
    	if (mSG == s_uTaskbarRestart)
            fnIconTray(hWnd, TRUE);
    
    	break;
    
    }
    
    return DefWindowProc(hWnd, mSG, wParam, lParam);
    
    }
    

    Weiß einfach nicht woran das liegt?



  • Prüf mal Rückgabewert von Shell_NotifyIcon() und check mal ob das Icon auch wirklich geladen wird...



  • Das Icon wird ja geladen, ich seh es ja im Tray. Aber der ToolTip wird nicht geladen, bitte nicht verwechseln den Icon Tray Tooltip der vom Icon mitgeliefert wird, sondern dieser Tooltip Ballong!





  • Spielgrips schrieb:

    SetWindowPos(ToolTip, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE);
    

    Ich mag mich ja irren, aber ist es sinnvoll ein ToolTip mit der Breite/Höhe von jeweil 0 Pixeln zu basteln?



  • habe auch noch ein paar kleine "fehler" bzw vorschläge

    - reinterpret_cast weglassen --> warum c++ cast und warum dann den gefährlichsten?
    - globale variablen vermeiden (designfrage)
    - fensterhandle von tooltip speichern, denn wie möchtest du den nachrichten dorthin versenden?
    - rückgabewert von createwindow abfragen bzw getlasterror()



  • Dieses rumbasteln hilft och nicht mehr, kann mir einer mal ein Beispiel coden?



  • initcommoncontrols gemacht?
    rückgabewert von createwindow?

    [edit]
    @hepi

    msdn schrieb:

    The window procedure for the ToolTip control automatically sets the size, position, and visibility of the control. The height of the ToolTip window is based on the height of the font currently selected into the device context for the ToolTip control. The width varies based on the length of the string currently in the ToolTip window.



  • Initcommoncontrols habe ich gemacht vorm erstellen.. GetLastError(); weiß ich nicht wie ich jetzt den Wert oder die Message ausgeben soll! Also per MessageBox habe ich es versucht und da kam nix :(!

    Edit >> Hab das mit einer IF auswerten lassen, also die CreateWindow gibt kein NULL zurück, also wird es erzeugt :)! Aber wo bleibt es?



  • Der große Fehler war die Konstante:

    #define _WIN32_IE 0x0600
    

    Und zwar ohne eine richtige Version anzugeben, geht das nicht, also hab ich die Konstante geändert und schon gehts!

    #define _WIN32_IE 0x0501
    

Anmelden zum Antworten