Лабораторная работа №6. Элементы управления «Шкала индикации» (Progress) и «Маркер» (Slider). Модальные диалоговые окна

Цель лабораторной работы: Изучить принципы работы элементов управления Progress и Slider. Получить навыки по самостоятельному созданию модальных диалоговых окон.

Элементы управления Progress и Slider

Для отображения завершенности какого либо длительного процесса в Windows существует элемент Progress(шкала индикации).Этот элемент управления используется для наглядного представления некоторой изменяемой характеристики. Progress представляет собой прямоугольник, который заполняется системным цветом в направлении слева направо по мере выполнения некоторой операции.

Класс CProgressCtrl обеспечивает управление состоянием индикатора. Для установки текущей позиции индикатора в классе CProgressCtrl есть следующая функция:

int SetPos( int nPos );

Здесь nPos – это новая позиция линейного индикатора, функция возвращает его старую позицию. По умолчанию верхний предел значений равен 100 (соответствует полностью заполненному индикатору), а нижний 0 (соответствует полностью не заполненному индикатору).

При необходимости для изменения пределов можно воспользоваться функцией:

void SetRange( short nLower, short nUpper );

Здесь nLower – значение нижнего предела, nUpper – новое значение верхнего предела.

Элемент управления Slider (маркер, линейный регулятор) представляет собой линейный регулятор, содержащий бегунок и метки шкалы. Этот элемент управления может использоваться для выбора дискретных значений из некоторого диапазона, т.е. его, как правило, используют для плавного изменения значения в некотором диапазоне в зависимости от положения бегунка

В MFC элементу линейного регулятора соответствует класс CSliderCtrl. Как и в классе CProgressCtrl для установки нового положения бегунка в классе CSiderCtrl есть функция SetPos, для установки диапазона допустимых значений служит функция SetRange.Когда требуется определить положение бегунка, вызывают функцию-член класса CSiderCtrl:

int GetPos( ) const;

Кроме того, часто возникает необходимость запрограммировать обработчик сообщения WM_HSCROLL. Как правило, обработка данного сообщения сводится в определении нового положения бегунка (метод GetPos) и отображении его значения в другом элементе управления, например в диалоговой панели.

Модальные диалоговые окна

Существует два типа диалоговых окон модальные и немодальные.

Модальные окна должны быть закрыты пользователем, для того чтобы приложение могло продолжать свое выполнение. Немодальные окна позволяют продолжать выполнять пользователю другие задачи без закрытия диалога, поэтому модальные диалоги более распространены. Примером модального окна может служить стандартный диалог выбора файлов.

Для создания модального диалогового сначала создают ресурс диалогового окна, и с помощью ClassWizard создают новый класс диалогового окна, порожденного от класса CDialog. Для вызова диалогового окна используют функцию DoModal( );.Для возвращения из модального диалогового окна значений в программу можно в классе диалогового окна объявить поля или функции.

Пример реализации программы

Задание: написать программу, вычисляющую значение интеграла функции Лабораторная работа №6. Элементы управления «Шкала индикации» (Progress) и «Маркер» (Slider). Модальные диалоговые окна - student2.ru по следующей приближенной формуле:

Лабораторная работа №6. Элементы управления «Шкала индикации» (Progress) и «Маркер» (Slider). Модальные диалоговые окна - student2.ru

где a,b – границы интегрирования; N – число разбиений; h – шаг, h=(b-a)/N, Лабораторная работа №6. Элементы управления «Шкала индикации» (Progress) и «Маркер» (Slider). Модальные диалоговые окна - student2.ru ; Число разбиений должно задаваться с помощью элемента Slider, а скорость вычисления интеграла проконтролируем элементом Progress. Границы интегрирования необходимо задавать в модальном диалоговом окне.

Для решения задачи необходимо создать проект на основе диалогового окна (имя: CLabProgressBar), на втором шаге отключив опцию About Box. Используя панель Controls, нанести на заготовку формы - 1 элемент типа Edit Box, 2 – Static Text 2 – Button, 1 – Slider, 1- Progress. Название кнопки «OK» переименовать в «Выход» (рисунок 1).

С помощью мастера ClassWizard связать компонент EditBox с переменной m_res типа double, компонент Progress с переменной m_progress, выбрав ее тип как CProgressCtrl, а элемент управления Slider с переменной m_slider, выбрав ее тип как CSliderCtrl.

Для создания модального диалогового окна в закладке ResourseView окна Workspase во всплывающем меню требуется выбрать пункт Insert, после чего появиться диалог Insert Resource, изображенный на рисунке 2.

 
  Лабораторная работа №6. Элементы управления «Шкала индикации» (Progress) и «Маркер» (Slider). Модальные диалоговые окна - student2.ru

       
    Лабораторная работа №6. Элементы управления «Шкала индикации» (Progress) и «Маркер» (Slider). Модальные диалоговые окна - student2.ru
  Лабораторная работа №6. Элементы управления «Шкала индикации» (Progress) и «Маркер» (Slider). Модальные диалоговые окна - student2.ru
 

В диалоге Insert Resource следует выбрать пункт Dialog и нажать кнопку New, после чего появится заготовка нового окна. Создать окно, аналогичное снимку на рисунке 3.

Рисунок 3. – Окно для ввода данных

После создания ресурса диалогового окна следует создать класс для работы с ним. Для этого в основном меню надо выбрать пункт Insert и далее New Class, после чего появиться диалог New Class (рисунок 4). В поле Name требуется ввести имя класса, например CMyDialog. В выпадающем списке Base Class требуется выбрать в качестве базового класса CDialog. В списке Dialog ID должен стоять идентификатор созданного ранее диалогового окна, по умолчанию для первого окна это значение IDD_DIALOG1.

После создания класса диалогового окна с помощью мастера Class Wizard связать

 
  Лабораторная работа №6. Элементы управления «Шкала индикации» (Progress) и «Маркер» (Slider). Модальные диалоговые окна - student2.ru

поля ввода с переменными m_a и m_b типа double. Для создания экземпляра класса диалогового окна, объявить поле в классе главного окна.

Далее сделать необходимые добавления в тексте файлов проекта.

Ниже приведен фрагмент заголовочного фйла класса главного окна с необхожимыми добавками.

// CLabProgressBarDlg dialog

#include "MyDialog.h" //подключили заголовочный файл класса модального //диалога.

class CLabProgressBarDlg : public CDialog

{// Construction

public:CLabProgressBarDlg(CWnd* pParent = NULL); // standard constructor

CMyDialog d; //объявили переменную класса модального диалога.

// Dialog Data

//{{AFX_DATA(CLabProgressBarDlg)

Далее в основной файл ClabProgressBarDlg.cpp в конце метода:

BOOL CLabProgressBarDlg::OnInitDialog():

// TODO: Add extra initialization here

m_slider.SetRange(100,1000000);

// устанавливаем диапазон в элементе Slider

m_slider.SetPos(50000);

//устанавливаем положение ползунка

return TRUE; // return TRUE unless you set the focus to a control

}

И наконец тексты щелчков на кнопках:

void CLabProgressBarDlg::OnButton1()

{ //обработчик кнопки Граничные условия.

d.DoModal(); //вызов модального окна

}void CLabProgressBarDlg::OnButton2()

{ //обработчик кнопки Пуск.

CWaitCursor w; //класс для установки курсора – часы.

double s=0;

double x=d.m_a; //считывание из диалога нач. значения.

double h=(d.m_b-x)/m_slider.GetPos(); //вычисление h=(b-a)/N

int i=0;

while(x<d.m_b)

{ double f=x*x; //числение квадрата икса

s+=f*h; // вычисление суммы

x+=h;

m_progress.SetPos(100*i++/m_slider.GetPos());

//установка положения в полосы в Progress

}m_res=s;

UpdateData(0);

}

Индивидуальные задания

Проверьте правильность выражений, вычислив интеграл:

1. Лабораторная работа №6. Элементы управления «Шкала индикации» (Progress) и «Маркер» (Slider). Модальные диалоговые окна - student2.ru 6. Лабораторная работа №6. Элементы управления «Шкала индикации» (Progress) и «Маркер» (Slider). Модальные диалоговые окна - student2.ru

2. Лабораторная работа №6. Элементы управления «Шкала индикации» (Progress) и «Маркер» (Slider). Модальные диалоговые окна - student2.ru 7. Лабораторная работа №6. Элементы управления «Шкала индикации» (Progress) и «Маркер» (Slider). Модальные диалоговые окна - student2.ru

3. Лабораторная работа №6. Элементы управления «Шкала индикации» (Progress) и «Маркер» (Slider). Модальные диалоговые окна - student2.ru 8. Лабораторная работа №6. Элементы управления «Шкала индикации» (Progress) и «Маркер» (Slider). Модальные диалоговые окна - student2.ru

4. Лабораторная работа №6. Элементы управления «Шкала индикации» (Progress) и «Маркер» (Slider). Модальные диалоговые окна - student2.ru 9. Лабораторная работа №6. Элементы управления «Шкала индикации» (Progress) и «Маркер» (Slider). Модальные диалоговые окна - student2.ru

5. Лабораторная работа №6. Элементы управления «Шкала индикации» (Progress) и «Маркер» (Slider). Модальные диалоговые окна - student2.ru 10. Лабораторная работа №6. Элементы управления «Шкала индикации» (Progress) и «Маркер» (Slider). Модальные диалоговые окна - student2.ru

Контрольные вопросы:

1. Опишите принципы работы элементов управления Progress и Slider.

2. Назовите свойства модального и немодального диалоговых окон.

3. Опишите процесс создания модального диалогового окна.

Лабораторная работа №7. SDI – приложение. Работа с данными в архитектуре «Документ/представление» («Document/view»)

Цель лабораторной работы: изучение использования принципов архитектуры «Документ-Представление» и для выборки и сохранения данных в файлах, а также взаимодействия элементов меню, панели инструментов и строки состояния в приложении.

Архитектура «Документ-Представление»

В основе этой архитектуры лежат три глобальных понятия – фрейм, документ и представление. Под документом понимается те данные, с которыми работает приложение. Это может быть все, что угодно, - «простой текст», картинка и т.п. Отображение этих данных на экране осуществляется во фрейме документа. Фрейм содержит специальные окна – представления (Views), в которых отображают данные документа, и осуществляет координацию между документом и различными типами их представления, направляя им команды и получая от них извещения. Представлений документа в приложении может быть несколько. Пользователь взаимодействует с документом посредством его представления.

Фрейм и представление реализованы в виде двух различных оконных классов – класса фрейма и класса представления, при этом окно представления является дочерним по отношению к фрейму, т.е. размещается в его рабочей области. Сам фрейм может быть окном SDI- приложения или дочерним окном MDI-приложения. За взаимодействие пользователя непосредственно с фреймом (изменение размеров, перемещение и т.п.) полностью отвечает сама система Windows. Управление же представлениями ложится на программиста.

Документ представлен в виде объекта, который обеспечивает пространство для хранения данных в памяти и отвечает за такие операции, как запись и чтение документа с файла. Большая часть операций с данными выполняется самим приложением, а не классами библиотеки MFC.

Таким образом, архитектура «документ/представление» охватывает следующие основные классы:

CWinApp – класс для создания единственного объекта – приложения;

CFrameWnd – класс для создания главного окна однодокументного приложения и базовый для классов CMDIFrameWnd и CMDIChildWnd, которые отвечают за работу многодокументного приложения;

СDocTemplate - базовый абстрактный класс для создания шаблонов документов;

CDocument- класс для создания собственно документа;

СView – базовый класс, который совместно со своими производными классами – CCtrlView, CEditView, CListView, CTreeView, CScrollView – отвечает за отображение данных документа и за взаимодействие с пользователем.

При создании MFC AppWizard каркаса приложения архитектуры «Документ/представление» создастся типовой набор классов, производных от вышеназванных классов (если на шаге 1 установить флажок использования архитектуры “Document/View”) (рисунок 1)

Лабораторная работа №6. Элементы управления «Шкала индикации» (Progress) и «Маркер» (Slider). Модальные диалоговые окна - student2.ru

Рисунок 1.- Классы каркаса приложения архитектуры «Документ/представление»

Созданный каркас приложения достаточно полно реализует функции фрейма, однако функции по описанию данных и их представлению требуется реализовать программисту.

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

- Для каждого документа образовать класс на базе CDocument.

- Добавить в него переменные для хранения всех данных документа.

- Реализовать функции для чтения и модификации этих данных.

- Переопределить функцию Cobject::Serialize() в новом классе документа для организации чтения/записи данных документа с диска.

Если используется один класс документа, то он уже создан MFC AppWizard (рисунок 1). Добавление переменных для хранения данных документа рассмотрим для следующего примера. Данными, с которыми работает приложение, будут фамилия, имя, отчество абитуриента и оценки по 3-м дисциплинам – математике, физике и русскому языку. Описать эти данные можно следующей структурой:

typedef struct

{ CString name1;

CString name2;

CString name3;

int mark1;

int mark2;

int mark3;

}

SRTUCTRECORD;

В классе документа эти данные опишем в виде массива, используя шаблон для класса CArray:

class CLb7Doc : public CDocument

{

protected: // create from serialization only

CLb7Doc();

DECLARE_DYNCREATE(CLb7Doc)

…// Attributes

public:

CArray <SRTUCTRECORD, SRTUCTRECORD> m_data;

Для занесения и извлечения данных из массива используются методы класса CArray , поэтому здесь не будем использовать собственные методы, тем более, что член класса m_data является открытым.

Для сохранения и чтения из файла данных в документ, а также для создания документа MFC AppWizard реализованы команды ID_FILE_OPEN и ID_FILE_SAVE, ID_FILE_SAVE_AS и ID_FILE_NEW (рисунок 2).

  Рисунок 2.- Команды для работы с документом, созданные MFC AppWizard для каркаса приложения архитектуры «Документ/представление»
Лабораторная работа №6. Элементы управления «Шкала индикации» (Progress) и «Маркер» (Slider). Модальные диалоговые окна - student2.ru

Для выполнения этих команд библиотекой MFC вызываются соответствующие методы, реализация которых скрыта от программиста. Только два метода могут быть изменены:

- OnNewDocument() – здесь можно произвести инициализацию данных документа для MDI- приложения или очистку данных для SDI-приложения, т.е. уничтожение старых данных. Например, для нашего случая это может быть следующий код

BOOL CLab7Doc::OnNewDocument()

{

// Всю стандартную обработку по созданию документа возлагаем

// на библиотеку MFC

if (!CDocument::OnNewDocument())

return FALSE;

//После успешного создания проводим очистку массива сданными

m_data.RemoveAll();

return TRUE;

}

Метод Serialize() – здесь выполняется, собственно, сохранение данных в файл или чтение из файла данных в структуры документа. Этот метод вызывается при выполнении команд Open, Save или Save As после выбора блоком диалога имени файла.

Метод Serialize называется сериализацией – преобразование в последовательную форму и наоборот, позволяет сохранять и восстанавливать объекты классов, созданных на базе класса CObject. В нашем случае, нужно дополнить этот метод кодом по сохранению и восстановлению данных из файлового бинарного потока (данные записываются в файл без преобразования), который называют архивом. В качестве параметра в этот метод передается указатель на созданный экземпляр класса CArchiv , с которым ассоциирован объект класса CFile. Имя файла подставляется после выполнения кода диалогового окна по выбору имени файла. В классе CArchiv реализованы несколько вариантов перегружаемых операторов >> и << , которые, собственно, загружают объекты (или простые типы) из архива или сохраняют их в архиве. Они имеют следующие однотипные формы:

fried CArchive& operator << (CArchive &ar, CObject *&pOb)

fried CArchive& operator >> (CArchive &ar, CObject *&pOb)

или для простых типов

fried CArchive& operator << (Data_Type& data)

fried CArchive& operator >> (Data_Type& data),

где через Data_Type обозначены примитивные типы данных BYTE, WORD, int, DWORD, float double.

Метод CArchive::IsStoring возвращает направление потока

void CLb7Doc::Serialize(CArchive& ar)

{

if (ar.IsStoring())

{ // TODO: add storing code here

// Работа с потоком выполняется с простыми типами

ar << m_data.GetSize();

for (int i=0; i < m_data.GetSize(); i++)

{

ar << m_data.GetAt(i).name1;

ar << m_data.GetAt(i).name2;

ar << m_data.GetAt(i).name3;

ar << m_data.GetAt(i).mark1;

ar << m_data.GetAt(i).mark2;

ar << m_data.GetAt(i).mark3;

}

}

else

{

// TODO: add loading code here

int size;

SRTUCTRECORD rec;

ar >> size;

m_data.SetSize(size, 1);

for (int i=0; i < size; i++)

{

ar >> rec.name1;

ar >> rec.name2;

ar >> rec.name3;

ar >> rec.mark1;

ar >> rec.mark2;

ar >> rec.mark3;

m_data.SetAt(i,rec);

}

}}

Задание к лабораторной работе

Создать SDI-приложение для формирования и просмотра данных из файла в соответствии с индивидуальным заданием.

Требования для создаваемого приложения.

1. Управление заданием имени файла, его открытием или созданием и т.п. выполняется через команды меню или кнопки панели инструментов.

2. Просмотр загруженных данных из файла, а также формируемых в приложении, данных выполняется в диалоговом окне с использованием элемента управления Listbox. В этом списке отображается либо все данные, либо данные, формируемые в соответствии с функцией, определенной в индивидуальном задании. Порядок вывода управляется с помощью кнопок. Исходно выводится полный список.

3. Формирование данных в приложении осуществляется в другом диалоговом окне с использованием элементов управления Combobox и Edit.

4. До задания имени файла элементы меню и соответствующие кнопки управления открытием и сохранением данных в файл должны быть не доступны.

5. После задания имени файла все команды работы с файлом должны иметь место только для этого файла.

6. Имя заданного файла должно отображаться в строке статуса.

Индивидуальные задания

1. Список товаров, имеющихся на складе, включает в себя наименование товара, количество единиц товара, цену единицы и дату поступления товара на склад. Вывести в алфавитном порядке список товаров, хранящихся больше месяца, стоимость которых превышает 1000000 руб.

2. Для получения места в общежитии формируется список студентов, который включает Ф.И.О. студента, группу, средний балл, доход на члена семьи. Общежитие в первую очередь предоставляется тем, у кого доход на члена семьи меньше двух минимальных зарплат, затем остальным в порядке уменьшения среднего балла. Вывести список очередности предоставления мест в общежитии.

3. В справочной автовокзала хранится расписание движения автобусов. Для каждого рейса указаны его номер, тип автобуса, пункт назначения, время отправления и прибытия. Вывести информацию о рейсах, которыми можно воспользоваться для прибытия в пункт назначения раньше заданного времени.

4. На междугородной АТС информация о разговорах содержит дату разговора, код и название города, время разговора, тариф, номер телефона в этом городе и номер телефона абонента. Вывести по каждому городу общее время разговоров с ним и сумму.

5. Информация о сотрудниках фирмы включает: Ф.И.О., табельный номер, количество проработанных часов за месяц, почасовой тариф. Рабочее время свыше 144 часов считается сверхурочным. Вывести сотрудников фирмы, которые имеют сверхурочные часы.

6. Информация об участниках спортивных соревнований содержит: наименование страны, название команды, Ф.И.О. игрока, игровой номер, возраст, рост, вес. Вывести информацию о самой молодой, рослой и легкой команде.

7. Для книг, хранящихся в библиотеке, задаются регистрационный номер книги, автор, название, год издания, издательство, количество страниц. Вывести список книг с фамилиями авторов в алфавитном порядке, изданных после заданного года.

8. Различные цеха завода выпускают продукцию нескольких наименований. Сведения о выпущенной продукции включают: наименование, количество, номер цеха. Для заданного цеха необходимо вывести количество выпущенных изделий по каждому наименованию в порядке убывания количества.

9. Информация о сотрудниках предприятия содержит Ф.И.О., номер отдела, должность, дату начала работы. Вывести списки сотрудников по отделам, которые проработали меньше года.

10. Ведомость абитуриентов, сдавших вступительные экзамены в университет, содержит Ф.И.О., адрес, оценки. Вывести абитуриентов, проживающих в г.Минске и сдавших экзамены со средним баллом не ниже 8.

11. В налоговой инспекции содержатся данные о предприятиях, которые определяют название, УНП, ФИО директора, вид деятельности, дата регистрации. Вывести все предприятия по видам деятельности (исключать ликвидированные).

12. В справочной аэропорта хранится расписание вылета самолетов на следующие сутки. Для каждого рейса указаны: номер рейса, тип самолета, пункт назначения, время вылета. Вывести все номера рейсов, типы самолетов и времена вылета для заданного пункта назначения в порядке возрастания времени вылета.

13. Транспорт (наименование, тип, год выпуска, максимальная скорость, объем двигателя, расход, объем бензобака, расстояние без подзаправки –функция Run ()).

14. Продовольственные товары (наименование, отдел магазина, дата выпуска, срок хранения, последний срок реализации – функция Run (), вес).

15. Объекты недвижимости (адрес, тип, этажность, квартир на этаже, подъездов, всего квартир – функция Run ()).

16. Периодические издания (название, тип, страниц, частота выпуска, тираж, выпусков в год – функция Run ()).

17. Отдел кадров (ФИО, отдел, должность, дата приема на работу, внутренний стаж – функция Run (), ставка).

18. Научно-исследовательские разработки (наименование, дата начала, дата завершения, срок работы – функция Run(), область исследования, количество сотрудников, ФИО сотрудников).

19. Программное обеспечение (наименование, тип, количество дисков, объем после установки (полной, минимальной, типичной версий), процент сжатия –функция Run ()).

20. Комплектующие ЭВМ (наименование, тип, модель, частота, объем памяти, стоимость, количество, итоговая стоимость – функция Run ()).

21. Аудио – студия (группа/исполнитель, количество человек, стиль, количество альбомов, стоимость записи диска [], стоимость диска [], тираж[], общая прибыль группы – функция Run (), доход исполнителя – функция Run1()).

22. Мобильные телефоны (наименование, фирма, стандарт связи, заряд аккумулятора, потребление при ожидании, потребление при разговоре, время ожидания - функция Run (), время разговора – функция Run1 ()).

23. Сетевое оборудование (наименование, скорость передачи данных, тип, стоимость, количество, общая стоимость – функция Run (), максимальная скорость передачи (байт/с)).

Контрольные вопросы:

1. Что составляет основу архитектуры «Документ-Представление»? Дайте характеристику каждому элементу

2. Назовите основные классы архитектуры «Документ-Представление» и их назначение.

3. Для чего служит метод Serialize?

Литература

1. Л. Константайн Л., Локвуд Л. Разработка программного обеспечения. ‑ М.: Питер, 2004.

2. Савич В. C++ во всей полноте. - М.: Питер, 2004.

3. Аллен Э. Типичные ошибки проектирования. - М. : Питер, 2003.

4. Пол И. Объектно-ориентированное программирование с использованием C++. ‑Киев.: ДиаСофт, 2005.

5. Винниченко И. В. Автоматизация процессов тестирования. - М.: Питер, 2005.

6. Богуславский А. С. Си ++ и компьютерная графика. Лекции и практикум по программированию на Си ++. -М.: Компьютер Пресс, 2003.

Наши рекомендации