Einsteigerfrage:Minimieren in Tray



  • Hallo,

    habe folgedes in meiner in meiner OnSysCommand stehen:

    if (nID==SC_MINIMIZE)
    {
    icon.uCallbackMessage = WM_USER+4532;
    icon.hWnd = this->m_hWnd;
    icon.hIcon = this->m_hIcon;
    icon.uFlags = NIF_MESSAGE | NIF_ICON;
    Shell_NotifyIcon(NIM_ADD,&icon);
    ShowWindow(SW_HIDE);
    }
    else
    {
    CDialog::OnSysCommand(nID, lParam);
    }
    

    So weit, so gut.

    Nur eine simple Frage:

    Das Prog wird dadurch da rein minimiert, nur wie kriege ich es da jetzt wieder raus? Ich kann es nicht Anklicken...

    Anmerkung: Bin absoluter Einsteiger, mit ein paar Kentnissen aus Java.

    Habe zwar schon aus einigen anderen Foren Lösungsvorschläge gekriegt, kann jedoch mit den riesigen Codefragmenten nix anfangen. Es kann ja nicht sein, dass ich etwas, was mit 10 Zeilen in die Tray rein geht, nur mit 10000 Zeilen wieder raus geht.

    So viel ich weiß, wird es mit ShowWindow(SW_SHOW); und SetForegroundWindow(); wieder sichtbar gemacht. Jetzt fehlt mir nur das Event, also:

    Wenn (User auf das Minimierte Symbol klickt)
    dann{
    Stelle das Programm wieder dar:
    ShowWindow(SW_SHOW);
    SetForegroundWindow();
    }

    und:
    Wenn (User auf das Minimierte Symbol rechts klickt)
    dann{
    Zeige ein Kontextmenü an.
    }

    verwende MS VC++ Version 6.0, MFC

    Danke im vorraus!

    mfg

    trequ



  • Guck ma in die FAQ



  • Hallo,

    Wenn ich das kapieren würde was in der Faq steht, wäre ich schon mal weiter.
    Also:

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

    das habe ich drin, er compiliert auch, aber wenn man dann auf das Icon klickt, passiert gar nix.

    mfg
    trequ



  • les dir mal die beiden beiträge zu TrayIcons durch, dort steht alles drin, was du wissen musst.



  • Hast Du ON_WM_SIZE mit eingetragen ??

    //{{AFX_MSG_MAP(CPMKMakerDlg)
        ON_MESSAGE(WM_NOTIFICATION, OnTrayNotification)
        ON_WM_SIZE()
    

    Hab aber selbst auch noch ne Frage!

    Hab das Beispiel aus der FAQ verwendet funzt auch 1a.Nun möchte ich aber beim Klick auf den MinButton mein Prog in den SysTray verschwinden lassen.Das hab ich zwar hin,nur es ist trotzdem Minimiert zwar hidden und wenn ich es aus dem Tray zurückhole sitz es minimiert,sichtbar in der Taskleiste.

    void CProgDlg::OnSize(UINT nType, int cx, int cy)
    { 
        CDialog::OnSize(nType, cx, cy);
    
        if (nType == SIZE_MINIMIZED)
    
        {
        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,"Prog",sizeof(tnd.szTip));
            Shell_NotifyIcon(NIM_ADD,&tnd);
            ShowWindow(SW_HIDE);
        }
    }
    

    Wie stelle ich es an das mein Programm garnicht minimiert wird wen ich auf den MinButton Klicke??? sondern das es nur im Tray erscheint.?!?



  • Wie es maximiert bleibt, weiß ich leider auch nicht. Aber das Problem, dass es beim zurückholen minimiert bleibt, habe ich so gelöst:

    LRESULT CMainFrame::OnTrayNotification(WPARAM w, LPARAM l)
    {
      ...
        // ursprünglich steht hier SW_SHOW
        // auf SW_SHOWMAXIMIZED setzen und es wird maximiert in den Vordergrund
        // geholt
        ShowWindow(SW_SHOWMAXIMIZED);
      ...
    

    Gruß
    Chris


Anmelden zum Antworten