Программирование на Visual C++. Архив рассылки | страница 38
Желаю всем программировать с удовольствием!
©Алекс Jenter mailto:jenter@mail.ru
Красноярск, 2000.
Программирование на Visual C++
Выпуск №11 от 22/07/2000
Добрый день всем!
В ответ на публикацию вопроса Дмитрия о System Tray в предыдущем выпуске помимо прямых ответов пришло еще несколько просьб рассказать о том, как в системный tray вообще помещать иконки. Я, видимо, был излишне оптимистичен, когда посчитал, что это все знают ;) Так что я решил поведать уважаемым читателям об этом в данном выпуске, в рубрике "WINAPI", в расчете на то, что эта информация будет полезна многим. Получается, сегодняшний выпуск целиком посвящен system tray ;)
Итак, задача у нас следующая: поместить в системный tray свою иконку, причем заставить ее функционировать стандартным образом – чтобы при наведении на нее появлялась подсказка, при нажатии на правую кнопку мыши выскакивало меню, на левую – производилось какое-нибудь действие.
Начнем с начала – нужно поместить иконку в tray. Сами вы это вряд ли сделаете – да это и не нужно. За вас это сделает Windows, вам нужно только сообщить операционной системе о своем намерении. Для этого служит функция Shell_NotifyIcon( ), которая позволяет создавать, изменять и удалять такие иконки.
Первый аргумент этой функции — это код операции, которую вам нужно осуществить. Он имеет три возможных значения — NIM_ADD, NIM_DELETE и NIM_MODIFY. В пояснениях, по-моему, не нуждается. Второй параметр – указатель на структуру NOTIFYICONDATA. Вот как эта структура выглядит:
>typedef struct _NOTIFYICONDATA {
> DWORD cbSize; // размер, обязательно указывать
> HWND hWnd; // HWND для посылки уведомлений
> UINT uID; // идентификатор иконки в tray, не имеет отношения к ресурсам
> UINT uFlags; // см. ниже
> UINT uCallbackMessage; // посылается вашей функции окна
> HICON hIcon; // дескриптор иконки
> CHAR szTip[64]; // строка с подсказкой
>} NOTIFYICONDATA;
>// uFlags
>#define NIF_MESSAGE 0x1 // uCallbackMessage содержит информацию
>#define NIF_ICON 0x2 // hIcon содержит информацию
>#define NIF_TIP 0x4 // szTip содержит информацию
В принципе, назначение каждого члена этой структуры довольно прозрачно. Замечу только, что uID – это не идентификатор ресурса иконки, как можно было бы подумать, а вами определенный идентификатор для tray icon вашего приложения. Иконка, которую выводит в tray приложение, может меняться в процессе работы, но этот идентификатор остается постоянным.
Также вам нужно в uCallbackMessage записать сообщение, которое вы хотите чтобы система вам посылала в качестве уведомления о событиях, происходящих с вашей иконкой. Для этого в программе определите какое-нибудь user-defined сообщение, например так: #define WM_TRAYNOTIFY (WM_APP+100).