Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
При создании суперкласса новый класс основывается на существующем, и запоминается адрес старой оконной процедуры. Для создания суперкласса приложение получает информацию о существующем классе с помощью функции GetClassInfo, запоминает адрес старой оконной процедуры, затем модифицирует полученную структуру WNDCLASS и использует ее при вызове RegisterClass. Сообщения, не обрабатываемые новой оконной процедурой, должны передаваться в старую.
Используемые термины похожи на термины объектно-ориентированного программирования, но отличаются от них по смыслу. Не надо путать оконный класс с понятием класса в Си++ (например, с классами библиотеки MFC). Понятие оконного класса было введено в Windows несколькими годами раньше, чем в этой ОС распространились объектно-ориентированные языки.
2.3 Типы сообщений
Сообщения приходят от разных источников, информируя окна о событиях на различных уровнях ОС. Действия, которые для пользователя могут выглядеть примитивными, на системном уровне могут сопровождаться большим количеством различных сообщений. В качестве примера в табл. 1.1 приведен протокол сообщений, получаемых диалоговым окном при закрытии по нажатию кнопки OK. Этот протокол получен с помощью утилиты Spy++.
Приложение может обрабатывать не все сообщения, а только некоторые. Необработанные сообщения передаются обработчику сообщений "по умолчанию" в ОС.
Таблица 1.1. Сообщения, посылаемые окну "О программе" приложения MS Word при закрытии окна по нажатию пользователем кнопки OK.
Символич. идентификатор | Описание |
WM_LBUTTONDOWN | Была нажата левая кнопка мыши. |
WM_PAINT | Требуется перерисовать кнопку OK, т. к. она теперь нажата. |
WM_LBUTTONUP | Левая кнопка мыши была отпущена. |
WM_PAINT | Требуется перерисовать кнопку OK, т. к. она теперь отпущена. |
WM_WINDOWPOSCHANGING | Положение окна на экране собирается изменяться. |
WM_WINDOWPOSCHANGED | Положение окна на экране только что было изменено. |
WM_NCACTIVATE | Была активизирована область строки заголовка окна. |
WM_ACTIVATE | Была активизирована клиентская область окна. |
WM_WINDOWPOSCHANGING | Положение окна на экране собирается изменяться. |
WM_KILLFOCUS | У окна будет отключен фокус ввода. |
WM_DESTROY | Окно уничтожается. |
WM_NCDESTROY | Уничтожается область заголовка окна. |
Сообщения в Windows описываются с помощью структуры MSG:
typedef struct tagMSG {
HWND hwnd; // Идентификатор окна-получателя
UINT message; // Идентификатор сообщения
WPARAM wParam; // Дополнительная информация, смысл
LPARAM lParam; // которой зависит от типа сообщения
DWORD time; // Время посылки сообщения
POINT pt; // Местоположение указателя мыши
} MSG;
Переменная hwnd – это уникальный идентификатор окна, которому было послано сообщение. У каждого окна Windows есть свой числовой идентификатор. Переменная message является идентификатором самого сообщения. Различных сообщений в Windows несколько сотен, и у каждого собственный идентификатор. Для удобства вместо численных идентификаторов используются символические (например, WM_PAINT, WM_TIMER). Они определены в стандартных заголовочных файлах Windows (в программы на Си можно включать только файл windows. h; в нем, в свою очередь, содержатся директивы #include для включения остальных файлов).
По назначению системные сообщения можно разбить на несколько групп. Имена сообщений каждой группы начинаются с одинакового префикса, например, WM для сообщений, связанных с управлением окнами или BM – для сообщений от кнопок. Набор системных сообщений не зафиксирован, новые сообщения могут добавляться по мере роста возможностей новых версий ОС.
Чаще всего используются оконные сообщения (WM_...). Эта группа настолько большая, что можно разделить ее еще на несколько категорий. Среди них – сообщения буфера обмена, мыши, клавиатуры, сообщения MDI (многодокументный интерфейс) и многие другие. Деление сообщений на категории условно, т. о. программисту легче классифицировать большой набор сообщений.
Сообщения остальных групп относятся к специфическим типам окон. Есть сообщения, определенные для строк ввода (EM), кнопок (BM), списков (LB), комбинированных списков (CB), полос прокрутки (SBM), деревьев (TVM) и др. Эти сообщения, за редким исключением, обычно обрабатываются оконной процедурой самого элемента управления и не слишком интересны для прикладного программиста.
Кроме системных сообщений, в Windows допускается передача сообщений, определенных приложением. Для получения уникального идентификатора нового сообщения служит функция RegisterWindowMessage. Подобные сообщения часто применяются для взаимодействия между различными частями одного приложения или для обмена информацией между несколькими приложениями.
3. Сообщения и многозадачность
3.1 Процессы и потоки
Многозадачность в Windows обеспечивается посредством выделения квантов времени запущенным в системе потокам. Потоки принадлежат процессам. Одному процессу могут принадлежать несколько потоков. Они обладают правом доступа к памяти и другим ресурсам, принадлежащим этому процессу. Поэтому между потоками одного процесса легче организовать обмен данными и взаимодействие, чем между потоками разных процессов.
В начале работы каждый процесс обладает единственным первичным потоком. Информация о первичном потоке передается ОС в виде адреса функции. Поэтому все Windows-приложения содержат вызываемую при запуске функцию WinMain(), адрес которой и передается в качестве адреса первичного потока. Первичный поток может создать дополнительные потоки, и т. д. Потоки одного процесса имеют доступ ко всем его объектам. Такие потоки отличаются друг от друга лишь точкой входа и локальными переменными, расположенными в адресном пространстве процесса.
Потоки, принадлежащие разным процессам, не имеют между собой ничего общего, однако они могут получить доступ к общим ресурсам и памяти, используя механизмы межпроцессного взаимодействия.
В немногопоточных ОС (например, в большинстве версий UNIX) наименьшая исполняемая системная единица называется задачей или процессом. Алгоритм диспетчеризации задач в ОС переключает эти задачи, т. о., достигается многозадачность в среде двух и более процессов. Если приложению требуется выполнить одновременно несколько действий, то это приложение необходимо разбить на несколько задач (например, с помощью системного вызова fork в UNIX). У этого подхода есть несколько серьезных недостатков: 1) задачи являются ограниченным ресурсом (большинство ОС могут управлять лишь несколькими сотнями одновременно выполняющихся задач); 2) запуск новой задачи требует много времени и системных ресурсов; 3) новая задача не имеет доступа к памяти родительского процесса.
В ОС с многопоточной многозадачностью наименьшей исполняемой единицей является поток, а не процесс. Процесс может состоять из одного или нескольких потоков. Создание нового потока требует немного системных ресурсов; потоки в одном процессе имеют доступ к одному адресному пространству; переключение между потоками одного процесса требует небольших системных затрат.
3.2 Процессы и сообщения
В Windows окна принадлежат потокам. У каждого потока есть собственная очередь сообщений. В нее ОС помещает сообщения для окон данного потока. Очереди разных потоков независимы. Т. о. Windows обеспечивает каждому потоку среду, в которой он может считать себя единственным и самостоятельно управлять фокусом ввода с клавиатуры, активизировать окна, захватывать мышь и т. д.
Поток Windows не обязательно должен владеть окнами и содержать цикл обработки сообщений. Например, рассмотрим некоторое математическое приложение, в котором надо выполнить вычисления с элементами большого двумерного массива (матрицы). Проще всего сделать это с помощью цикла. В Win32 этот цикл можно поместить в отдельный поток, параллельно с которым первичный поток приложения продолжит обработку поступающих сообщений. Поток для вычислений не имеет окон, очереди сообщений и цикла обработки сообщений. При таком подходе приложение не будет выглядеть "зависшим" в течение выполнения вычислений.
Хотя на уровне ОС потоки не делятся на типы, но в библиотеке классов MFC на Си++ они называются и оформляются по разному: рабочие потоки (без окон и обработки сообщений) и потоки пользовательского интерфейса.
4. Вызовы функций Windows API
Приложение обращается к Windows при помощи так называемых системных вызовов. Они составляют интерфейс прикладного программирования (Application Programming Interfaces, API). Для программистов вместо термина "вызов" м. б. удобнее использовать термин "функция". Функции API располагаются в системных динамических библиотеках (DLL). Существуют функции для выделения памяти, управления процессами, окнами, файлами, для рисования графических примитивов и др.
Обращение к функциям API из большинства сред разработки на Си++ осуществляется очень просто, т. к. API специально спроектирован для использования в среде Си/Си++. В текст программы надо включить заголовочный файл, содержащий описания функций API (windows. h) и в процессе компоновки использовать необходимые библиотеки (Visual C++ обычно подключает их автоматически). После этого в текст программы можно включать любые обращения к API.
"Базовый" набор системных вызовов Windows можно разделить на три группы:
· функции модуля KERNEL. DLL (управление процессами, потоками, ресурсами, файлами и памятью);
· функции модуля USER. DLL (работа с пользовательским интерфейсом, например, с окнами, элементами управления, диалогами и сообщениями);
· функции модуля GDI. DLL (аппаратно-независимый графический вывод).
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |


