Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СОВРЕМЕННЫЕ МЕТОДЫ ПРОГРАММИРОВАНИЯ.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
797.27 Кб
Скачать

21.16. Создание меню

Рассмотрим порядок действий при создании меню приложения.

Добавьте новый ресурс – меню – командой Insert/Resource… На диаграмме ресурсов ResourceView появится новый элемент – меню с идентификатором по умолчанию IDR_MENU1 (рис. 21.5).

Для меню IDR_MENU1 вызовите с помощью контекстного меню команду Properties (Свойства), в открывшемся окне установите язык ресурса меню (окно Language) – русский, при необходимости измените идентификатор меню (окно ID), например, на идентификатор IDR_MAINMENU для главного меню приложения.

Двойным щелчком на элементе IDR_MENU1 на диаграмме ResourceView активизируйте редактор меню.

Рис. 21.5. Редактирование меню

Добавьте в меню элементы верхнего уровня. С помощью контекстного меню соответствующего элемента откройте окно Properties (Свойства) и заполните поле Caption (Подпись), например, Файл, Помощь. Проверьте установку свойства Pop-up: если флажок установлен, то элемент меню будет иметь вложенные элементы, если нет – он будет конечной командой. Элементам меню с установленным свойством Pop-up идентификаторы не присваиваются.

Добавьте в разделы меню верхнего уровня команды (Выход, О программе и т. д.). С помощью контекстного меню элемента и команды Properties (Свойства) каждой команде присвойте идентификатор (поле ID), например, ID_EXIT для команды Выход, ID_ABOUT для команды О программе. Заполните поле Caption (Подпись). Для создания вложенного меню в соответствующем элементе установите свойство Pop-up. Свойство Separator (Сепаратор, или разделитель) разделяет пункты меню горизонтальной линией.

Свяжите меню с классом соответствующего диалогового окна с помощью ClassWizard.

Свяжите каждый пункт меню с кодом программы, для этого используйте ClassWizard и сообщение COMMAND, возникающее при выборе команды меню. В окне ClassWizard установите соответствие между идентификатором меню, например, ID_EXIT, сообщением COMMAND и функцией, обрабатывающий сообщения, например, OnExit().

Свяжите меню с диалоговой панелью, для этого с помощью диаграммы ResourceView следует вызвать окно Свойства диалоговой панели, и в окне Menu выбрать идентификатор меню, например, IDR_MENU1.

21.17. Приложение с двумя диалоговыми панелями

Применим теперь библиотеку MFC для решения задачи о табулировании функции y = sin(x) – будем использовать классы MFC для разработки интерфейса пользователя программы.

Исходные данные задачи табулирования: количество расчетных точек, начальное и конечное значения аргумента x. Ограничение на исходные данные: количество расчетных точек должно быть больше 1.

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

В интерфейс пользователя включим следующие элементы:

     главную диалоговую панель с меню и окном для вывода результатов табулирования (List Box);

     диалоговую панель для ввода исходных данных задачи.

Хранение данных организуем в главной диалоговой панели с помощью новых свойств, включенных в класс диалоговой панели.

Меню будет включать раздел Действия, состоящий из трех команд: Ввод данных, Вычисления, Выход.

Команда Ввод данных открывает модальную диалоговую панель для ввода данных; данные вводятся в окна редактирования Edit Box. Закрытие диалоговой панели производится кнопками OK или Cancel. Закрытие панели кнопкой OK сопровождается передачей данных в главную диалоговую панель. Выбор кнопки Cancel оставляет данные программы без изменений.

Команда Вычисления выполняет вычисления, только если исходные данные были изменены и соответствуют ограничениям задачи. Результаты вычислений выводятся в окно List Box главной диалоговой панели.

Рассмотрим последовательность действий для решения нашей задачи.

Создайте новый проект Dialogs – приложение MFC, основанное на диалоге (Dialog Based).

Настройте свойства главной диалоговой панели IDD_DIALOG1 – замените идентификатор на IDD_DIALOG_MAIN, установите русский язык; удалите кнопку Cancel, статический текст.

Добавьте элементы управления в главную диалоговую панель:

статический текст – IDC_STATIC для заголовка, свойству Caption элемента управления дайте значение «Результаты вычислений»;

окно со списком – IDC_LIST_RESULT для вывода результатов вычислений, свойство Sort (сортировка) отмените; с помощью ClassWizard свяжите с элементом управления переменную m_Result (категория – control).

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

Добавьте в класс главной диалоговой панели CDialogsDlg в раздел private свойства для хранения данных задачи:

int n

 – количество точек,

double x_begin

 – начальное значение x,

double x_end

 – конечное значение x,

double x

 – текущее значение x,

double y

 – текущее значение функции,

int new_data

 – признак ввода новых данных (значение 1  соответствует получению новых исходных данных).

Добавление свойств выполняйте с помощью команды Add Member Variable из контекстного меню диаграммы ClassView.

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

#include <math.h>

…………

double CDialogsDlg::f(double t)

{

return sin(t);

}

Добавьте в проект новый ресурс – диалоговую панель для ввода данных IDD_DIALOG_INPUT, свяжите ресурс с новым классом MFC – назовите его CInputDlg.

Разместите на диалоговой панели IDD_DIALOG_INPUT элементы управления: Edit Box – для ввода данных и Static – для поясняющих подписей; создайте с помощью ClassWizard переменные для элементов Edit Box.

Свойства элементов управления и имена связанных с ними переменных приведены в табл. 21.3.

Таблица 21.3

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

Идентификатор ID

Подпись (Caption)

Переменная

Начальное значение переменной

Static

IDC_STATIC

Количество точек

 

Static

IDC_STATIC

Начальное значение x

 

Static

IDC_STATIC

Конечное значение x

 

Edit Box

IDC_EDIT1

m_num

10

Edit Box

IDC_EDIT2

m_xBegin

0

Edit Box

IDC_EDIT3

m_xEnd

9

Установите начальные значения переменным, для этого с помощью ClassWizard добавьте в класс CInputDlg метод OnInitDialog() и отредактируйте его:

BOOL CInputDlg::OnInitDialog()

{

CDialog::OnInitDialog();

//TODO: Add extra initialization here

m_num=10;

m_xBegin=0;

m_xEnd=9;

UpdateData(FALSE);

return TRUE; //return TRUE unless you set the

//focus to a control

//EXCEPTION: OCX Property Pages should

//return FALSE

}

Отредактируйте функцию OnInitDialog() главной диалоговой панели:

BOOL CDialogsDlg::OnInitDialog()

{

CDialog::OnInitDialog();

//Set the icon for this dialog. The

//framework does this automatically

//when the application's main window

//is not a dialog

SetIcon(m_hIcon,TRUE); //Set big icon

SetIcon(m_hIcon,FALSE); //Set small icon

//TODO: Add extra initialization here

new_data=0; //Новые данные отсутствуют

return TRUE; //return TRUE unless you set

//the focus to a control

}

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

Команда Выход:

void CDialogsDlg::OnExit()

{

OnOK();

}

Команда Ввод данных:

void CDialogsDlg::OnInputdata()

{

CInputDlg inputdlg; //Создание объекта – 

//панели диалога

new_data=inputdlg.DoModal();

//Функция DoModal() возвращает значение 1,

//если была нажата клавиша OK, или значение 2,

//если была нажата клавиша Cancel

if (new_data==1)

{

if (inputdlg.m_num >1)

{

n=inputdlg.m_num;

x_begin=inputdlg.m_xBegin;

x_end=inputdlg.m_xEnd;

}

else

{

MessageBox("Ошибка вода данных");

new_data=0;

}

}

}

При нажатии кнопки ОК диалоговой панели inputdlg происходит обновление переменных, связанных с элементами управления (табл. 21.3).

Команда Вычисление:

void CDialogsDlg::OnCalculate()

{

//TODO: Add your command handler code here

if (new_data==1)

{

int i;

CString str;

double dx=(x_end-x_begin)/(n-1);

x=x_begin;

m_Result.ResetContent();

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

{

y=f(x);

str.Format("%3d %6.2lf %6.2lf",i+1,x,y);

m_Result.AddString(str);

x +=dx;

}

new_data=0;

}

}