- •Московская финансово-промышленная академия
- •Содержание
- •Глава 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. Линейки прокрутки
5.2. Модальные диалоги: обработка сообщений
Диалог является окном (точнее, специальным типом окна). Все события внутри диалога передаются программе посредством механизма сообщений, как это делается и в главном окне. Однако сообщения диалога не передаются в функцию главного окна программы. Для создаваемого диалога необходимо определить собственную функцию, которая называется функцией диалога или оконной функцией диалога. Эта функция должна иметь следующий прототип (конечно, имя функции Вы можете выбрать сами):
BOOL CALLBACK DFunc(HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam);
Как видите, функция диалога имеет те же параметры, что и оконная функция. Вместе с тем она отличается от оконной функции и типом возвращаемого значения – она возвращает одно из значений: истина или ложь. Как и оконная функция, функция диалога может принимать и обрабатывать множество сообщений. Если сообщение обрабатывается диалоговой функцией, возвращаемое значение должно быть TRUE, в противном случае – FALSE.
Каждому элементу управления в диалоге присваивается собственный идентификатор. При воздействии пользователя на элемент управления в диалоговую функцию посылается сообщение, содержащее идентификатор этого элемента и тип действия пользователя. Диалоговая функция анализирует эту информацию и выполняет соответствующие действия. Этот процесс выполняется параллельно с обработкой сообщений в оконной функции.
5.3. Активизация и создание простейшего диалога
Чтобы активизировать модальный диалог (отобразить его на экране), необходимо вызвать функцию API DialogBox(), которая имеет прототип:
int DialogBox(HINSTANCE hThisInst, LPCSTR lpName,
HWND hwnd, DLGPROC lpDFunc);
Здесь hThisInst – это дескриптор текущего приложения, передаваемый в функцию WinMain() в качестве параметра.
Указатель на имя диалога, определенное в файле ресурсов, передается в параметре lpName. Параметр hwnd должен содержать дескриптор окна, порождающего диалог, a lpDFunc должен быть указателем на диалоговую функцию.
Первый простейший диалог, который мы создадим, будет содержать три кнопки – Красный, Зеленый и Сброс. При нажатии кнопки Красный или Зеленый на экране должно появляться окно сообщения, подтверждающее нажатие кнопки. При нажатии кнопки Сброс диалог будет закрыт.
Главное окно программы должно иметь меню, содержащее три команды: Диалог 1, Диалог 2 и Помощь. Создаваемый диалог должен открываться по команде Диалог 1. Команда Диалог 2 при этом резервируется, так что Вы по мере работы с примерами можете определить для нее собственный диалог.
Хотя примеры, приведенные в этой главе, небольшие, они иллюстрируют основные возможности, которые Вы можете использовать в своих приложениях при создании диалогов.
5.4. Определение ресурсов диалога
Диалог использует еще один вид ресурсов, описываемых в файле ресурсов. При написании программы работы с диалогом Вам потребуется файл ресурсов, описывающий этот диалог. Хотя содержимое диалога можно описать с помощью обычного текстового редактора, как это делалось с меню, такой подход используется редко. Большинство программистов прибегают к помощи редактора диалогов. В основном это обусловлено тем, что определения ресурсов диалога включают в себя координаты элементов управления относительно окна диалога, так что лучше применять специальные инструменты, позволяющие размещать эти элементы в интерактивном режиме. Тем не менее поскольку RC-файлы в примерах этой главы имеют текстовый формат, их можно вводить как обычный текст. Для создания собственных диалогов Вы можете использовать редактор диалогов.
Поскольку на практике большинство диалогов создаются при помощи редактора диалогов, ниже дается только краткое описание ресурсов для диалогов, используемых в примерах.
Ресурсы для диалогов задаются оператором DIALOG, который имеет вид:
ИмяДиалога DIALOG [DISCARDABLE] X, Y, Width, Height
Параметры
{
Элементы диалога
}
ИмяДиалога является именем ресурса, который используется диалогом. Координаты верхнего левого угла диалога задаются значениями X и Y, а значения Width и Height определяют его размеры. Если диалог может быть удален из памяти, если он не используется, его следует определить как DISCARDABLE. Для диалога можно задать один или несколько параметров. Два из них определяют заголовок и стиль окна диалога. Элементы диалога определяют элементы управления, содержащиеся в диалоге.
Приведенный ниже файл ресурсов определяет диалог, который будет использоваться в первом примере. В этом файле содержатся описания меню, используемого для вызова диалога, таблицы акселераторов для меню и собственно диалога. Введите этот файл и назовите его Mydialog.rc.
// Пример файла ресурсов, описывающего меню и диалог
#include "Mydialog.h"
#include <Windows.h>
MYMENU MENU
{
MENUITEM "Диалог &1", IDM_DIALOG1
MENUITEM "Диалог &2", IDM_DIALOG2
MENUITEM "Помощь", IDM_HELP
}
MYMENU ACCELERATORS
{
VK_F2, IDM_DIALOG 1, VIRTKEY
VK_F3, IDM_DIALOG2, VIRTKEY
VK_Fl, IDM_HELP, VIRTKEY
}
MYDB DIALOG 18, 18, 142, 92
CAPTION "Первый диалог"
STYLE DS_MODALFRAME|WS_POPUP|WS_CAPTION|WS_SYSMENU
{
DEFPUSHBUTTON "Красный", IDD_RED, 32, 40, 36, 14,
WS_CHILD|WS_VISIBLE|WS_TABSTOP
PUSHBUTTON "Зеленый", IDD_GREEN, 74, 40, 36, 14,
WS_CHILD|WS_VISIBLE|WS_TABSTOP
PUSHBUTTON "Сброс", IDCANCEL, 52, 65, 37, 14,
WS_CHILD|WS_VISIBLE|WS_TABSTOP
}
В этом файле определяется диалог MYDB с координатами верхнего левого угла в точке 18, 18, шириной 142 и высотой 92. Строка символов после CAPTION задает заголовок диалога. Оператор STYLE определяет тип окна для создаваемого диалога. Некоторые широко используемые стили, включая и те, которые применяются в данной главе, приведены в таблице 5.1. Их можно комбинировать, используя операцию логического сложения, чтобы получить нужный тип окна. Эти стили могут частично использоваться также элементами управления и другими окнами.
Таблица 5.1