- •Московская финансово-промышленная академия
- •Содержание
- •Глава 1. Модель программирования приложений
- •1.1. Потребительские свойства Windows
- •1.2. Процессы в Windows и потоковая многозадачность
- •1.3. Динамические библиотеки
- •1.4. Программное обеспечение для создания Win-приложений
- •Спецификация префиксов венгерской нотации
- •Глава 2. Обзор возможностей программирования
- •2.1. Общий взгляд на программирование в Windows
- •2.2. Взаимодействие Windows с программой
- •2.3. Win32 api: прикладной интерфейс для Windows
- •2.4. Компоненты окна
- •2.5. Основы приложений Windows
- •2.6. Каркас приложения Windows
- •2.7. Определение класса окна
- •Значения параметра lpszName
- •Наиболее употребляемые макросы для встроенных курсоров
- •Типы системных кистей
- •2.8. Создание окна
- •Наиболее распространенные стили
- •Параметры способа отображения nHow
- •2.9. Цикл обработки сообщений
- •2.10. Оконная функция
- •Типы префиксов
- •Глава 3. Обработка сообщений Windows
- •3.1. Что такое сообщения?
- •3.2. Обработка нажатая клавиш
- •Битовая карта lParam
- •3.3. Обработка сообщений wm_paint
- •3.4. Обработка сообщений «мыши»
- •3.5. Генерация сообщения wm_paint
- •3.6. Генерация сообщений таймера
- •Глава 4. Ресурсы и меню
- •4.1. Окна сообщений MessageBox
- •Значения функции MessageBox
- •Значения wMbType
- •4.2. Представляем меню
- •4.3. Использование ресурсов
- •Параметры menu
- •Параметры элементов меню
- •4.4. Включение меню в программу. Обработка команд
- •4.5. Включение акселераторов сменю
- •4.6. Загрузка таблицы акселераторов
- •Глава 5. Создание диалогов
- •5.1. Взаимодействие Win-диалогов с пользователем
- •5.2. Модальные диалоги: обработка сообщений
- •5.3. Активизация и создание простейшего диалога
- •5.4. Определение ресурсов диалога
- •Стили диалога
- •5.5. Оконная функция диалога
- •5.6. Основы работы со списками
- •Типы сообщений
- •5.7. Инициализация списка и выбор элементов
- •5.8. Окно ввода
- •5.9. Использование немодального диалога
- •Глава 6. Графические образы, иконки и курсоры
- •6.1. Иконка и курсор
- •6.2. Определение малой иконки
- •6.3. Работа с растровыми изображениями
- •Значения параметра dwRaster
- •6.4. Работа с несколькими растровыми изображениями
- •Глава 7. Более подробно об элементах управления
- •7.1. Работа с контрольными переключателями
- •7.2. Статические элементы
- •7.3. Работа с селекторными кнопками
- •7.4. Линейки прокрутки
Наиболее распространенные стили
№ |
Макрос |
Свойство |
1 |
WS_OVERLAPPED |
Стандартное окно с рамкой |
2 |
WS_MAXIMIZEBOX |
Наличие кнопки развертки |
3 |
WS_MINIMIZEBOX |
Наличие кнопки минимизации |
4 |
WS_SYSMENU |
Наличие системного меню |
5 |
WS_HSCROLL |
Наличие горизонтальной панели прокрутки |
6 |
WS_VSCROLL |
Наличие вертикальной панели прокрутки |
Наконец, параметр hThisInst должен представлять дескриптор текущего экземпляра приложения.
Когда окно создано, оно еще не отображается на экране. Для того чтобы отобразить окно, следует вызвать функцию API ShowWindow():
BOOL ShowWindow(HWND hwnd, int nHow).
Параметр hwnd задает дескриптор окна, которое должно быть отображено, а параметр nHow – способ отображения. Когда окно в первый раз должно отобразиться на экране, в качестве nHow можно использовать значение параметра nWinMode функции WinMain(), поскольку это значение определяет, как окно должно отображаться в начале выполнения программы. Можно также использовать значения из таблицы 2.5.
Таблица 2.5
Параметры способа отображения nHow
№ |
Макрос |
Эффект |
1 |
SW_HIDE |
Скрыть окно (окно не отображается) |
2 |
SW_MAXIMIZE |
Развернуть окно до полноэкранного представления |
3 |
SW_MIINIMIZE |
Свернуть окно до иконки |
4 |
SW_RESTORE |
Отобразить окно в нормальном представлении |
Функция ShowWindow() возвращает ненулевое значение, если до ее вызова окно было отображено на экране.
Хотя это и не вызвано необходимостью, вызов функции UpdateWindow() включен в каркасную программу, поскольку этот вызов требуется практически для всех приложений Windows.
Вызов UpdateWindow() означает немедленную перерисовку окна, и Windows в этом случае направляет программе сообщение, указывающее на необходимость перерисовки (это сообщение рассматривается в следующей главе).
2.9. Цикл обработки сообщений
Последней частью программы WinMain() является цикл обработки сообщений. Такой цикл содержится во всех приложениях для Windows. Его целью является получение и обработка сообщений, передаваемых операционной системой. Эти сообщения ставятся в очередь сообщений приложения, откуда они затем (по мере готовности программы) выбираются функцией API GetMessage():
BOOL GetMessage(LPMSG msg, HWND hwnd,
UINT min, UINT max) .
Выбираемые из очереди сообщения сохраняются в структуре, указатель на которую представляет параметр msg. Все сообщения Windows имеют структуру типа MSG, определяемую следующим образом:
// Структура сообщения
typedef struct tagMSG
{
HWND hwnd; // Окно для направленного сообщения
UINT message;// Собственно сообщение
WPARAM wParam; // Дополнительная информация
LPARAM lParam; // к сообщению
DWORD time; // Время посылки сообщения
POINT pt; // Положение курсора мыши
} MSG;
В поле hwnd структуры MSG записывается дескриптор окна, которому адресовано сообщение; тип сообщения записывается в 32-разрядное поле message, а дополнительная информация (параметры сообщения) – в поля wParam и lParam. Типы WPARAM и LPARAM определены при помощи typedef соответственно как UINT и LONG.
Время посылки сообщения записывается в поле time в миллисекундах. Поле pt содержит координаты курсора мыши в момент посылки сообщения. Структура POINT, в которую записываются эти координаты, определяется так:
typedef struct tagPOINT
{
LONG x,y;
} POINT;
Если очередь сообщений приложения пуста, вызов GetMessage() возвратит управление Windows. (Более детально сообщения рассматриваются в следующей главе.)
Параметр hwnd функции GetMessage() определяет окно, которому направляется получаемое сообщение. Возможно, и даже скорее всего, Ваше приложение будет содержать несколько окон, а Вы захотите получать сообщения, адресованные только одному фиксированному окну. Если же Вы хотите получать все сообщения, адресованные Вашему приложению, параметр hwnd должен быть равен NULL.
Остальные два параметра функции GetMessage() определяют диапазон получаемых сообщений. Чаще всего Вам нужно будет получать все сообщения. Для этого параметры min и max должны быть равны 0, как это сделано в каркасной программе.
GetMessage() возвращает нуль, когда пользователь завершает программу. Иначе возвращается ненулевое значение.
Внутри цикла обработки сообщений вызываются две функции. Вначале вызывается функция API TranslateMessage(), которая транслирует виртуальные коды клавиш, генерируемые Windows, в клавиатурные сообщения. (Виртуальные коды клавиш рассматриваются в гл. 4.) Хотя это и не является необходимым, большинство приложений вызывают TranslateMessage(), поскольку это позволяет использовать в программе ввод с клавиатуры.
Когда сообщение прочитано и преобразовано, функция API DispatchMcssage() возвращает его обратно к Windows. Windows хранит это сообщение до тех пор, пока оно не будет послано оконной функции приложения.
Когда цикл обработки сообщений завершается, функция WinMain() также заканчивается, возвращая значение msg.wParam . Это значение будет кодом возврата программы.