Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Взаимодействие приложения с 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 г. начинался, по сути, с программного заявления редакции журнала...

Система охраняемых территорий в США Изучение особо охраняемых природных территорий(ООПТ) США представляет особый интерес по многим причинам...

Что способствует осуществлению желаний? Стопроцентная, непоколебимая уверенность в своем...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.