Новичок
Профиль
Группа: Участник
Сообщений: 48
Регистрация: 19.10.2005
Репутация: нет Всего: нет
|
| Код | class CTrayIcon : public CWindowImpl<CTrayIcon, CWindow, CNullTraits>, public MonitorManager { private: HWND hParentWnd;
HICON onIcon; HICON offIcon; HICON msgsOnIcon; HICON msgsOffIcon;
int sessionOnFlag; NOTIFYICONDATA trayData; CString tip; CMenu menu;
MonitorController* mainDlg;
enum { UWM_APP_NOTIFYTRAYICON = WM_APP }; private: void showParentWindow();
void hideParentWindow();
void loadStartedTrayView();
void loadStoppedTrayView(); public: DECLARE_WND_CLASS(NULL)
BEGIN_MSG_MAP_EX(CTrayIcon) MESSAGE_HANDLER_EX(UWM_APP_NOTIFYTRAYICON, OnNotifyTrayIcon) MSG_WM_DESTROY(OnDestroy) MSG_WM_CREATE(OnCreate)
COMMAND_ID_HANDLER_EX(ID_MENU_EXIT, OnMenuExit) COMMAND_ID_HANDLER_EX(ID_MENU_START, OnMenuStart) COMMAND_ID_HANDLER_EX(ID_MENU_STOP, OnMenuStop) END_MSG_MAP()
CTrayIcon(MonitorController *c);
virtual ~CTrayIcon();
LRESULT OnNotifyTrayIcon(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam);
void OnDestroy();
LRESULT OnCreate(LPCREATESTRUCT lParam);
LRESULT OnMenuExit(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/);
LRESULT OnMenuStart(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/);
LRESULT OnMenuStop(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/);
void showOnTrayIcon();
void showOffTrayIcon();
void addTrayIcon();
void deleteTrayIcon(); };
|
| Код | TrayIcon::CTrayIcon(MonitorController *c) : MonitorManager(c) {
mainDlg = c;
sessionOnFlag = 0;
ZeroMemory(&trayData, sizeof(trayData)); trayData.cbSize = sizeof(trayData);
onIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDI_ON), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
offIcon = (HICON)::LoadImage(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDI_OFF), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
menu.LoadMenu(IDR_MENU_TRAY_START); tip.LoadString(IDS_TRAYICON_OFF); }
CTrayIcon::~CTrayIcon() { ::DestroyIcon(onIcon); ::DestroyIcon(offIcon); menu.DestroyMenu(); }
LRESULT CTrayIcon::OnCreate(LPCREATESTRUCT lParam) {
hParentWnd = lParam->hwndParent; ShowWindow(SW_HIDE); addTrayIcon(); return 0; }
void CTrayIcon::OnDestroy() { //deleteTrayIcon(); }
LRESULT CTrayIcon::OnMenuExit(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/) { // showParentWindow(); //::MessageBox(NULL, "exit", "", MB_OK); exit(); return 0; }
LRESULT CTrayIcon::OnMenuStart(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/) { // showParentWindow(); //::MessageBox(NULL, "start", "", MB_OK); startSession(); return 0; }
LRESULT CTrayIcon::OnMenuStop(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/) { // showParentWindow(); //::MessageBox(NULL, "stop", "", MB_OK); stopSession(); return 0; }
LRESULT CTrayIcon::OnNotifyTrayIcon(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam) { switch (lParam) { case WM_LBUTTONDOWN: if (::IsWindowVisible(hParentWnd)) { hideParentWindow(); } else { showParentWindow(); } break; case WM_MOUSEMOVE: break; case WM_RBUTTONUP: CMenuHandle submenu = menu.GetSubMenu(0); POINT pos; GetCursorPos(&pos); submenu.TrackPopupMenu(TPM_CENTERALIGN, pos.x, pos.y, m_hWnd); break; } return TRUE; }
void CTrayIcon::addTrayIcon() { trayData.uFlags = NIF_ICON | NIF_MESSAGE; trayData.hIcon = offIcon; trayData.hWnd = m_hWnd; trayData.uCallbackMessage = UWM_APP_NOTIFYTRAYICON; ::Shell_NotifyIcon(NIM_ADD, &trayData); }
void CTrayIcon::deleteTrayIcon() { ::Shell_NotifyIcon(NIM_DELETE, &trayData); }
void CTrayIcon::showOnTrayIcon() { trayData.uFlags = NIF_ICON; trayData.hIcon = onIcon; ::Shell_NotifyIcon(NIM_MODIFY, &trayData); loadStartedTrayView(); }
void CTrayIcon::showOffTrayIcon() { trayData.uFlags = NIF_ICON; trayData.hIcon = offIcon; ::Shell_NotifyIcon(NIM_MODIFY, &trayData); loadStoppedTrayView(); }
void CTrayIcon::showParentWindow() { ::BringWindowToTop(hParentWnd); ::ShowWindow(hParentWnd, SW_RESTORE); ::SetForegroundWindow(hParentWnd); }
void CTrayIcon::hideParentWindow() { ::ShowWindow(hParentWnd, SW_HIDE); }
void CTrayIcon::loadStartedTrayView() { menu.DestroyMenu(); menu.LoadMenu(IDR_MENU_TRAY_STOP); tip.LoadString(IDS_TRAYICON_ON); sessionOnFlag = 1; }
void CTrayIcon::loadStoppedTrayView() { menu.DestroyMenu(); menu.LoadMenu(IDR_MENU_TRAY_START); tip.LoadString(IDS_TRAYICON_OFF); sessionOnFlag = 0; }
|
MonitorManager - абстрактный класс от которого наследуется и CMainDlg Ситуация такая: если кликаем по иконке в трее правой кнопкой мыши - появляется всплывающее меню и не хочет исчезать при щелчке левой кнопкой где-нибудь, помимо этого меню. Но при щелчке по диалогу CMainDlg оно все-таки исчезает! (При щелчке, например, по окну другого приложения - по-прежнему висит около трея) В чем проблема - может кто сталкивался?! Это сообщение отредактировал(а) zhekha - 31.10.2007, 13:22
|