kvv's home

Форма входа

Категории раздела

Лекции [14]
Разное [4]
Статьи на тему WM, не попавшие в лекции по разным причинам.

Поиск

Каталог статей

Главная » Статьи » Программирование под Windows Mobile » Разное

Работа с треем в Windows Mobile
Иногда у программистов возникает желание отображать состояние свернутого окна программы с помощью иконки в трее. Например,  когда приложение выполняется в фоне и требуется быстрый вызов его контекстного меню или активизация. Как этого добиться? Очень просто.
Для этого в состав 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  мы получим в трее иконку.
Рассмотрим это на следующем примере:

BOOL CreateTrayIcon(HWND hWnd)
{
    NOTIFYICONDATA nid = {0};
    nid.cbSize =  sizeof(nid);
    nid.uID = 100;     
    nid.uFlags = NIF_ICON  | NIF_MESSAGE ;
    nid.hWnd = hWnd;
    nid.uCallbackMessage = WM_USER;
    nid.hIcon = ::LoadIcon(g_hInst,MAKEINTRESOURCE(IDI_TRAYAREA));
    return Shell_NotifyIcon(NIM_ADD, &nid);
}

Для удаления иконки нам нужен похожий вызов:

BOOL DeleteTrayIcon(HWND hWnd)
{
    NOTIFYICONDATA nid = {0};
    nid.cbSize =  sizeof(nid);
    nid.uID = 100;     
    nid.hWnd = hWnd;
    return Shell_NotifyIcon(NIM_DELETE, &nid);
}

Обратите внимание, что в случае удаления нам не нужно заполнять все поля структуры, достаточно заполнить хендл окна и идентификатор иконки.

И наконец, прореагируем на нажатие на иконку:

    //  обработчик сообщений мыши
        case WM_USER:
            {
                TCHAR szText[200];
                wsprintf(szText,L"Tray Msg, id: %d, action: ",wParam);
                if (lParam == WM_LBUTTONDOWN)
                {
                    lstrcat(szText,L" Mouse Down");
                } else
                    if (lParam == WM_LBUTTONUP)
                    {
                        lstrcat(szText,L" Mouse Up");
                    } else
                        if (lParam == WM_MOUSEMOVE)
                        {
                            lstrcat(szText,L" Mouse Move");
                        } else
                        {
                            lstrcat(szText,L" Mouse xxx");
                        }
                ListBox_AddString(GetDlgItem(hDlg,IDC_LIST2),szText);
            }
            break;


Ну вот и все. В заключении два замечания.
1) Приложение может создать любое (разумное) количество иконок, но отобразятся в трее лишь те из них, которым хватит в трее места. так что, поскольку он не резиновый, то стоит соблюдать разумную экономию. =)
2) Не забывайте  удалять за собой иконки при выходе из приложения. Иначе в трее остается мусор в виде пустых мест.


Полный пример демонстрационной программы можно взять здесь http://kvv.my1.ru/load/3-1-0-41.

Категория: Разное | Добавил: kvv (02.02.2009)
Просмотров: 4084 | Комментарии: 3 | Теги: Tray, Трей | Рейтинг: 5.0/1
Всего комментариев: 3
3 sheancini  
0
связь на севере работа

2 eurormeteno  
0
Часто новый проект обладает неплохим потенциалом, но на время старта и начальной раскрутки ему совершенно не нужны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 -
Заказать бесплатный хостинг

1 Niamh  
0
Way to use the internet to help pelpoe solve problems!

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Друзья сайта

  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Облако тэгов