C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Добавление иконок в системную панель / Ресурсы приложения / Приложение

Добавление иконок в системную панель
     и управление видимостью приложения.

           Данная статья  раскрывает  некоторые особенности добавления иконок в системную
панель а в особенности управлением уведомления от этих иконок.
    В данном примере создается приложение которое добавляет иконку в системную панель
при двойном щелчке мышью окно приложения убиратся с экрана-становится "невидимым"
при следующем двойном щелчке окно показывается. Внешний вид приблизительно такой.


ТРЭЙ - трэем я буду называть ту часть панели задач куда добавляются иконки ( рядом с часами)

Создание каркаса приложения.

При создании нового проекта указываем что  это однооконный документ,
на четвертом шагу убираем все галочки чтоб не загромождать код,

 а на шестом шаге указываем что в окне у нас будет объект CRichEditView - как бы
редактор (ну чтоб польза хоть какая то была)

Далее в  функцию CHide_and_iconApp::InitInstance() необходимо добавить
вызов функции Shell_NotifyIcon() которая добавляет иконку в системную панель
для этого щелкаем по имени функции и переходим к редактированию

необходимо отметить что нижеприведенный код должен вставляться до того как
функция вернет значение:

NOTIFYICONDATA nData;
//Объявляется структура данных добавляемой иконки
 HICON hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
//Подгружается изображение иконки из файла ресурсов
 nData.cbSize= sizeof(nData);
//Первое поле должно содержать размер своей структуры
nData.hIcon = hIcon;
//Указатель на изображение иконки
 nData.hWnd = m_pMainWnd->m_hWnd;
//Указатель на то к какому окну будет принадлежать эта иконка
nData.uID = 123;
//Значение wParam которое будет передаваться при наведени мышкой на иконку
 nData.uCallbackMessage = WM_USER+222;
//Значение в карте сообщений которое будет вызываться при
//наведени мышкой на иконку
nData.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
//Действия которые будут производиться т.е.
// NIF_ICON - добавляться иконка
//NIF_MESSAGE - выполняться пользовательская функция
//NIF_TIP - при наведении мышкой будет высвечиваться "подсказка"
 sprintf(nData.szTip,"this is a tip");
// копируем "подсказку" в соответствующее ей поле
 Shell_NotifyIcon(NIM_ADD ,&nData);
// Вызываем собственно функцию
// где первый параметр указывает что мы добавляем иконку
//а второй параметр передает указатель на вышеописанную структуру.
 

в принципе уже после этого можно откомпилировать и запустить программу, внизу
появиться иконка, только будет два "НО" : 1- никаких действий при нажатии на иконку
не будет и    2 - иконка останется в трэе после завершения приложения.
по первому поводу ничего не делается не потому что иконка не генерирует системное
событие WM_USER+222 а потому что мы не научили как на это событие надо реагировать.
Исправляемся: Выбирая клас CMainFrame  добавляем в него член-функцию которая будет
реагировать.

Естественно функция должа быть объявлена как функция обработки системных событий
т.е. функция должна возвращать afx_msg LRESULT
и параметрами ее должны быть  WPARAM  и   LPARAM,
где WPARAM будет содержать всегда 123 так как мы это указали в функции иннициализации.
а LPARAM будет собержать сообщения мыши.

Немного забегая вперед добавим переменную которая будет отвечать за видимость окна
Для этого  выбирая клас CMainFrame  добавляем в него переменную которая будет
для этого предназначена.

Так как окно может иметь только два состояния т.е. быть либо видимо либо невидимо
мы подумали и я решил что int вполне хватит.

Теперь нам надо отредактировать нашу немеряную функцию обработки сообщений от иконки
Щелкаем два раза по имени функции и пишем:

LRESULT CMainFrame::OnNotifyIvent(WPARAM wParam, LPARAM lParam)
{
//если событие это двойной щелчок мыши то делаем свое черное дело
if(lParam==WM_LBUTTONDBLCLK)
{
 if(visible) {CMainFrame::ShowWindow(SW_HIDE);visible=false;}
//а именно если окно было видимо до этого мы его прячем
 else {CMainFrame::ShowWindow(SW_SHOW);visible=true;}}
//а если не было видимо мы его показываем
return 0;
//не забываем хоть что нибудь возвращать вызывающему процессу
}

Но и это еще не все ( елкии палки ) Надо еще ручками отредактировать карту сообщений.
но на самом деле это просто.

Карта сообщений находиться прямо над конструкором класа CMainFrame()
т. е. кликнум мшкой по  CMainFrame() и прокрутив десять строчек вверх,
увидим следующее :

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
     //{{AFX_MSG_MAP(CMainFrame)
         ON_WM_CLOSE()
     //}}AFX_MSG_MAP
 END_MESSAGE_MAP()

Нам  же надо добавить одну строчечку следующего содержания :
 ON_MESSAGE(WM_USER + 222,CMainFrame::OnNotifyIvent)
чтобы получилась картина показаная на рисунке выше.

Особое внимание хочу обратить на то что если добавить такую строку в карту
сообщений любого другого класса даже в карту сообщений класа-приложения
работать ничего не будет.

* Дальше осталась проблемка с тем что иконку надо убирать после себя, хотя конечно и не
обязательно - сама уберется потом...
но если есть такое желание то необходимо вызвать ту же функцию  Shell_NotifyIcon
тольто с первым параметром NIM_DELETE.
Для этого в класс CMainFrame надо добавить функцию OnClose:
становимся на клас после щелчка правой кнопкой мыши выбираем
Add Windows Message Handler

из выпавшего списка выбираем WM_CLOSE и дважды щелкнув по нему переходим к
редактированию кода:

void CMainFrame::OnClose()
{
 NOTIFYICONDATA nData;
 HICON hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

 nData.cbSize= sizeof(nData);
 nData.hIcon = hIcon;
 nData.hWnd = m_hWnd;
 nData.uID = 123;
 nData.uCallbackMessage = WM_USER+222;
 nData.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
 sprintf(nData.szTip,"this is a tip");
 
 Shell_NotifyIcon(NIM_DELETE ,&nData);
//если обратите внимание все действия абсолютно такие-же как и вначале только
//первый параметр заменяется на NIM_DELETE вместо NIM_ADD
 CFrameWnd::OnClose();
}


 

Вместо заключения.
* Вот собственно и все,в качестве напутствия ставшего постоянным
очень рекомендую почитать MSDN по поводу всех примененных здесь функций
С проектами на базе диалоговх окон все почти также только еще легче.

Пример можно скачать и посмотреть здесь,
С наилучшими пожеланиями Денис Козлов.  kozloff@dviyka.odessa.net