Nochmal Tray-Icon



  • Erst mal mein Programm:

    // 1Dlg.cpp : Implementierungsdatei
    //
    
    #include "stdafx.h"
    #include "1.h"
    #include "1Dlg.h"
    #define MYWM_NOTIFYICON (WM_USER+2)
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /////////////////////////////////////////////////////////////////////////////
    // CAboutDlg-Dialogfeld für Anwendungsbefehl "Info"
    
    class CAboutDlg : public CDialog
    {
    public:
    	CAboutDlg();
    
    // Dialogfelddaten
    	//{{AFX_DATA(CAboutDlg)
    	enum { IDD = IDD_ABOUTBOX };
    	//}}AFX_DATA
    
    	// Vom Klassenassistenten generierte Überladungen virtueller Funktionen
    	//{{AFX_VIRTUAL(CAboutDlg)
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    	//}}AFX_VIRTUAL
    
    // Implementierung
    protected:
    	//{{AFX_MSG(CAboutDlg)
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    
    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    	//{{AFX_DATA_INIT(CAboutDlg)
    	//}}AFX_DATA_INIT
    }
    
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CAboutDlg)
    	//}}AFX_DATA_MAP
    }
    
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    	//{{AFX_MSG_MAP(CAboutDlg)
    		// Keine Nachrichten-Handler
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // CMy1Dlg Dialogfeld
    
    CMy1Dlg::CMy1Dlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CMy1Dlg::IDD, pParent)
    {
    	//{{AFX_DATA_INIT(CMy1Dlg)
    		// HINWEIS: Der Klassenassistent fügt hier Member-Initialisierung ein
    	//}}AFX_DATA_INIT
    	// Beachten Sie, dass LoadIcon unter Win32 keinen nachfolgenden DestroyIcon-Aufruf benötigt
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CMy1Dlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CMy1Dlg)
    		// HINWEIS: Der Klassenassistent fügt an dieser Stelle DDX- und DDV-Aufrufe ein
    	//}}AFX_DATA_MAP
    }
    
    BEGIN_MESSAGE_MAP(CMy1Dlg, CDialog)
    	//{{AFX_MSG_MAP(CMy1Dlg)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // CMy1Dlg Nachrichten-Handler
    
    BOOL CMy1Dlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Hinzufügen des Menübefehls "Info..." zum Systemmenü.
    
    	// IDM_ABOUTBOX muss sich im Bereich der Systembefehle befinden.
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
    
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		CString strAboutMenu;
    		strAboutMenu.LoadString(IDS_ABOUTBOX);
    		if (!strAboutMenu.IsEmpty())
    		{	
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
    
    	// Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt
    	//  wenn das Hauptfenster der Anwendung kein Dialogfeld ist
    	SetIcon(m_hIcon, TRUE);			// Großes Symbol verwenden
    	SetIcon(m_hIcon, FALSE);		// Kleines Symbol verwenden
    
    	// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
    	TrayMessage(NIM_ADD);
    
    	return TRUE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }
    
    void CMy1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialog::OnSysCommand(nID, lParam);
    	}
    }
    
    // Wollen Sie Ihrem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie 
    //  den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das 
    //  Dokument/Ansicht-Modell verwenden, wird dies automatisch für Sie erledigt.
    
    void CMy1Dlg::OnPaint() 
    {
    
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // Gerätekontext für Zeichnen
    
    		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
    
    		// Symbol in Client-Rechteck zentrieren
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// Symbol zeichnen
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialog::OnPaint();
    	}
    }
    
    // Die Systemaufrufe fragen den Cursorform ab, die angezeigt werden soll, während der Benutzer
    //  das zum Symbol verkleinerte Fenster mit der Maus zieht.
    HCURSOR CMy1Dlg::OnQueryDragIcon()
    {
    	return (HCURSOR) m_hIcon;
    }
    
    BOOL CMy1Dlg::TrayMessage(DWORD dwMessage)
    {
    	CString sTip(_T("Tray-Icon"));
      NOTIFYICONDATA tnd;
      tnd.cbSize = sizeof(NOTIFYICONDATA);
      tnd.hWnd = m_hWnd;
      tnd.uID = IDR_MAINFRAME;
      tnd.uFlags = NIF_MESSAGE|NIF_ICON;
      tnd.uCallbackMessage = MYWM_NOTIFYICON;
      tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
      VERIFY( tnd.hIcon = LoadIcon(AfxGetInstanceHandle(),
      MAKEINTRESOURCE (IDR_MAINFRAME)) );
      lstrcpyn(tnd.szTip, (LPCTSTR)sTip, sizeof(tnd.szTip));
    
      return Shell_NotifyIcon(dwMessage, &tnd);
    
    }
    
    LRESULT CMy1Dlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
    	// TODO: Speziellen Code hier einfügen und/oder Basisklasse aufrufen
    	// Open window when the user double-clicks the Systray Icon
    
        if(message == MYWM_NOTIFYICON){
    
          switch (lParam){
    
            case WM_LBUTTONDBLCLK:
    
              switch (wParam) {
    
                case IDR_MAINFRAME:
    
                  ShowWindow(SW_NORMAL);
                  SetForegroundWindow();
                  SetFocus();
                  return TRUE;
    
                break;
    
              }
    
          break;
    
        }
    
      }
    
    	return CDialog::WindowProc(message, wParam, lParam);
    }
    
    void CMy1Dlg::OnSize(UINT nType, int cx, int cy)
    {
    	if(nType == SIZE_MINIMIZED){
        ShowWindow(SW_HIDE);
      }
      else{
        CMy1Dlg::OnSize(nType, cx, cy);
      }
    
    }
    

    Wenn ich den Dialog minimiere, kann ich ihn mit Klick auf Tray-Icon wieder herstellen.
    Soweit so gut... ich möchte aber das:

    - das Dialogfeld beim Programmstart schon minimiert wird.
    - das Symbol in der Taskleiste verschwindet beim minimieren.
    - nach beenden des Programms das Tray-Icon gelöscht wird.

    Ich habe keine Ahnung von API und habe mir das so zusammegewürfelt und habe schon Nächte lang in den treaths geschaut, bekomme es aber nicht hin.

    Wäre für Hilfe echt dankbar.
    Gruß
    Karl



  • Zum ersten. Erstell die WM Funktion OnCreate und führ von da aus deinen Code zum minimieren aus.



  • Hm, wenn du eine Dialogbasierte anwendung hast,
    versuch mal meine CTrayDlg Klasse,
    musst du einfach nur als Basisklasse statt CDialog eintragen, und
    dann noch in der cpp ein search&replace mit CDialog->CTrayDlg machen.
    Mit einem Aufruf von OnTray(....) geht dann der Dialog in den Tray.
    Doppelklick holt ihn wieder raus.

    Devil



  • Das ist doch eine Dialoganwendung, da giebt es die WM Funktion OnCreate nicht.
    Kann mann die irgendwie einfügen oder überschreiben.


Anmelden zum Antworten