ЛаБОРАТОРНАЯ РАБОТА 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 на экране появляется диалоговое окно. Оно позволяет вводить в очередь новые элементы.
Этот диалог позволяет удалять элементы с помощью двойного щелчка
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.