Jenter Алекс
Шрифт:
В принципе, назначение каждого члена этой структуры довольно прозрачно. Замечу только, что uID – это не идентификатор ресурса иконки, как можно было бы подумать, а вами определенный идентификатор для tray icon вашего приложения. Иконка, которую выводит в tray приложение, может меняться в процессе работы, но этот идентификатор остается постоянным.
Также вам нужно в uCallbackMessage записать сообщение, которое вы хотите чтобы система вам посылала в качестве уведомления о событиях, происходящих с вашей иконкой. Для этого в программе определите какое-нибудь user-defined сообщение, например так: #define WM_TRAYNOTIFY (WM_APP+100).
WM_APP используется как раз для того, чтобы именно в таком виде и определять нужные вам сообщения.
Теперь, предположим у вас подготовлена иконка для tray: IDI_MYTRAYICON. Нам нужно ее вывести в tray. Вот что мы делаем:
Этот код вставьте в функцию инициализации, причем окно вашего приложения уже должно быть создано, hWnd и hInstance должны быть определены. hWnd вы получаете при создании окна, а hInstance вам передают прямо в WinMain. Если у вас MFC-приложение, поставьте вместо них соответственно AfxGetMainWnd->m_hWnd и AfxGetApp->m_hInstance.
Ну вот, иконку мы вывели, и даже подсказка у нас выводится. Для своевременного удаления иконки в функцию, обрабатывающую выход из программы, поставьте примерно такую же конструкцию, но с NIM_DELETE:
(в структуре nid достаточно теперь определить только cbSize, hWnd и uID).
Но иконка бесполезна, если она ничего не делает. Давайте добавим немного функциональности. Система посылает нам сообщение WM_TRAYNOTIFY каждый раз, когда с иконкой что-то происходит. Все, что мы должны сделать – обработать это сообщение и отреагировать должным образом.
Добавьте в программу обработчик события WM_TRAYNOTIFY. В этом сообщении wParam – это ID иконки, а lParam – код сообщения от мыши, например WM_RBUTTONDOWN. Если у вас не MFC-приложение, просто добавьте один case в функцию окна. Если же вы имеете дело с MFC, то сделайте следующее: в класс главного окна(диалога) добавьте функцию afxmsg void OnTrayNotify(WPARAM wParam, LPARAM lParam);
В карту сообщений класса добавьте следующую строку: ON_MESSAGE(WM_TRAYNOTIFY, OnTrayNotify)
Таким образом обрабатываются пользовательские сообщения. Эта строка свяжет наше сообщение WM_TRAYNOTIFY с функцией его обработки OnTrayNotify.
В этой функции проверяйте значение lParam и делайте то, что вам нужно, например, выводите меню. Как именно это делать – уже совсем другая история…
Q. Не подскажете как в tray выводить текст, как например сделаны часы в windows?
DmitriyA1. Copy from ListSOFT от 18.07.2000
"…Если хочешь, чтобы рядом с системными часами располагалась надпись, например, твое имя, то в HKEY_CURRENT_USER\Control panel\ International\ в первые два параметра запиши его (не более 8 символов), а в третий запиши "HH:mm:ss tt". Кстати, если изменить формат времени таким способом, то строка, записанная в первые два параметра будет фигурировать во всех программах, запрашивающих время, например, в Outlook Express в графе Отправлено и Получено."
Grigori Zagarski