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.