Прикладной интерфейс для Windows. Меню. Модальные и немодальные диалоги. Результаты работы программы

Страницы работы

Фрагмент текста работы

ЛаБОРАТОРНАЯ РАБОТА 3

Прикладной интерфейс для Windows. Меню

Составить иерархию предложенного понятия. Написать подпрограмму вызова иерархического меню. Для нижних узлов иерархии должны выводиться свойства соответствующих объектов. В вариантах заданий в скобках дан верхний уровень иерархии.

Варианты заданий

1.  Блюда на завтрак (бутерброды, каши, холодные закуски).

2.  Кухня народов СНГ (русская, узбекская, украинская).

3.  Мясные блюда (говядина, баранина, птица).

4.  Виды спорта (командные, некомандные).

5.  Виды спорта (летние, зимние).

6.  Виды спорта (на суше, в воздухе, на воде).

7.  Птицы (оседлые, кочующие, перелетные).

8.  Посуда (фарфоровая, стеклянная, деревянная, металлическая).

9.  Обувь (зимняя, осенняя, летняя).

10.  Одежда (зимняя, осенняя, летняя).

11.  Грибы (съедобные, несъедобные).

12.  Животные Африки (птицы, млекопитающие).

13.  Ядовитые животные (насекомые, змеи).

14.  Животные тропических лесов (насекомые, пресмыкающиеся, птицы, млекопитающие).

15.  Горные животные (млекопитающие, птицы, насекомые).

16.  Природные ресурсы (богатства недр, растительный мир, водные ресурсы).

17.  Деревья (лиственные, хвойные).

18.  Птицы (степные, лесные, горные).

19.  Цветы (домашние, полевые, культурные).

20.  Рыбы (морские, речные, озерные).

21.  Холодные блюда и закуски (из овощей, из рыбы, мясные).

22.  Морские животные (птицы, рыбы, млекопитающие).

23.  Лесные животные (птицы, звери, насекомые).

24.  Животные за полярным кругом (птицы, звери, ластоногие).

25.  Города СНГ (Россия, Украина, Белоруссия).

26.  Автомобили (легковые, грузовые, автобусы).

27.  Суда (гражданские, военные).

28.  Магазины (продовольственные, промышленных товаров, хозяйственные)

29.  Самолеты (военные, гражданские, специализированные).

30.  Легковые автомобили (отечественные, импортные).

Пример выполнения задания

Составить иерархию разделов Теории вероятностей и математической статистики.

Рассмотрим два основных раздела и их подразделы:

Теория вероятностей (случайные события, случайные величины, моменты распределения, случайные векторы, характеристические функции, предельные теоремы )

Математическая статистика (выборки, оценка параметров, проверка гипотез, корреляция и регрессия).

Файл ресурсов  terver.rc

#include "windows.h"

TVMENU MENU DISCARDABLE

BEGIN

POPUP "&Теория вероятностей"

BEGIN

MENUITEM "&Случайные события",         100

MENUITEM "С&лучайные величины",        101

MENUITEM "&Моменты распределения",     102

MENUITEM "Сл&учайные векторы",         103

MENUITEM "&Характеристические функции",      104

MENUITEM "&Предельные теоремы",        105

END

POPUP "&Математическая статистика"

BEGIN

MENUITEM "&Выборки",                   106

MENUITEM "&Оценка параметров",         107

MENUITEM "&Проверка гипотез",          108

MENUITEM "&Корреляция и регрессия",    109

END

MENUITEM "&Помощь",                        111

END

MYMENU ACCELERATORS

BEGIN

VK_F1, 111, VIRTKEY

END

Текст программы terver.cpp

#include <windows.h>

#include <string.h>

#include "terver.h"

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

char szwinname[] = "My Window";

int WINAPI WinMain(HINSTANCE hthisinst,  HINSTANCE hprevinst,

LPSTR lpszargs, int nwinmode)

{

HWND hwnd;

MSG msg;

HACCEL hAccel;

WNDCLASS wcl;

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 = "TVMENU";

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,

CW_USEDEFAULT,

CW_USEDEFAULT,

HWND_DESKTOP,

NULL,hthisinst,

NULL);

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;

}

LRESULT CALLBACK WindowFunc(HWND hwnd,

UINT message,

WPARAM wParam,

LPARAM lParam)

{

switch(message)

{

case WM_COMMAND:

switch (LOWORD(wParam))

{

case 100:

MessageBox(hwnd, "Случайным событием называется подмножество множества\n"

"элементарных событий", "", MB_OK);

break;

case 101:

MessageBox(hwnd, "Случайная величина задается с помощью функции распределения", "", MB_OK); break;

case 102:

MessageBox(hwnd, "Момент распределения обобщает\n"

"математическое ожидание и дисперсию", "", MB_OK); break;

case 103:

MessageBox(hwnd, "Случайный вектор задается многомерной функцией\n"

"распределения", "", MB_OK); break;

case 104:

MessageBox(hwnd,

"Характеристической функцией случайной величины X\n"

"называется математическое ожидание случайной величины exp(itX)",

"", MB_OK); break;

case 105:

MessageBox(hwnd, "Закон больших чисел, предельная теорема Муавра-Лапласа и\n"

"центральная предельная теорема", "", MB_OK); break;

case 106:

MessageBox(hwnd,

"Случайной выборкой объема n называется выбор n объектов из\n"

"генеральной совокупности", "", MB_OK); break;

case 107:

MessageBox(hwnd,

"Точечной оценкой параметра называется функция выборки, реализация\n"

"которой в некотором смысле могла бы рассматриваться как приближение\n"

"\nэтого параметра", "", MB_OK); break;

case 108: MessageBox(hwnd, "Проверка гипотез осуществляется\n"

"с помощью различных критериев", "", MB_OK); break;

case 109:

MessageBox(hwnd,

"Корреляция и регрессия измеряют зависимость между случайными величинами",

"", MB_OK); break;

case 111:

MessageBox(hwnd, "РГЗ1: Разделы теории вероятностей\n"

"и математической статистики",

"Помощь", MB_OK); break;

}

break; 

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

return DefWindowProc(hwnd,message,wParam,lParam);

}

return 0;

}

Результаты работы программы

Если выбрать, например, пункт меню «Помощь», с помощью клавиши <F1>, то будет выведено сообщение

ЛАБОРАТОРНАЯ РАБОТА 4

Модальные и немодальные диалоги

Написать программу, в которой используется диалог для работы со структурами данных, определяющими списки. Ввод элементов данных осуществляется с помощью окна редактирования EditBox.  Состояние списка выводится в окно списка ListBox.  Элемент списка удаляется, если по нему дважды щелкнуть курсором мыши.

Варианты заданий

Виды структур данных: очередь (S1), стек (S2), односвязный циклический список (S3). Тип данных элементов: char (T1), int (T2), unsigned (T3), float (T4), char* (T5). Вид диалога: модальный (D1), немодальный (D2). Предлагаются следующие варианты:

1) S1-T1-D1

7) S1-T2-D1

13) S1-T3-D1

19) S1-T4-D1

25) S1-T5-D1

2) S2-T1-D2

8) S2-T2-D2

14) S2-T3-D2

20) S2-T4-D2

26) S2-T5-D2

3) S3-T1-D1

9) S3-T2-D1

15) S3-T3-D1

21) S3-T4-D1

27) S3-T5-D1

4) S1-T1-D2

10) S1-T2-D2

16) S1-T3-D2

22) S1-T4-D2

28) S1-T5-D2

5) S2-T1-D1

11) S2-T2-D1

17) S2-T3-D1

23) S2-T4-D1

29) S2-T5-D1

6) S3-T1-D2

12) S3-T2-D2

18) S3-T3-D2

24) S3-T4-D2

30) S3-T5-D2

Пример выполнения задания

Написать программу работы с очередью строк. Использовать немодальный диалог.

Файл  rgz12.h

#define IDM_DIALOG1 100

#define IDM_HELP 102

#define ID_EB1 400

#define ID_LB1 301

#define IDM_INSERT 200

#define IDM_DELETE 201

#define IDM_SHOW 202

Файл ресурсов rgz12.rc

#include <windows.h>

#include "list.h"

// немодальный диалог

MYMENU MENU      

{

  MENUITEM "&Dialog", IDM_DIALOG1

  POPUP "&List"

  {

            MENUITEM "&Insert",IDM_INSERT

      MENUITEM "&Delete",IDM_DELETE

      MENUITEM "&Show",IDM_SHOW

  }

  MENUITEM "Help",IDM_HELP

}

MYMENU ACCELERATORS               

{

      VK_F2,IDM_INSERT,VIRTKEY

      VK_F1,IDM_HELP,VIRTKEY

}

MYDB DIALOG 18,18,142,92

CAPTION "Диалог"        //заголовок окна

STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE

{

  DEFPUSHBUTTON  "Ввод",IDOK,52,45,60,14,      //кнопка ввод

    WS_CHILD | WS_VISIBLE | WS_TABSTOP

  PUSHBUTTON "Завершение диалога",IDCANCEL,52,65,80,14,

    WS_CHILD | WS_VISIBLE | WS_TABSTOP

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

    ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER |

    WS_TABSTOP

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

    WS_CHILD | WS_VISIBLE | WS_BORDER |

    WS_VSCROLL | WS_TABSTOP

}

Текст программы rgz12.cpp

#include <windows.h>

#include <string.h>

#include <stdio.h>

#include "list.h"

// прототипы функций и глобальные переменные

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

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

char szWinName[] = "Lists";

HINSTANCE hInst;

int X=0, Y=0;

int maxX,maxY;

HDC memdc;

HBITMAP hbit;

HBRUSH hbrush;

TEXTMETRIC tm;

HWND hDlg; // немодальный диалог

char str[80];

int i;

struct slink {char *e; slink *next;};

slink* list1=NULL;

// вставка нового элемента

slink *insert( slink *lst, char *a)

{

slink *prev=lst, *p= new slink;

p->e = new char[strlen(a)+1];

strcpy(p->e,a); p->e[strlen(a)+1]='\0';

p->next = NULL;

if(lst==NULL) return p;

while(lst->next!=NULL)

{

lst =lst->next;

}

lst->next = p;

return prev;

}

// удаление элемента

slink *del( slink *lst)

{

slink *p=lst;

if(lst)

{

lst = lst->next; delete p;

}

return lst;

}

slink *del_num( slink *lst, int n)

{

slink *p=lst, *q;

if (n==0) return lst=del(lst);

for(i=0; i<n; i++)

{

q=p;   p = p->next;

}

if (p!=NULL)

{

q->next=p->next;

delete p;

}

return lst;

}

void sh(HDC hdc, slink *lst )

{

Y=0;

PatBlt(hdc,0,0,maxX,maxY,PATCOPY);

while(lst!=NULL)

{

sprintf(str, "%s", lst->e);

TextOut(memdc, X, Y, str, strlen(str));

Y = Y+ tm.tmHeight+tm.tmExternalLeading;

lst=lst->next;

}

}

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 (!IsDialogMessage(hDlg, &msg)) // немод

{

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;

PAINTSTRUCT paintstruct;

char *txt;

switch(message)

{

case WM_CREATE:

maxX= GetSystemMetrics(SM_CXSCREEN);

maxY= GetSystemMetrics(SM_CYSCREEN);

X=maxX/2;

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

memdc= CreateCompatibleDC(hdc);

hbit= CreateCompatibleBitmap(hdc,maxX,maxY);

SelectObject(memdc,hbit);

hbrush=(HBRUSH)GetStockObject(WHITE_BRUSH);

SelectObject(memdc,hbrush);

PatBlt(memdc,0,0,maxX,maxY,PATCOPY);

GetTextMetrics(memdc,&tm);

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

break;

case WM_COMMAND:

switch (LOWORD (wParam))

{

case IDM_DIALOG1:

//DialogBox(hInst,"MYDB",hwnd, (DLGPROC)DialogFunc);

CreateDialog(hInst, "MYDB",hwnd, (DLGPROC)DialogFunc); // немод

break;

case IDM_INSERT:

txt=new char[4];

sprintf(txt, "%3d", random(1000));

list1=insert(list1,txt);

sh(memdc,list1);

InvalidateRect(hwnd,NULL,1);

break;

case IDM_DELETE:

list1=del(list1);

sh(memdc, list1);

InvalidateRect(hwnd,NULL,1);

break;

case IDM_SHOW:

GetTextMetrics(memdc,&tm);

sh(memdc, list1);

InvalidateRect(hwnd,NULL,1);

break;

case IDM_HELP:

MessageBox(hwnd,"\nПосле ввода данных"

"\n в окно редактирования нажмите ENTER","Help",MB_OK);

break;

}

break;

case WM_PAINT:

hdc=BeginPaint(hwnd,&paintstruct); //get dc

BitBlt(hdc,0,0,maxX,maxY,memdc,0,0,SRCCOPY);

EndPaint(hwnd,&paintstruct);       //release DC

break;

case WM_DESTROY:

DeleteDC(memdc);

PostQuitMessage(0);          //сообщение о завершении

break;

default:                             //обработка остальных сообщений

return DefWindowProc(hwnd,message,wParam,lParam);

}

return 0;

}

void list_show (slink *lst, HWND hwnd)

{

slink*      lst_tmp = lst;

while (lst_tmp!=NULL)

{

SendDlgItemMessage(hwnd, ID_LB1,

LB_ADDSTRING,0,(LPARAM)(lst_tmp->e));

lst_tmp = lst_tmp->next;

} ;

}

BOOL CALLBACK DialogFunc(HWND hdwnd,

UINT message,

WPARAM wParam,

LPARAM lParam)

{

long i;

slink* lst_tmp;

switch(message)

{

case WM_COMMAND:

switch (LOWORD(wParam))

{

case IDCANCEL:

//EndDialog(hdwnd,0);

DestroyWindow(hdwnd); // немод

return 1;

case ID_LB1:

if(HIWORD(wParam)==LBN_DBLCLK)

{

i = SendDlgItemMessage(hdwnd,ID_LB1,LB_GETCURSEL,0,0L);

sprintf(str,"Индекс выбранного элемента = %d",i);

MessageBox(hdwnd,str,"Выбор сделан",MB_OK);

list1=del_num(list1,i);

SendDlgItemMessage(hdwnd,ID_LB1,LB_DELETESTRING,i,0L);

}

return 1;

case IDOK:

GetDlgItemText(hdwnd, ID_EB1, str,80);

if (strlen(str))

{

list1 = insert(list1,str);

SendDlgItemMessage(hdwnd, ID_LB1,

LB_ADDSTRING,0,(LPARAM)str);

}

}

return 1;

case WM_INITDIALOG:

list_show(list1, hdwnd);

return 1;

}

return 0;

}

Результаты работы программы

Если выбрать несколько раз опцию List->Insert, то в очередь будут записаны случайные числа:

Пункт  List содержит также подпункты удаления первого элемента Delete и вывода состояния очереди Show.

            При выборе пункта Dialog на экране появляется диалоговое окно. Оно позволяет вводить в очередь новые элементы.

Этот  диалог позволяет удалять элементы с помощью двойного щелчка

Похожие материалы

Информация о работе