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

Стили диалога

Стиль

Эффект

1

DS_MODALFRAME

Создание модального диалога

2

WS_BORDER

Создание окна с рамкой

3

WS_CAPTION

Создание окна с заголовком

4

WS_CHILD

Создание дочернего окна

5

WS_MAXIMIZEBOX

Окно с кнопкой полноэкранного представления

6

WS_MINIMIZEBOX

Создание окна с кнопкой минимизации

7

WS_SYSMENU

Создание окна с системным меню

8

WS_TABSTOP

Возможность циклического выбора элемента нажатием клавиши табуляции

9

WS_VISIBLE

Отображение окна при активизации

10

WS_POPUP

Создание всплывающего окна

В диалоге MYDB определены три кнопки. Первая из них является выбранной по умолчанию, т.е. она автоматически выделяется при открытии диалога. Общий вид определения кнопки в диалоге:

PUSHBUTTON "строка", ID, X, Y, Width, Height[, стиль]

Здесь строка – это текст на кнопке, ID – идентификатор кнопки. Это значение передается в Вашу программу при нажатии данной кнопки. Значение X и Y опреде­ляют координаты верхнего левого угла, a Width и Height – размеры кнопки соответ­ственно по горизонтали и вертикали. Стиль определяет тип кнопки. Если необходимо определить кнопку как активную по умолчанию, следует использовать оператор DEFPUSHBUTTON. Он имеет те же параметры, что и оператор PUSHBUTTON.

В нашем примере используется также файл описаний Mydialog.h. Введите его:

#define IDM_DIALOG1 100

#define IDM_DIALOG2 101

#define IDM_HELP 102

#define IDD_RED 103

#define IDD_GREEN 104

5.5. Оконная функция диалога

О всех событиях, происходящих в диалоге, передаются сообщения в функцию, связанную с этим диалогом (а не в функцию главного окна). Приведенная ниже функция диалога обрабатывает сообщения, связанные с диалогом MYDB:

// Простая функция диалога

BOOL CALLBACK DialogFunc (HWND hdwnd,

UINT message,

WPARAM wParam,

LPARAM lParam)

{

switch(message)

{

case WM_COMMAND:

switch(LOWORD(wParam))

{

case IDCANCEL:

EndDialog(hdwnd,0);

return 1;

case IDD_RED:

MessageBox(hdwnd,

"Выбран Красный",

"Красный",МВ_ОК);

return 1;

case IDD_GREEN:

MessageBox(hdwnd,

"Выбран Зеленый",

"Зеленый",МВ_ОК);

return 1;

}

}

return 0;

}

Каждый раз при воздействии на элемент управления диалога в функцию DialogFunc() поступает сообщение WM_COMMAND, в котором LOWORD(wParam) содер­жит идентификатор этого элемента управления.

Функция DialogFunc() обрабатывает три командных сообщения, которые могут генерироваться в нашем диалоге. При нажатии кнопки Сброс сообщение содержит идентификатор IDCANCEL, и диалог завершится посредством вызова функции API EndDialog(). Идентификатор IDCANCEL является стандартным идентификатором, определенным в Windows.h.

Функция EndDialog() имеет следующий прототип:

BOOL EndDialog(HWND hwnd, int nStatus);

Параметр hwnd является дескриптором окна диалога, a nStatus содержит значение, возвращаемое функцией DialogBox(). Это значение может игнорироваться, если программа его не использует. Функция EndDialog() возвращает ненулевое значение при успешном завершении и нулевое в противном случае. Обычно эта функция завершается успешно.

Нажатие двух других кнопок вызывает появление окна сообщения, подтверждаю­щего нажатие соответствующей кнопки.

Пример 5-1. Ниже приводится полный текст программы с описанием диалога. В начале выполнения профаммы открывается окно, содержащее меню. При выборе команды Диалог 1 открывается диалог. После этого нажатие кнопок в диалоге вызывает соответствующую реакцию. Это отражено на рис. 5.1.

// Демонстрация модального диалога

#include <Windows.h>

#include <String.h>

#include <Stdio.h>

#include "Mydialog.h"

LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM); BOOL CALLBACK DialogFunc(HWND,UINT,WPARAM,LPARAM);

char szWinName[] = "МоеОкно"; // Имя класса окна

HINSTANCE hInst;

int WINAPI WinMain(HINSTANCE hThisInst,

HINSTANCE hPrevInst,

LPSTR lpszArgs,

int nWinMode)

{

HWND hwnd;

MSG msg;

WNDCLASS wcl;

HACCEL hAccel;

// Определение класса окна:

wcl.hInstance=hThisInst; // Дескриптор приложения

wcl.lpszClassName=szWinName; // Имя класса окна

wcl.lpfnWndProc=WindowFunc; // Функция окна

wcl.style=0; // Стиль по умолчанию

wcl.hIcon=LoadIcon(NULL,IDI_APPLICATION); // Иконка

wcl.hCursor=LoadCursor(NULL,IDC_ARROW); // Курсор

wcl.lpszMenuName="MYMENU"; // Меню

wcl.cbClsExtra=0; // Без дополнительной

wcl.cbWndExtra= 0; // информации

// Определить заполнение окна белым цветом

wcl.hbrBackground=

(HBRUSH)GetStockObject(WHITE_BRUSH);

// Зарегистрировать класс окна

if(!RegisterClass(&wcl))

return 0;

// Создать окно

hwnd=CreateWindow(szWinName, // Имя класса

"Диалоги", // Заголовок

WS_OVERLAPPEDWINDOW, // Стиль

CW_USEDEFAULT, // Х-координата

CW_USEDEFAULT, // Y-координата

CW_USEDEFAULT, // Ширина

CW_USEDEFAULT, // Высота

HWND_DESKTOP, // Нет родит. окна

NULL, // Нет меню

hThisInst, // Дескрип. приложения

NULL); // Без дополн. аргументов

hInst=hThisInst; // Сохранить дескриптор приложения

// Загрузить акселераторы:

hAccel=LoadAccelerators(hThisInst,"MYMENU");

// Показать окно и перерисовать содержимое:

ShowWindow(hwnd,nWinMode);

UpdateWindow(hwnd);

// Запустить цикл обработки сообщений:

while(GetMessage(&msg,NULL,0,0))

{

if(!TranslateAccelerator(hwnd,hAccel,&msg))

{

TranslateMessage(&msg); // Использ. клавиатуру

DispatchMessage (&msg); // Вернуться к Windows

}

}

return msg.wParam;

}

// Следующая функция вызывается операционной системой

// Windows и получает в качестве параметров сообщения // из очереди сообщений данного приложения

LRESULT CALLBACK WindowFunc (HWND hwnd,

UINT message,

WPARAM wParam,

LPARAM lParam)

{

switch(message)

{

case WM_COMMAND: // Обработка команд

switch(LOWORD(wParam))

{

case IDM_DIALOG1:

DialogBox(hInst,"MYDB",hwnd,

DialogFunc);

break;

case IDM_DIALOG2:

MessageBox(hwnd,

"Этого диалога пока нет","",

MB_OK);

break;

case IDM_HELP:

MessageBox(hwnd,

"Помощь","Помощь",

MB_OK) ;

break;

}

break;

case WM_DESTROY: // Завершение программы

PostQuitMessage(0);

break;

default:

// Все сообщения, не обрабатываемые в данной

// функции, направляются на обработку по

// умолчанию

return DefWindowProc(hwnd, message,

wParam, lParam);

}

return 0;

}

// Простая функция диалога

BOOL CALLBACK DialogFunc (HWND hdwnd,

UINT message,

WPARAM wParam,

LPARAM lParam)

{

switch(message)

{

case WM_COMMAND: // Обр-ка командных сообщений

switch(LOWORD(wParam))

{

case IDCANCEL:

EndDialog(hdwnd,0);

return 1;

case IDD_RED:

MessageBox(hdwnd,

"Выбран Красный",

"Красный", MB_OK);

return 1;

case IDD_GREEN:

MessageBox(hdwnd,

"Выбран Зеленый",

"Зеленый", MB_OK);

return 1;

}

}

return 0;

}

Рис. 5.1. Результаты работы программы с диалогом

Обратите внимание на внешнюю переменную hInst. Эта переменная содержит дескриптор текущего экземпляра приложения. Ее существование обусловлено тем, что при создании диалога требуется дескриптор приложения.

Поскольку диалог создается не в WinMain(), а в WindowFunc(), необходима копия дескриптора приложения, доступная извне WinMain().