|
Взаимодействие приложения с System TrayОбласть System Tray представляет собой часть полосы задач, размещается в правом нижнем углу и содержит значки, такие как часы и т.п. Эту область активно используют программы, работающие в процессе всего сеанса Windows. Обычно при этом программы делают себя невидимыми в полосе задач. Для этого при создании необходимо вызвать функцию (Handle – указатель на ваше окно): Функция SetWindowLong LONG SetWindowLong ( HWND hWnd, // дескриптор окна int nIndex, // значение смещения, которое устанавливается LONG dwNewLong //новое значение ); Функция SetWindowLong изменяет атрибуты определяемого окна. Функция также устанавливает 32-разрядное (длинное) значение при заданном смещении в дополнительном пространстве памяти об окне. Параметры: hWnd – идентифицирует окно и, косвенно, класс, которому окно принадлежит. nIndex – определяет значение смещения, отсчитываемое от нуля, которое будет установлено. Допустимые значения находятся в диапазоне от нуля до числа байтов дополнительного пространства в памяти, минус 4; например, если бы Вы установили 12 или большее количество байтов памяти дополнительного пространства, значение 8 было бы индексом к третьему 32-разрядному целому числу. Чтобы установить любое другое значение, определите одно из следующих значений: GWL_EXSTYLE – Устанавливает новый расширенный стиль окна. GWL_STYLE – Устанавливает новый стиль окна. GWL_WNDPROC – Устанавливает новый адрес для оконной процедуры. GWL_HINSTANCE – Устанавливает новый дескриптор экземпляра прикладной программы. GWL_ID – Устанавливает новый идентификатор окна. GWL_USERDATA – Устанавливает 32-разрядное значение, связанное с окном. Каждое окно имеет соответствующее 32-разрядное значение, предназначенное для использования прикладной программой, которая создала окно. Следующие значения также доступны, когда параметр hWnd идентифицирует диалоговое окно: DWL_DLGPROC – Устанавливает новый адрес процедуры диалогового окна. DWL_MSGRESULT – Устанавливает возвращаемое значение сообщения, обработанного в процедуре диалогового окна. DWL_USER – Устанавливает новую дополнительную информацию, которая является частной для прикладной программы, типа дескрипторов или указателей. dwNewLong – устанавливает восстановленное значение. Возвращаемые значения Если функция завершается успешно, возвращаемое значение – предыдущее значение заданного 32-разрядного целого числа. Если функция не выполняет задачу, возвращаемое значение нулевое. Чтобы получать расширенные данные об ошибках, вызовите GetLastError. Функция Shell_NotifyIcon WINSHELLAPI BOOL WINAPI Shell_NotifyIcon ( DWORD dwMessage, PNOTIFYICONDATA pnid ); Используется для добавления и удаления иконки в System Tray. Параметры: dwMessage – должен содержать одно из следующих значений: NIM_ADD - добавить значок в область состояния, NIM_DEL - удалить значок из области состояния, NIM_MODIFY - изменить значок в области состояния. pnid – указывает на структуру типа NOTIFYICONDATA, значения полей которой зависят от параметра dwMessage. Функция Shell_NotifyIcon возвращает ненулевое значение, если операція прошла успешно, и ноль в случае ошибки. Структура NOTIFYICONDATA typedef struct _NOTIFYICONDATA { DWORD cbSize; HWND hWnd; UINT uID; UINT uFlags; UINT uCallbackMessage; HICON hIcon; WCHAR szTip[64]; } NOTIFYICONDATA, *PNOTIFYICONDATA; И ее поля имеют следующий смысл: cbSize – размер структуры NOTIFYICONDATA. hWnd – манипулятор окна, которое будет получать сообщения от значка в области состояния. uID – идентификатор значка. Это значение передается приложению в качестве первого параметра (WPARAM) сообщения от значка. uFlags – набор флагов, которые определяют, какие поля структуры заданы корректно. Могут использоваться следующие значения или их комбинации с помощью логического «ИЛИ»: NIF_ICON – поле hIcon корректно, NIF_MESSAGE – поле uCallbackMessage корректно, NIF_TIP – поле szTip корректно. uCallbackMessage – идентификатор сообщения, посылаемого окну hWnd при возникновении события «мыши» над значком в области состояния. Можно использовать значения WM_USER+ N, где N – неотрицательное число; hIcon – манипулятор иконки, которую нужно разместить (изменить, удалить) в System Tray. szTip – ASCIIZ-строка, которая будет использоваться в качестве «всплывающего» текста, когда указатель «мыши» остановится над значком. Если текст отсутствует, первый байт строки должен быть нулевым. Перед вызовом функции Shell_NotifyIcon нужно подготовить екземпляр структуры NOTIFYICONDATA. Поля cbSize, hWnd и uID нужно заполнять всегда, остальные – по мере необходимости. В соответствии с заполнением полей uCallbackMessage, hIcon и szTip формируется поле флагов uFlags. Чтобы добавить значок в область состояния, нужно вызвать функцію Shell_NotifyIcon, передав ей в качестве параметра dwMessage значение NIM_ADD, а в качестве pnid – указатель на инициализированный экземпляр структуры NOTIFYICONDATA. Если все выполнено правильно, функция вернет ненулевое значение, а в System Tray появится новая иконка. Если планируется, что окно должно принимать сообщения от значка, следует обратить внимание, чтобы поле hWnd перед вызовом Shell_NotifyIcon было инициализировано значеним манипулятора реально существующего окна. В противном случае значок будет исчезать из области состояния, как только над ним остановится указатель «мыши» Если было инициализировано поле uCallbackMessage, система будет посылать окну hWnd сообщения о событиях «мыши» над значком. При этом параметр сообщения WPARAM будет содержать идентификатор значка uID, а параметр LPARAM – тип сообщения. Приложение, разместившее значок в System Tray, может в любой момент изменить иконку или всплывающую подсказку. Для этого нужно внести изменения в соответствующие поля структуры NOTIFYICONDATA, поправить значение uFlags (значения cbSize, hWnd и uId изменяться не должны) и вызвать функцію Shell_NotifyIcon со значением NIM_MODIFY в качестве параметра dwMessage. Для удаления значка из System Tray достаточно правильно заполнить поля cbSize, hWnd, uId и вызвать функцию Shell_NotifyIcon со значением параметра dwMessage равным NIM_DELETE. Пример добавления иконки к окну представлен в листинге 13. const TrayIcon = WM_USER + 1; NOTIFYICONDATA NID; NID.cbSize = sizeof(NOTIFYICONDATA); NID.hWnd = hWnd; NID.uID = 1; NID.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; NID.uCallbackMessage = TrayIcon; //указатель на создаваемое событие от иконки NID.hIcon = LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON1)); strcpy(NID.szTip,"Имя приложения"); Shell_NotifyIcon(NIM_ADD,&NID); Листинг 13 – Добавление иконки программы в System Tray Теперь необходимо написать обработку сообщения TrayIcon в функции обработки сообщений главного окна. Так в листинге 14 показано как обрабатывается сообщение о нажатии на иконку и разворачивании окна после этого. // Часть функции обработки сообщений case TrayIcon: OnTray(hWnd,wParam,lParam); break; // Функция обработки сообщений от иконки int OnTray(HWND hWnd,UINT wParam,LONG lParam) { switch(lParam) { case 514://WM_LBUTTONDBLCLK: ShowWindow(hWnd,SW_SHOWNORMAL); SetForegroundWindow(hWnd); break; } return 0; } Листинг 14 – Обработка нажатия на иконку в System Tray Задание: 1. Модифицировать программу для работы с System Tray: – удаление собственной иконки из System Tray; – добавление иконки в System Tray; – добавление меню к иконке; – обработка нажатия левой и правой кнопок на меню; – обработка выбора пункта меню. 2. Удалить программу из Панели задач. Контрольные вопросы: 1. Для чего предназначен System Tray? 2. Для чего нужно сообщение WM_USER? 3. Какие операции по работе с иконками существуют? 4. Как удалить программу из Панели задач? 5. Как обработать нажатие правой кнопки мыши на иконке? Для самостоятельного изучения: 1. Удаление, добавление и модификация иконок в System Tray. 2. Присоединение меню к System Tray. ЧТО ПРОИСХОДИТ ВО ВЗРОСЛОЙ ЖИЗНИ? Если вы все еще «неправильно» связаны с матерью, вы избегаете отделения и независимого взрослого существования... ЧТО И КАК ПИСАЛИ О МОДЕ В ЖУРНАЛАХ НАЧАЛА XX ВЕКА Первый номер журнала «Аполлон» за 1909 г. начинался, по сути, с программного заявления редакции журнала... Система охраняемых территорий в США Изучение особо охраняемых природных территорий(ООПТ) США представляет особый интерес по многим причинам... Что способствует осуществлению желаний? Стопроцентная, непоколебимая уверенность в своем... Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:
|