tray Icons und MFC
-
Hi
Ich will, dass mein programm im Tray verschwindet, wenn es minimiert wird. Das klappt auch schon ganz gut, allerdings habe ich Probleme, das programm danach wiederherzustellen. Wenn ich die FAQ und das MSDN richtig verstanden hab, muss ich ja den uCallbackMessage member der NOTIFYICONDATA struktur auf einen bestimmten Wert setzen, der dann an die Fensterprozedur des im hWnd angegebenen Fensters gesendet wird.
BOOL CCountdownDlg::OnInitDialog() { CDialog::OnInitDialog(); . . . nIcon.uCallbackMessage=WM_SIZE; nIcon.hWnd=this->m_hWnd; . . . }
Ich habe WM_SIZE gewählt, da man die Größe des Dialogfensters sowieso nicht verändern kann, es also normalerweise nie aufgerufen werden würde.
void CCountdownDlg::OnShowWindow(BOOL bShow, UINT nStatus) { CDialog::OnShowWindow(bShow, nStatus); if(!bShow) { Shell_NotifyIcon(NIM_ADD, &nIcon); } else { Shell_NotifyIcon(NIM_DELETE, &nIcon); } } void CCountdownDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); ShowWindow(SW_SHOW); }
OnSize wird in dem Programm niemals aufgerufen (die funktion steht auch in der Message Map)
Hab ich irgendwas falsch verstanden?
-
Nen Blick in die FAQs hätte genügt
So muss es sein..:#define WM_NOTIFICATION (WM_APP+100) //ob in die cpp datei
dann kommt der aufruf, wo du das Progg minimieren willst also button oder so!
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); //IDI_MIN ist das Icon was angezeigt wird tnd.szTip[64]=''; 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 CDeinProggDlg::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; }
Hier noch der FAQ Eintrag:
SysTray-Icon
-
Naja, dann lag ich ja schon fast richtig. Ich hatte nur vergessen, das NIF_MESSAGE flag zu setzen.
Danke für die hilfe.
btw.: Ich hab vorher die FAQ durchsucht. Ich würde es in diesem Forum nicht WAGEN eine solche frage zu stellen, ohne vorher in die FAQ zu sehen.
-
bitte bitte,
dann haste wohl nicht richtig geschaut wie *finger erheb aber gleich wieder herunternehm* ist mir letztens aber auch passiert
-
Hallo ...
Ich würde gerne wissen, wie das mit dem callback funktioniert. Das Beispiel von der FAQ kann ich nicht nachvollziehen...
Wieso setzt man das uCallbackMessage auf (WM_APP+100);
Wie mach ich es dann, dass die Funktion "OnTrayNotification" auf aufgerufen wird?? Hab ich einfach nicht hinbekommen!!Bitte um aufklärung!
Cu David
-
Ja das würde mich auch interesieren.
-
Ähm ?
Wie kann das laufen ?? Muß da nicht 63 stehen ?
Also:tnd.szTip[63]='\0';
Chris
-
Hmm ja des komische bei mir wird in einer MFC Anwednuing keine Message gesendet wenn ich über des TrayIcon gehe oder klicke, bei einer andern Win32 App geht es aber.