Иногда у программистов возникает желание отображать состояние свернутого окна программы с помощью иконки в трее. Например, когда приложение выполняется в фоне и требуется быстрый вызов его контекстного меню или активизация. Как этого добиться? Очень просто. Для этого в состав Shell API включена специальная функция Shell_NotifyIcon. Рассмотрим ее.
Прототип функции описан как: WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(DWORD dwMessage, PNOTIFYICONDATA pnid ); где dwMessage - команда для взаимодействия с треем, может принимать одно из значений :
NIM_ADD - добавить иконку
NIM_DELETE - удалить иконку
NIM_MODIFY - изменить параметры иконки
pnid - указатель на структуру NOTIFYICONDATA, описывающую иконку.
typedef struct _NOTIFYICONDATA { DWORD cbSize; - размер структуры в байтах HWND hWnd; - хендл окна, которому будут приходить сообщения от иконки UINT uID; - идентификатор иконки UINT uFlags; - флаги заполненных полей структуры UINT uCallbackMessage; - идентификатор сообщения HICON hIcon; - хендл изображения иконки WCHAR szTip[64]; - текст всплывающей подсказки } NOTIFYICONDATA, *PNOTIFYICONDATA;
Рассмотрим параметры по-порядку. cbSize - тут все понятно, заполняем его как sizeof(NOTIFYICONDATA) и забываем про него hWnd - нужен для того, чтобы система смогла послать данному окну сообщение. uID - идентификатор иконки. число от 13 и выше . (значения 0..12 зарезервированы системой) uFlags - поле, показывающее, какие из других полей заполнены данными, комбинация констант :
NIF_ICON - поле hIcon заполнено
NIF_MESSAGE - поле uCallbackMessage заполнено
NIF_TIP - поле szTip заполнено
uCallbackMessage - идентификатор сообщения, которое будет посылаться окну, указанному в поле hWnd, при нажатии стилусом на иконку. (см. ниже) hIcon - хендл картинки. с ним тоже все понятно., можно загрузить с помощью LoadIcon из ресурсов или получить любым другим доступным способом. главное, чтобы иконка не была удалена пока она отображается в трее. иначе она исчезнет из трея. szTip - текст всплывающей подсказки при движении стилуса по иконе. (поле интерсное, но увы, в WindowsMobile не работает). так что просто про него забудем.
При нажатии на иконку, в очередь сообщений родительского окна (указанного в поле hWnd) помещается сообщение, идентификатор которого передан в поле uCallbackMessage. При этом в поле сообщения wParam будет лежать идентификатор иконки (из поля uID), а в поле lParam - идентификатор реального события. Это может быть одно из событий:
WM_LBUTTONDOWN - нажали стилусом по иконе
WM_LBUTTONUP - отпустили стилус на иконе
WM_MOUSEMOVE - подвигали стилус по иконе
Анализируя эти состояния, можно добиться разного поведения программы в зависимости от действий юзера.
С теорией покончено, перейдем к практике. Итак, заполнив поля структуры и вызвав функцию Shell_NotifyIcon с параметром NIM_ADD мы получим в трее иконку. Рассмотрим это на следующем примере:
Ну вот и все. В заключении два замечания. 1) Приложение может создать любое (разумное) количество иконок, но
отобразятся в трее лишь те из них, которым хватит в трее места. так
что, поскольку он не резиновый, то стоит соблюдать разумную экономию. =) 2) Не забывайте удалять за собой иконки при выходе из приложения. Иначе в трее остается мусор в виде пустых мест.
Часто новый проект обладает неплохим потенциалом, но на время старта и начальной раскрутки ему совершенно не нужныhttp://www.libertytraffic.ru/billing/order.php?group=7 - большие сервера или даже отдельный платный хостинг. В таких ситуациях на помощь придет наш http://www.libertytraffic.ru/billing/order.php?group=7 - бесплатный хостинг с поддержкой php и mysql. Конечно, http://www.libertytraffic.ru/billing/order.php?group=7 - бесплатный хостинг не так уж бесплатен: в обмен на услуги вы будете вынуждены показывать рекламные объявления на своем сайте. Что характерно, ничто вам не помещает со временем перевезти свой сайт с бесплатного хостинга на собственный, лишенный рекламы но вытягивающий пару баксов из кармана. http://www.libertytraffic.ru/billing/order.php?group=7 - Заказать бесплатный хостинг