Меню в системе Windows. Файл ресурсов res.rc. Текст программы. Сообщение о инициализации диалогового окна

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

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

Министерство образования и науки Российской Федерации

Государственное образовательное учреждение  высшего профессионального образования

«Комсомольский-на-Амуре Государственный Технический Университет»

Факультет компьютерных технологий

Кафедра «Математическое обеспечение и применение ЭВМ»

Лабораторная работа № 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 - указатель на строку, содержащую параметры передаваемые

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

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