Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МП 1,2.doc
Скачиваний:
11
Добавлен:
05.11.2018
Размер:
2.77 Mб
Скачать

5.5. Диалоги в системе Windows

Диалог является наиболее важным после меню элементом интерфейса. Диалог – это специальный тип окна, поддерживающий гибкие средства для взаимодействия пользователя с программой.

Элементы управления. Диалог взаимодействует с пользователем через элементы управления, которые тоже являются особыми типами окна, для которых окно диалога служит родительским.

Типы элементов управления:

  • кнопка (button) – изображение кнопки на экране, которую пользователь активизирует щелчком мыши или нажатием клавиши Enter;

  • контрольный переключатель (check box) содержит один или более элементов, часть из которых может быть отключена; отмеченные элементы считаются выбранными;

  • селекторная кнопка (radio button) аналогична контрольному переключателю, но может быть выбран лишь один из элементов;

  • список (listbox) – список строк, из которых пользователь может выбрать одну (или более);

  • окно ввода (edit box) – ввод строки символов с предварительным редактированием;

  • комбинированный список (combo box) – комбинация списка и окна ввода;

  • линейка прокрутки (scrollbar) используется для прокрутки документов в окне;

  • статический элемент (static) предназначен для вывода информации, которая не может быть изменена пользователем.

Модальные и немодальные диалоги. Диалог называется модальным, если программа дожидается завершения этого диалога, и только затем ее выполнение может быть продолжено. Модальный диалог не позволяет также переключить ввод на другие окна, порожденные приложением.

Диалог называется немодальным, если продолжение программы не требует его завершения. При немодальном диалоге разрешается переключаться на другие окна приложения.

Обработка сообщений в диалоге. Сообщения диалога обрабатываются функцией диалога или оконной функцией диалога, имеющей прототип

BOOL CALLBACK Dfunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

отличающейся от оконной функции тем, что она возвращает значения истина или ложь. Каждому элементу управления в диалоге присваивается собственный идентификатор. При воздействии пользователя на элемент управления в диалоговую функцию посылается сообщение, содержащее идентификатор этого элемента и тип действия пользователя. Диалоговая функция анализирует эту информацию и выполняет соответствующие действия.

Активизация диалога. Модальный диалог делается активным с помощью функции

Int DialogBox(hinstance hThisInst,

LPCSTR lpName,

HWND hwnd,

DLGPROC lpDFunc);

где hThisInst – дескриптор текущего приложения, lpName – указатель на имя диалога, определенное в файле ресурсов, hwnd – дескриптор окна, порождающего диалог, lpDFunc – указатель на диалоговую функцию.

Определение ресурсов диалога. Для наглядности содержимое диалога мы будем описывать с помощью текстового редактора, хотя на практике такой подход используется редко, и большинство программистов пользуются редактором диалогов. Ресурсы диалога задаются с помощью оператора:

Имя_Диалога DIALOG[DISCARDABLE] X, Y, Width, Height

Параметры

{

Элементы диалога

}

Координаты левого верхнего угла равны (X, Y), а значения Width и Height задают ширину и высоту диалогового окна. Если диалог может быть удален из памяти, то его необходимо определить как DISCARDABLE. Для диалога задаются один или несколько параметров. Параметр CAPTION определяет заголовок диалога, параметр STYLE – стиль. Элементы диалога определяют элементы управления, содержащиеся в диалоге.

Стиль окна диалога является логической комбинацией стилей:

DS_MODALFRAME - модальный диалог;

WS_BORDER - окно с рамкой;

WS_CAPTION - окно с заголовком;

WS_CHILD - дочернее окно;

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

WS_MINIMIZEBOX - окно с кнопкой минимизации;

WS_SYSMENU - окно с системным меню;

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

WS_VISIBLE - отображение окна при активизации;

WS_POPUP - всплывающее окно.

Пример. Создадим диалог, содержащий три кнопки: Red, Green и Reset. При нажатии кнопок Red и Green на экране появляется сообщение, подтверждающее нажатие кнопки. При нажатии Reset диалог будет закрыт. Диалог содержит также список и окно редактирования (окно ввода). Кнопки определяются с помощью оператора:

PUSHBUTTON “Строка”, ID, X, Y, Width, Height[, Стиль]

Активная по умолчанию кнопка определяется с помощью оператора DEFPUSHBUTTON, имеющего те же самые параметры.

Список задается оператором:

LISTBOX ID, X, Y, Width, Height[, Стиль]

Числовой идентификатор ID предназначен для обработки элемента в функции диалога, координаты X, Y и размеры Width, Height задают расположение окна, стиль является комбинацией стилей, приведенных выше.

Окно ввода определяется с помощью:

EDITTEXT ID, X, Y, Width, Height[, Стиль]

Приведённая ниже программа состоит из файлов mydialog.h, mydialog.rc, mydialog.cpp, содержащих соответственно определения числовых идентификаторов, ресурсов и текста программы. В тексте программы идентификатор списка не обрабатывается. Если ввести данные в окно редактирования, то они будут отображаться в главном окне.

Для завершения модального диалога применяется функция EndDialog(), обрабатывающая сообщение IDCANCEL.

Файл mydialog.h:

#define IDM_DIALOG1 100

#define IDM_DIALOG2 101

#define IDM_HELP 102

#define IDD_RED 103

#define IDD_GREEN 104

#define ID_EB1 400

#define ID_LB1 301

Файл mydialog.rc

#include "mydialog.h"

#include <windows.h>

MYMENU MENU

{

MENUITEM "Dialog &1",IDM_DIALOG1

MENUITEM "Dialog &2",IDM_DIALOG2

MENUITEM "Help",IDM_HELP

}

MYMENU ACCELERATORS

{

VK_F2,IDM_DIALOG1,VIRTKEY

VK_F3,IDM_DIALOG2,VIRTKEY

VK_F1,IDM_HELP,VIRTKEY

}

MYDB DIALOG 18,18,142,92

CAPTION "First Dialog" //заголовок окна

STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE

{

DEFPUSHBUTTON "Конец ввода", IDOK, 68,22, 60,14, //кнопка по умолчанию

WS_CHILD | WS_VISIBLE | WS_TABSTOP

PUSHBUTTON "Red",IDD_RED,32,40,36,14, //кнопка Red

WS_CHILD|WS_VISIBLE|WS_TABSTOP

PUSHBUTTON "Green",IDD_GREEN,74,40,36,14, //кнопка Green

WS_CHILD|WS_VISIBLE|WS_TABSTOP

PUSHBUTTON "Reset",IDCANCEL,52,65,37,14, //кнопка Reset

WS_CHILD | WS_VISIBLE | WS_TABSTOP

EDITTEXT ID_EB1, 68, 8, 72, 12, ES_LEFT | //edifbox

ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER |

WS_TABSTOP

LISTBOX ID_LB1, 2,10,47,28, LBS_NOTIFY | //list box

WS_CHILD | WS_VISIBLE | WS_BORDER |

WS_VSCROLL | WS_TABSTOP

}

Файл mydialog.cpp

Строка вводится в диалоговом окне и отображается в главном окне.

#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;

char str[80];

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,

"Dialogs",

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

CW_USEDEFAULT,

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);

}

}

return msg.wParam;

}

LRESULT CALLBACK WindowFunc(HWND hwnd,

UINT message,

WPARAM wParam,

LPARAM lParam)

{

HDC hdc;

switch(message)

{

case WM_COMMAND: //анализируем выбор

switch (LOWORD (wParam))

{

case IDM_DIALOG1: //выбран пункт Dialog 1

DialogBox(hInst,"MYDB",hwnd,

(DLGPROC)DialogFunc); //вызовем окно диалога

break;

case IDM_DIALOG2: //выбран пункт Dialog2

hdc = GetDC(hwnd);//получить DC

TextOut(hdc,1,1,str,strlen(str)); //вывод

ReleaseDC(hwnd,hdc);//освободить DC

break;

case IDM_HELP: //выбран пункт Help

MessageBox(hwnd,"Help","Help",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)

{

long i; //char str[80];

HDC hdc;

switch(message)

{

case WM_COMMAND:

switch (LOWORD(wParam))

{

case IDCANCEL:

EndDialog(hdwnd,0); //выходим из диалога

return 1;

case IDD_RED: //нажата кнопка Red

MessageBox(hdwnd,"Choice Red","Red",MB_OK);

return 1;

case IDD_GREEN: //нажата кнопка Green

MessageBox(hdwnd,"Choice Green","Green",MB_OK);

return 1;

case IDOK:

GetDlgItemText(hdwnd, ID_EB1, str,80);

MessageBox(hdwnd,str,"In Entry ", MB_OK);

}

return 1;

}

return 0;

}

Ниже представлены результаты работы программы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]