
- •Введение
- •1. Общие принципы создания интерфейса
- •1.1. Эргономические характеристики интерфейса
- •1.2. Составные части интерфейса
- •1.3. Виды диалога
- •1.4. Процессы ввода – вывода
- •1.5. Методы разработки подпрограмм нижнего уровня
- •Int int86(int num, union regs *inregs, union regs *outregs);
- •Void pokeb(unsigned seg, unsigned off, char value);
- •Int getch();
- •2. Исчезающее меню
- •2.1. Алгоритм создания исчезающего меню
- •2.2. Сохранение и восстановление экрана
- •2.3. Вывод меню и рамки
- •2.4. Определение выбора пользователя
- •2.5. Подпрограмма исчезающего меню
- •3. Иерархическое меню
- •3.1. Фреймы меню
- •3.2. Подпрограмма активизации меню
- •3.3. Организация иерархического меню
- •3.4. Всплывающие окна
- •Void window(int num);
- •Void deactivate(int num);
- •4. Графический интерфейс
- •4.1. Организация меню в графическом режиме
- •Void outtextxy ( int X, int y, char *s);
- •4.2. Организация графического диалога
- •4.3. Особенности графического режима
- •Void putpixel (int color, int X, int y)
- •4.4. Форматы хранения графических файлов
- •5. Прикладной интерфейс для windows
- •5.1. Приложения Windows
- •5.2. Каркас приложения
- •5.3. Обработка сообщений в системе Windows
- •Int ReleaseDc(hwnd hwnd, hdc hdc);
- •Int MessageBox(hwnd hwnd, lpcstr lpText, lpcstr lpCaption, uint wMbType);
- •Int response;
- •5.4. Меню в системе Windows
- •5.5. Диалоги в системе Windows
- •Int DialogBox(hinstance hThisInst,
- •5.6. Пример программы, использующей список и окно ввода
- •6. Лабораторная 1
- •Варианты заданий
- •Пример выполнения задания
- •7 Лабораторная 2
- •Варианты заданий
- •Пример выполнения задания
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;
}
Ниже представлены результаты работы программы.