Министерство образования и науки Российской Федерации Государственное образовательное учреждение высшего профессионального образования «Комсомольский-на-Амуре Государственный Технический Университет» Факультет компьютерных технологий Кафедра «Математическое обеспечение и применение ЭВМ» Лабораторная работа № 4 по курсу «Человеко-машинное взаимодействие» Выполнил Проверил Вариант 1 г.Комсомольск-на-Амуре, 2010 г. |
Тема: «Меню в системе Windows».
Цель: Изучить принципы создания модальных и немодальных диалоговых окон с помощью интерфейса Windows и научиться созданию такового в собственной программе.
Задание: Написать программу, в которой используется диалог для работы со структурами данных, определяющими списки. Ввод элементов данных осуществляется с помощью окна редактирования EditBox. Состояние списка выводится в окно списка ListBox. Элемент списка удаляется, если по нему дважды щелкнуть курсором мыши.
Вид диалога: модальный (D1)
Тип данных элементов: char (T1)
Виды структур данных: очередь (S1)
Файл ресурсов res.rc
// Подключаем необходимые файлы для работы с Windows формами и остальным
#include <windows.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
// Создаем меню
MYMENU MENU
{
MENUITEM "&Диалог", IDM_DIALOG1
POPUP "&Правка"
{
MENUITEM "&Вставка",IDM_INSERT
MENUITEM "&Удаление",IDM_DELETE
MENUITEM "&Показать",IDM_SHOW
}
MENUITEM "Помощь", IDM_HELP
}
// Закрепляем за меню горячие клавиши
MYMENU ACCELERATORS
{
VK_F2,IDM_INSERT,VIRTKEY // За меню вставка клавишу F2
VK_F1,IDM_HELP,VIRTKEY // За меню помощь клавишу F1
}
// Свойства диалога и размеры окна
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 | // Создаем поле для ввода
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
}
Текст программы
// Подключаем необходимые файлы для работы с Windows формами и остальным
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include "list.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
//---------------------------------------------------------// Прототипы функций и глобальные переменные
LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK DialogFunc(HWND,UINT,WPARAM,LPARAM);
// Имя класса. Используется при заполнении структуры типа WNDCLASS
char szWinName[] = "Lists";
// Дескриптор текущего экземпляра приложения
HINSTANCE hInst;
// Переменные для вывода текста на форму
int X = 0, Y = 0;
// Размеры экрана
int maxX, maxY;
// Контекст устройства
HDC memdc;
// Дескриптор обьекта, точечного рисунка связанного с контекстом устройства (формы)
HBITMAP hbit;
// Дескриптор одного из предопределенных (стандартных) перьев, кистей, шрифтов или палитр.
HBRUSH hbrush;
// Структура метрики текста. Структура TEXTMETRIC содержит основную информацию о физическом шрифте. Все размеры задаются в логических единицах измерения; то есть они зависят от текущего режима отображения контекста вывода на экран
TEXTMETRIC tm;
// Дескриптор диалогового окна
HWND hDlg;
// Переменная для добавления элементов
char str[80];
// Переменная для циклов
int i;
// Определяем структура нашего списка
struct slink{
// которая включает в себя непосредственно данные - макс 80 символов
char info[80];
// и адрес на следующюю запись
slink *next;
};
// Инициализируем переменную list1 которая имеет структуру нашего списка slink
slink* list1 = NULL;
// Функция insert. Вставка нового элемента в список. Входящие параметры:
// *lst - адрес списка
// itadd - что добавить
slink *insert( slink *lst, char itadd[])
{
// prev - сохраняем адрес на список, и создаем новую запись p
slink *prev = lst, *p = new slink;
// Копирует строку itadd в p->info
strcpy(p->info, itadd);
// В новой записи указываем что следующей записи нету, т.к. добавляем в конец списка
p->next = NULL;
// Добавленная запись была первой, список до этого был пуст
if (lst == NULL) return p;
// Обходим весь список в поисках записи стоящей перед новой
while (lst->next != NULL) lst = lst->next;
// Сохраняем новую запись
lst->next = p;
// Возвращаем обновленный список
return prev;
}
// Функция del. Удаление элемента из списка. Входящие параметры:
// *lst - адрес списка
slink *del( slink *lst)
{
// Адрес списка
slink *p = lst;
// Если список не пустой
if (lst)
{
// Запоминаем список без первого элемента
lst = lst->next;
// Очищаем память
delete p;
}
// Возвращаем новый список
return lst;
}
// Функция del_num. Удаление элемента из списка стоящее под номером n. Входящие параметры:
// *lst - адрес списка
// n - номер удаляемого элемента
slink *del_num(slink *lst, int n)
{
// Создадим новую переменную p, которую будем "обходить"
slink *p = lst, *q;
// Если надо удалить первую запись удалим функцией удаления первой записи
if (n == 0) return lst = del(lst);
// Обходим список до Nой записи
for (i = 0; i < n; i++)
{
// Сохраняем запись
q = p;
// Переходим на следующюю запись
p = p->next;
}
// Запись под номером N была найдена
if (p != NULL)
{
// "Перескакиваем" удаленный элемент сохранив последующий заместо удаляемого
q->next = p->next;
// Почистим память
delete p;
}
// Возвращаем новый список
return lst;
}
//---------------------------------------------------------// Обьявляем новую функцию которая принимает параметры: HDC (контекст устройства куда вывести текст) и адрес на список который надо показать
void sh(HDC hdc, slink *lst )
{
// Инициализируем переменную Y, которая определяет положение выводимого текста на форме приложения
Y = 0;
// API функция. Рисует прямоугольник на контекст {HDC} с координатами x1={0}, y1={0}, x2={maxX}, y2={maxY} и кодом растровой операции {PATCOPY} который определяет копирование заданного узора в принимающий точечный рисунок. Включено в Windows.h
PatBlt(hdc, 0, 0, maxX, maxY, PATCOPY);
// Обходим весь список, для вывода всех элементов
while (lst != NULL)
{
// В str записывает данные с lst->info в формате %s (строка)
sprintf(str, "%s", lst->info);
// На контекст устройства memdc выводится strlen(str) символов строки, указатель на которую равен str. Координаты X, Y задаются относительно начала рабочей области, а не экрана.
TextOut(memdc, X, Y, str, strlen(str));
// Следующий элемент выводим строчкой ниже, вычисляя значение Y из суммы предыдущей позици, высотой букв и межстрочный интервал
Y = Y + tm.tmHeight + tm.tmExternalLeading;
// Переходим к следующему элементу списка
lst = lst->next;
}
}
// Функция list_show. Отображение списка в компонент ID_LB1 на диалоговом окне. Входящие параметры:
// *lst - адрес списка
// hwnd - дескриптор окна
void list_show(slink *lst, HWND hwnd)
{
// Формируем временный список для обхода по нему
slink* lst_tmp = lst;
// Если список не пуст
while (lst_tmp != NULL)
{
// Посылает сообщение оpгану упpавления блока диалога. Посылаем команду добавить элемент в компонент list_box
SendDlgItemMessage(hwnd, ID_LB1, LB_ADDSTRING, 0, (LPARAM)(lst_tmp->info));
// Переходим к следующей записи
lst_tmp = lst_tmp->next;
};
}
// Начальная функция
// Параметры:
// hInstance - дескриптор текущего экземпляра приложения
// hPrevInstance - дескриптор предыдущего экземпляра приложения, если оно запущено
// lpszArgs - указатель на строку, содержащую параметры передаваемые
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.