Данный пример представляет собой небольшую
программку, при запуске которой, в строке статуса
(там где в Windows показывается время) появляется
иконка, которая может обрабатывать различные
события, такие как двойное нажатие мышкой, и
нажатие правой кнопкой на иконке.
Соответственно в зависимости от события, главный
модуль программы выполняет определённые
действия (открытие всплывающего меню либо
открытие различных диалоговых окон и т.д.)
Исходный
текст был откомпилирован в Visual C++ 4.2. Выбор
данного компилятора ни чем не обоснован, просто
мне удобно в нём работать, вот и всё.
А теперь по-порядку. Сразу представлю исходный
код , а в конце подробно его прокомментирую.
В самом начале идёт обязательное включение
Виндузовых заголовков (как и в любой программе
под Windows. Далее я объявляю используемые в
программе функции. Обычно такое объявление
делается в файле-заголовке (.h) , но когда функций
не так много, то я обычно эти описания вставляю в
главный файл. Описание главной функции WinMain
не нужно добавлять.
Далее идёт определение
идентификатора сообщения (#define WM_NOTIFYICONMSG (WM_USER
+ 2)), которое будет поступать от иконки.
Впринципе этому идентификатору можно приствоить
любое число, но чтобы быть уверенным, что такое
число не используется каким-нибудь другим
идентификатором, обычно присваивают WM_USER + n
, где n - любое число.
Далее идёт основная функция, с которой начинает
работать данная программа. Вообще-то в разных
версиях API данная функция описывается по-разному.
Например в API 16 её описание начинается с
дескриптора PASCAL, но в API 32 - это WINAPI.
Следующим шагом программа создаёт окно, но не
простое, а невидимое. То есть запущенная
программа не будет видна в панели задач. Вообще
процесс создания окна в Windows состоит из двух
шагов. Первый ( RegisterClassEx(&wndclass) )- это
регистрация класса окна в системе, и второй ( hWnd=CreateWindow(....
)- создание непосредственно окна. Параметр wndclass.lpfnWndProc
= (WNDPROC)WndProc; указывает классу окна, что все
сообщения, поступающие окну будут
обрабатываться функцией WndProc. Все
описания данных функций и их входных параметров
Вы можете найти во многих книгах по
программированию в API 32, поэтому здесь я не буду
отвлекаться на эти вопросы.
Далее вызывается функция AddStatusIcon(hWnd, NIM_ADD)
, задача которой заключается в том, чтобы
нарисовать в панели статуса нужную иконку.
Параметр hWnd означает, что все сообщения
(...нажатия на ней мышкой...) от иконки будут
передаваться главному окну нашей программы.
Параметр NIM_ADD указывает функции, что
иконка будет добавлена в статус-бар. Этот
параметр может принимать значение NIM_MODIFY,
означающий, что уже существующая иконка будет
изменена или будет изменена её информационная
надпись, которая появляется при навидении на
иконку мышкой.
И наконец функция WinMain завершается
бесконечным циклом, задача которого
обрабатывать сообщения, поступающие главному
окну. Естевственно этот цикл не такой уж и
бесконечный, при поступлении определённых
сообщений (например WM_CLOSE ) цикл может
звершиться, и соответственно завершится сама
программа. Например, если послать окну сообщение WM_DESTROY
, то функция обработки оконных сообщений ( WndProc
) вызовет WndProc_OnDestroy , и наша программа
завершит свою работу в системе. Соответственно
при создании окна окно получает сообщение WM_CREATE
и оконная функция вызывает WndProc_OnCreate().
Ещё можно добавить, что все неопознанные
сообщения, или те, для которых Вы не
предусмотрите обработчики сообщений
напрвляются DefWindowProc(hWnd, msg, wParam, lParam) ,
вызов каторой находится в конце WndProc.