System - SysTray-Icon



  • Hallo,

    Wie erstelle ich mit den MFC ein Programm, das auf einem unsichtaberen Fenster basiert?
    Bzw wie mache ich ein Fenster überhaupt unsichtbar?

    Wenn ich z.B. mit dem Assisteten eine Dialogfeldbasierte MFC-Exe erstelle wird das Dialogfeld offensichtlich nach der Erstellung mit DoModal() aufgerufen.
    Dieses Dialogfeld kann ich z.B. Minimieren, dann ist aber noch der Knopf in der Taskleiste da. Könnte man den vielleicht verschwinden lassen?
    Mit OpenWindow.Hide() hatte ich keinen Erfolg. (Passiert gar nichts)

    Genauere Info über mein Problem:
    Ich verscuhe eine Anwendung zu schreiben, die ein Icon in der System-Tray erstellt (so ein Bildchen rechts-unten neben der Win-Uhr).
    Das klappt auch problemlos, nur will ich das dazugehörige Fenster (z.zt. Dialogfeld) noch verschwinden lassen, das soll nur aufgerufen werden wenn man auf das Tray-Icon klickt.

    Ich bin über jeden Tip dankbar, das mit dem Dialogfeld war nur ne Idee von mir.
    Mit der Win-Api kenne ich mich leider nicht aus.

    [ Dieser Beitrag wurde am 31.03.2002 um 19:27 Uhr von dEUs editiert. ]



  • Hier die richtige Funktion ...

    **
    ShowWindow(SW_HIDE);
    **

    AndOne images/smiles/icon_biggrin.gif



  • Danke, das habe ich ja auch gedacht.
    Klappt aber bei einem Modalen Dialogfeld nicht...



  • Klar klappt das.
    Allerdings nicht in OnInitDialog images/smiles/icon_sad.gif



  • Dort hab ichs ja versucht...
    wo sonst solls denn klappen?



  • So dann nochmal was zu deinem Icon neben der Uhr ; ) auch gennant TrayIcon..

    Also:

    // CDeinDialog.cpp
    #define WM_NOTIFICATION (WM_APP+100)
    
    BEGIN_MESSAGE_MAP(CDeinDlg, CDialog)
        ON_MESSAGE(WM_NOTIFICATION, OnTrayNotification)
    END_MESSAGE_MAP()
    
    // CDeinDlg.h
    // Generierte Message-Map-Funktionen
    //{{AFX_MSG(CDeinDlg)
    afx_msg LRESULT OnTrayNotification(WPARAM wParam, LPARAM lParam);
    //}}AFX_MSG
    

    dann kommt der aufruf, wo du das Progg minimieren willst also button oder so!

    void CDeinDlg::OnMini() 
    {
       NOTIFYICONDATA tnd;
       ZeroMemory(&tnd, sizeof (NOTIFYICONDATA));
       tnd.cbSize = sizeof (NOTIFYICONDATA);
       tnd.hWnd = this ->m_hWnd;
       tnd.uID = 1;
       tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
       tnd.uCallbackMessage = WM_NOTIFICATION;
       tnd.hIcon = (HICON) LoadImage(AfxGetApp()->m_hInstance,
       MAKEINTRESOURCE(IDI_MIN),IMAGE_ICON,
       16,16,LR_SHARED|LR_DEFAULTCOLOR);
       lstrcpyn(tnd.szTip,"Proggname",sizeof(tnd.szTip));
       Shell_NotifyIcon(NIM_ADD,&tnd);
       ShowWindow(SW_HIDE);
    }
    

    so fehlt nur noch, das du das Progg ja auch wieder haben willst (hier beispiel linke maustastendruck):

    LRESULT CDeinDlg::OnTrayNotification(WPARAM wp, LPARAM lp)
    {
        switch (lp)
        {
        case WM_LBUTTONUP:
            ShowWindow(SW_SHOW);
            NOTIFYICONDATA iconData;
            iconData.cbSize = sizeof(NOTIFYICONDATA);
            iconData.hWnd = this->GetSafeHwnd();
            iconData.uID = 1;
            return Shell_NotifyIcon(NIM_DELETE,&iconData);
        }
    return 0;
    }
    

    So das Sollte es gewesen sein...

    Hab es erweitert, mit den Sachen aus dem aktuellen Anlass

    [ Dieser Beitrag wurde am 22.08.2002 um 09:03 Uhr von C-O-M-M-A-N-D-E-R editiert. ]

    [ Dieser Beitrag wurde am 09.05.2003 um 10:16 Uhr von Marc++us editiert. ]





  • So wird in den Tray minimiert:

    void CMainFrame::OnSize(UINT nType, int cx, int cy)
    {
        CFrameWnd::OnSize(nType, cx, cy);
    
        if (nType == SIZE_MINIMIZED)
        {
            ShowWindow(SW_HIDE);
        }
    }
    

Log in to reply