Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
каркас.doc
Скачиваний:
58
Добавлен:
03.06.2015
Размер:
1.6 Mб
Скачать

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