Введение в программирование с помощью api☛Уроки программирования ✎ |
Стандартные классы окон и их типы
Все, что видит пользователь на экране в системе WINDOWS является окном. Окно - это графическая оболочка, за которой программа может общаться с пользователем. Если программе не нужно общаться, то она может и не создавать окон. Окно может владеть набором других окон, называемых дочерними.
Каждое окно имеет как определенный набор параметров, так и может отличаться определенной спецификой общения с пользователем. Такие специфические особенности называются классом окна. Существуют стандартные классы, например, окно-кнопка, окно для ввода текста, окно-подсказка и другие, которые вы найдете в лабораторной работе. Каждый нормальный рейтинг имеет уникальное название, которая действительна для всех версий операционных систем WINDOWS.
Окно создается с помощью специальной функции CreateWindowExA. В параметрах этой функции указывается следующая информация:
* Указатель на MDI - структуру (или 0);
* Хэндли программы (приобретается функцией GetModuleHandle);
* Хэндли меню или дочернего окна (или 0);
* Хэндли окна-владельца (или 0);
* Высота окна;
Ширина окна;
* Координата Y;
* Координата X;
* Флаги стиля окна (см. далее);
* Указатель на название окна (или 0);
* Указатель на название класса (см. далее);
* Флаги свойств окна (см. далее).
Управлять окном можно с помощью внутреннего механизма WINDOWS, базирующийся на понятии сообщения (в программе обозначено WM_ ...). Итак, окно - это такой объект WINDOWS, который помимо текстово-графической информации может принимать и передавать специальные структуры данных, которые называются сообщениями. Структура каждого сообщения стандартна и состоит из следующих переменных:
MsHWND dd 0; хэндл окна, процедура которого получила сообщения;
msMESSAGE dd 0; код сообщения (каждая событие имеет свой);
msWPARAM dd 0; дополнительный параметр 1 (зависит от события);
msLPARAM dd 0; дополнительный параметр 2 (зависит от события);
msTIME dd 0; время, когда было посланное сообщение;
ptX dd 0; координата X мыши, когда посылалось сообщение;
ptY dd 0; координата Y мыши, когда посылалось сообщение.
Сообщение сигнализирует о некоторой событие в системе или в окне, например, иссяк время таймера, пользователь нажал клавишу, отпустил клавишу задвигал мышь, щелкнул кнопкой, и другие.
Чтобы отправить сообщение в произвольного окна (например, чтобы изменить его размер) необходимо заполнить эту структуру данных и воспользоваться функцией SendMessageA, а для приема сообщения от определенного окна необходимо указать диапазон приема, хэндл окна и адрес структуры сообщения и воспользоваться функцией GetMessageA. Когда сообщение поступит, операционная система сама заполнит все данные структуры.
С каждым стандартным классом окна связана определенная оконная стандартная процедура WndProc, которая рисует окно и обрабатывает все сообщения, поступающие в окно. Программист имеет возможность вставить в оконную процедуру свой фрагмент программы. Такие действия называются субкласуванням.
Именно идеей субкласування можно объяснить отделения процессов создания окна, цикла приема и их обработку в виде оконной процедуры. Для этого же каждая оконная процедура получает параметры через стек по одинаковому стандарту независимо от класса и типа окна. Этот стандарт не зависит даже от версии WINDOWS:
Hwnd / / хэндл окна, которое получило сообщение;
UMsg / / код сообщения;
Wparam / / первый параметр сообщения;
Lparam / / второй параметр сообщения;
Дочерние окна: их образования и взаимодействие, графический контекст.
Дочерние окна - это окна типа "WS_CHILD", которые существуют для отображения вспомогательных органов управления или справки. Основным свойством этих окон является то, что они не имеют меню и не могут быть всплывающими окнами (WS_POPUP). Дочерние окна, как и все окна, создаются функциями API, имеющие в названии морфологический корень "CreateWindow". При создании дочернего окна в параметрах обязательно указывается его владелец а также стиль "WS_CHILD". Параметр, содержащий для обычных окон хэндл меню, определяет идентификатор дочернего окна, который передается в родительское окно качестве параметра сообщение "WM_NOTIFY". Это сообщение является основным для дочерних окон, и всегда передается в родительское окно, если в дочернем возникают любые события. Кроме этого, каждый тип дочернего окна имеет свой собственный набор сообщений, которые дают дополнительную информацию об этих событиях.
Управлять дочерними окнами можно так же, как и обычными окнами, например, посылая к ним сообщения функцией SendMessageA. В следующей программе дочернему окну класса msctls_trackbar32 после его создания направляется уведомление TBM_SETRANGE для установления количества делений до 255 (находится в старшем слове параметра сообщения).
Каждое окно, в том числе и дочернее, имеет специальную управляющую структуру данных, которая называется графическим контекстом. Она отвечает за графические свойства окна, например, при выводе текста, линий или фона. Для получения графического контекста окна используется функция GetDC. Эта функция напоминает открытия файла: пока файл открыт, изменить его может только тот процесс, который находится в данном кодовом сегменте.
Каждая графическая операция использует графический контекст качестве параметра. Драйвер принтера также обеспечивает графический контекст, поэтому те же графические операции могут выводить данные или в окно, или на принтер. Графический контекст содержит также информацию о шрифте, с которым работают графические функции (в данной программе - функция TextOutA).
Следующую программу необходимо запустить чтобы лучше понять взаимодействие между дочерним и основным окном. Перед тем, как копировать ее внимательно просмотрите комментарии.
Продолжение статьи: ч.1 Продолжение статьи: ч.2 Продолжение статьи: ч.3 Продолжение статьи: ч.4 Продолжение статьи: ч.5 Продолжение статьи: ч.6 Продолжение статьи: ч.7
Другие материалы по теме:
- Использование языков и сред программирования как средств обучения- Eclipse
- Средства доступа к базам данных
- Способы описания алгоритмов
- Интегрированная программная среда поддержки дистанционного обучения «МатЛог»
