Вход/Регистрация
Программирование на Visual C++. Архив рассылки
вернуться

Jenter Алекс

Шрифт:

В принципе, назначение каждого члена этой структуры довольно прозрачно. Замечу только, что uID – это не идентификатор ресурса иконки, как можно было бы подумать, а вами определенный идентификатор для tray icon вашего приложения. Иконка, которую выводит в tray приложение, может меняться в процессе работы, но этот идентификатор остается постоянным.

Также вам нужно в uCallbackMessage записать сообщение, которое вы хотите чтобы система вам посылала в качестве уведомления о событиях, происходящих с вашей иконкой. Для этого в программе определите какое-нибудь user-defined сообщение, например так: #define WM_TRAYNOTIFY (WM_APP+100).

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

Теперь, предположим у вас подготовлена иконка для tray: IDI_MYTRAYICON. Нам нужно ее вывести в tray. Вот что мы делаем:

// уведомляющее сообщение

#define WM_TRAYNOTIFY (WM_APP+100)

// идентификатор иконки

#define ID_TRAYICON 1000

…

CString sNotifyTip = "Название вашей программы или другая подсказка";

NOTIFYICONDATA nid;

memset(&nid, 0, sizeof(nid)); // обнулять структуру перед использованием – хорошая привычка

nid.cbSize = sizeof(nid);

nid.hWnd = hWnd;

nid.uID = ID_TRAYICON;

nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;

nid.uCallbackMessage = WM_TRAYNOTIFY;

nid.hIcon = ::LoadIcon(hInstance, MAKEINTRESOURCE(IDR_MAINFRAME));

lstrcpyn(nid.szTip, sNotifyTip, sizeof(nid.szTip));

Shell_NotifyIcon(NIM_ADD, &nid);

Этот код вставьте в функцию инициализации, причем окно вашего приложения уже должно быть создано, hWnd и hInstance должны быть определены. hWnd вы получаете при создании окна, а hInstance вам передают прямо в WinMain. Если у вас MFC-приложение, поставьте вместо них соответственно AfxGetMainWnd->m_hWnd и AfxGetApp->m_hInstance.

Ну вот, иконку мы вывели, и даже подсказка у нас выводится. Для своевременного удаления иконки в функцию, обрабатывающую выход из программы, поставьте примерно такую же конструкцию, но с NIM_DELETE: 

NOTIFYICONDATA nid;

memset(&nid, 0, sizeof(nid)); 

nid.cbSize = sizeof(nid);

nid.hWnd = hWnd;

nid.uID = ID_TRAYICON;

Shell_NotifyIcon(NIM_DELETE, &nid); 

(в структуре nid достаточно теперь определить только cbSize, hWnd и uID).

Но иконка бесполезна, если она ничего не делает. Давайте добавим немного функциональности. Система посылает нам сообщение WM_TRAYNOTIFY каждый раз, когда с иконкой что-то происходит. Все, что мы должны сделать – обработать это сообщение и отреагировать должным образом. 

Добавьте в программу обработчик события WM_TRAYNOTIFY. В этом сообщении wParam – это ID иконки, а lParam – код сообщения от мыши, например WM_RBUTTONDOWN. Если у вас не MFC-приложение, просто добавьте один case в функцию окна. Если же вы имеете дело с MFC, то сделайте следующее: в класс главного окна(диалога) добавьте функцию afxmsg void OnTrayNotify(WPARAM wParam, LPARAM lParam);

В карту сообщений класса добавьте следующую строку: ON_MESSAGE(WM_TRAYNOTIFY, OnTrayNotify)

Таким образом обрабатываются пользовательские сообщения. Эта строка свяжет наше сообщение WM_TRAYNOTIFY с функцией его обработки OnTrayNotify.

В этой функции проверяйте значение lParam и делайте то, что вам нужно, например, выводите меню. Как именно это делать – уже совсем другая история…

void CMyDlg::OnTrayNotify(WPARAM wParam, LPARAM lParam) {

 if (lParam==WM_LBUTTONDOWN) {

::SetForegroundWindow(m_hWnd); // активизируем наше приложение

AfxMessageBox("Была нажата левая кнопка");

 } else if (lParam==WM_RBUTTONDOWN) {

::SetForegroundWindow(m_hWnd);

AfxMessageBox("Была нажата правая кнопка");

 }

}

ВОПРОС-ОТВЕТ

Q. Не подскажете как в tray выводить текст, как например сделаны часы в windows?

Dmitriy

A1. Copy from ListSOFT от 18.07.2000

"…Если хочешь, чтобы рядом с системными часами располагалась надпись, например, твое имя, то в HKEY_CURRENT_USER\Control panel\ International\ в первые два параметра запиши его (не более 8 символов), а в третий запиши "HH:mm:ss tt". Кстати, если изменить формат времени таким способом, то строка, записанная в первые два параметра будет фигурировать во всех программах, запрашивающих время, например, в Outlook Express в графе Отправлено и Получено."

Grigori Zagarski
  • Читать дальше
  • 1
  • ...
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: