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
Я попробовал так сделать – не получилось. У меня в этом разделе вообще всего один параметр – "Locale". Что-то автор напутал… Может, путь указан неправильно? Хоть результат и отрицательный, я решил все же на всякий случай опубликовать этот ответ – может, тут действительно дело во мне (я проверял в Windows 98SE), ведь на ListSOFT действительно была такая публикация. А может, кто и подскажет, в чем дело.
A2.Я предлагаю набирать текст из иконок, которые должны создаваться динамически.
Подобный подход я видел в нескольких программах, где tray-иконки используются для индикации уровня занятости CPU и т.п.
Пример вывода текста в tray приаттачен. Сам вывод делается в классе CShellNotifyText. Тестовая программка организует в tray'е что-то типа таймера.
Может быть это не самый простой вариант, но пусть кто-нибудь предложит лучше :))
Хочу высказать свое положительное мнение о рассылке. Единственное, что смущает в свете последних известий от Microsoft: Кому будут нужны знания по MFC, когда все начнут программировать на Си-диез (C#)?
Сергей Цивин
Пример я посмотрел, он работает. Но, к сожалению, у такого подхода есть один очень существенный недостаток: если TaskBar в высоту имеет больше одной полосы, никто не гарантирует, что у вас не произойдет переноса на самом неподходящем для этого символе. Я сам смоделировал такую ситуацию, это было сделать легко и выглядело совершенно неприемлемо. Если кто-нибудь знает вдруг, как эту дилемму разрешить – пишите.
А насчет C# – вынужден повториться, он не позиционируется как конкурент VC и MFC. Microsoft полагает, что это Java-киллер. Так, в следующую версии VisualStudio известный продукт Visual J++, скорее всего, не войдет, а вместо него будет сами догадайтесь что…
Успехов!
©Алекс Jenter mailto:jenter@mail.ru Красноярск, 2000.
Программирование на Visual C++
Выпуск №12 от 24/07/2000
Приветствую!
MFC
Недавно мне пришло письмо с просьбой рассказать о таком элементе управления, как CTabCtrl. После того, как я отправил ответ, я подумал, что это могло бы быть интересно многим. Так что я немного переработал материал, кое-что добавил и – читайте!
CTabCtrl: Закладки как средство продуманного интерфейса
Очень часто так бывает, что все нужные элементы управления в диалог не помещаются. Или помещаются, но смотрятся очень неважно: хаотично и не всякий сразу поймет, что к чему. Правилами хорошего интерфейса в таких случаях принято делить элементы управления на логические группы, и каждую логическую группу помещать отдельно. Но что если эти логические группы сами по себе не такие уж маленькие? Тогда лучше всего сами логические группы помещать на разных страницах диалога… а откуда взять эти разные страницы, если диалог-то всего один?
Читать дальше