Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВМИиП - Лабораторный практикум на Visual C++ 20...doc
Скачиваний:
2
Добавлен:
13.08.2019
Размер:
650.75 Кб
Скачать

Invalidate();

}

Аналогично добавить код для команды Udalenie:

void Clab3_1View::OnCorrectUdalenie

{

Clab3_1Doc* pDoc=GetDocument();

ASSERT_VALID (pDoc);

pDoc-> Str = “Вызвана команда Udalenie”;

Invalidate(); }

Скомпилировать, запустить и протестировать приложение.

4.2.3. Диалоговые окна

lab3_2 «Система диалоговых окон и элементов

управления»

Цель работы - создание ресурса диалогового окна; создание класса диалогового окна; связывание элементов управления диалогового окна с функциями-обработчиками сообщений; связывание переменных класса с элементами управления окна; отображение диалогового окна в приложении.

В окне редактора диалоговых окон (справа) имеется палитра с инструментами (стандартными элементами управления).

Алгоритм работы приложения состоит в следующем:

- Щелкнуть на включенной заранее в меню File новой команде Dialog. Появляется диалоговое окно со стандартными кнопками OK и Cancel, с добавленной кнопкой с именем Output и добавленным пустым текстовым полем.

- Щелкнуть на кнопке Output. В текстовом поле появляется строка “Диалоговое окно”.

- Щелкнуть на кнопке OK. Диалоговое окно исчезает, появляется главное окно приложения, в котором выводится содержимое текстового поля “Диалоговое окно”.

Для создания приложения lab3_2 выполнить следующие этапы.

Создание проекта

- Создать проект lab3_2 (SDI-приложение).

Включение новой команды Dialog в меню File

- Открыть редактор меню, щелкнув на вкладке Resource View или выполнив команду View->Resource View. В появившемся окне Resource View открыть папку lab3_2.rc, затем – Menu и дважды щелкнуть на строке IDR_MAINFRAME. Запускается редактор меню и выводятся команды главного меню.

- Добавить новую команду Dialog. Новая команда должна быть между командами Save As и Print меню File. Раскрыть меню File. В меню File имеется пустая команда Type Here. Щелкнуть на этой пустой команде, ввести строку Dialog и нажать Enter. Перетащить с помощью мыши команду меню Dialog в позицию после Save As меню File. Открыть окно Properties для новой команды меню Dialog, щелкнув сначала на каком-нибудь пункте меню, а затем на пункте Dialog, и проверить наличие в свойстве Caption значения Dialog.

- Подключить команду Dialog к приложению. Для этого открыть редактор меню, щелкнув на вкладке Resource View или выполнив команду View->Resource View. В появившемся окне Resource View открыть папку lab3_2.rc, затем – Menu и дважды щелкнуть на строке IDR_MAINFRAME. Запускается редактор меню и выводятся команды главного меню. Щелкнуть правой кнопкой на команде Dialog и в открывшемся контекстном меню выбрать команду Add Event Handler (добавить обработчик события). Откроется окно Event Handler Wizard – lab3_2. Выбрать в списке Message Type сообщение Command, а в списке Class list – CLab3_2 View. В поле Function handler name появится имя функции-обработчика OnFileDialog(). Щелкнуть на кнопке Add and Edit, и в окне редактора кода откроется шаблон созданной функции.

Создание ресурса диалогового окна

При выборе команды Dialog на экране должно появиться диалоговое окно с кнопкой Output и текстовым полем. Для этого сначала необходимо создать ресурс диалогового окна: создать пустой шаблон диалогового окна, добавить в диалоговое окно элементы управления: текстовое поле и кнопку, изменить надпись кнопки на Output.

- Создать шаблон диалогового окна. Для этого выполнить команду Project-> Add Resource и в появившемся окне Add Resource дважды щелкнуть на элементе Dialog в списке Resource Type (или выбрать Dialog и щелкнуть на New). Появляется шаблон диалогового окна с именем IDD_DIALOG1 и панели инструментов Dialog Editor и Toolbox. В окне имеются 2 кнопки: OK и Сancel. Если выбрать OK, то функция DoModal(), вызывающая диалоговое окно, возвращает значение IDOK, а если выбрать Cancel, то - IDCANCEL.

- Добавить в диалоговое окно элементы управления: текстовое поле и кнопку. Щелкнуть сначала на инструменте Edit Control (текстовое поле) панели инструментов Toolbox, а затем - в выбранной области диалогового окна. Появляется текстовое поле с надписью Sample edit box. Изменить размеры текстового поля, щелкнув в текстовом поле и пользуясь появившимися маркерами размеров (рамка с квадратами). Аналогично добавить кнопку, щелкнув на инструменте Button (кнопка), а затем в области диалогового окна. Появляется кнопка с надписью Button1.

- Изменить надписи элементов управления. Требуется изменить надпись кнопки Button1 на Output. Для изменения свойств диалогового окна открыть окно Properties (свойства), щелкнув правой кнопкой в свободной области окна, затем на Properties. Щелкнуть на кнопке и ввести в качестве свойства Caption текст Output. Новая надпись вводится в кнопку.

- Проверить в свойстве ID идентификатор IDC_BUTTON1, присвоенный кнопке редактором диалоговых окон. Аналогично проверить идентификатор IDC_EDIT1, присвоенный текстовому полю.

Создание класса диалогового окна

Диалоговое окно представляет собой ресурс, который хранится в файле lab3_2.rc. Необходимо создать объект, который был бы связан с данным ресурсом и для которого можно было бы вызывать функции диалоговых окон (напр., DoModal()). Итак, диалоговые окна включаются в приложения следующим образом: сначала создается диалоговое окно, затем создается класс диалогового окна и выполняется связывание элементов диалогового окна с функциями класса.

- Открыть шаблон диалогового окна при отсутствии его. Для этого щелкнуть на вкладке Resource View или выполнить команду View->Resource View и в появившемся окне Resource View открыть папку lab3_2.rc, затем – Dialog и дважды щелкнуть на идентификаторе IDD_DIALOG1.

- Щелкнуть правой кнопкой мыши на пустом месте диалогового окна и выполнить команду контекстного меню Add Class. Откроется окно мастера MFC Class Wizard.

- Ввести в поле Class name имя нового класса CDlg, в списке Base class выбрать имя базового класса диалоговых окон CDialog, проверить наличие в поле Dialog ID идентификатора IDD _ DIALOG1, и затем щелкнуть на кнопке Finish.

Связывание элементов управления диалогового окна с

функциями-обработчиками сообщений

Требуется связать сообщение кнопки Output с функцией – обработчиком.

- Открыть окно Class View и щелкнуть на имени класса CDlg. Появится окно свойств Properties.

- Щелкнуть на кнопке Event (с изображением желтой молнии) и в появившемся списке идентификаторов раскрыть узел IDC_ BUTTON1 (щелкнуть на символе +). Появляется список сообщений

- Выбрать элемент BN_CLICKED, а в комбинированном списке справа от идентификатора щелкнуть на команде <Add> OnBnClickedButton1. Прототип новой функции-обработчика OnBnClickedButton1() будет добавлен в файл Dlg.h, а ее текст – в файл Dlg.cpp. Функция OnBnClickedButton1() будет вызываться при нажатии кнопки Output.

Связывание переменных класса с элементами окна

Теперь необходимо сделать, чтобы при нажатии кнопки Output в текстовом поле появилась строка “Диалоговое окно”. Но ведь текстовое поле – это всего лишь фрагмент описания из файла lab3_2.rc. Воспользуемся возможностъю языка связывать переменные класса с элементами диалогового окна. Создадим переменную m_text для хранения содержимого текстового поля, так что при нажатии кнопки переменной m_text присвоилась бы строка “Диалоговое окно”.

- Запустить мастер создания переменных класса Add Member Variable Wizard. Для этого открыть окно Class View и выделить имя класса CDlg. Затем либо выполнить команду Project->Add Variable, либо щелкнуть правой кнопкой мыши на имени класса CDlg и выполнить команду контекстного меню Add->Add Variable. А можно также еще открыть диалоговое окно, щелкнуть правой кнопкой мыши на пустом месте окна и выполнить команду контекстного меню Add Variable.

- В появившемся окне Add Member Variable Wizard-lab 3_2 выполнить следующее: установить флажок Control variable, означающий, что переменная будет связана с элементом управления диалогового окна; в списке Control ID выбрать идентификатор текстового поля IDC_EDIT1; в списке Category выбрать значение value; в списке Variable type появится CString; ввести в поле Variable name строку m_text; в списке Access проверить наличие элемента public; и наконец, щелкнуть на кнопке Finish. Появляется содержимое файла Dlg.cpp с функциями класса CDlg.

- Задать содержимое текстового поля в функции-обработчике OnBnClickedButton1():

void CDlg :: OnBnClickedButton1 ()

{

m_text = “Диалоговое окно”;

}

Функция вызывается при нажатии кнопки Output.

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

void CDlg :: DoDataExchange (CDataExchange* pDX);

{

CDialog :: DoDataExchange (pDX);

DDX_Text (pDX, IDC_EDIT1, m_text);

}

- Обновить текстовое поле. Для чтения или записи содержимого элемента используется вызов функции UpdateData ():

void CDlg :: OnBnClickedButton1 ()

{

m_text = “Диалоговое окно”;

UpdateData (false);

}

Вызов функции UpdateData(false) с параметром false заносит в текстовое поле значение переменной m_text, вызов с параметром true присваивает переменной m_text содержимое текстового поля.

Итак, строка перенесена в текстовое поле.

Переопределение функции для кнопки ОК

Если пользователь изменит содержимое текстового поля, то нужно вывести это содержимое в клиентскую область главного окна приложения. Поэтому перед закрытием диалогового окна (нажатие ОК) необходимо занести в m_text текущее содержимое текстового поля, для чего используем вызов функции UpdateData (true).

- Связать сообщение кнопки ОК с функцией-обработчиком.

Для этого открыть окно Class View и щелкнуть на имени класса CDlg. В окне свойств Properties щелкнуть на кнопке желтая молния Event (События) и в появившемся списке идентификаторов раскрыть узел IDOK (щелкнуть на символе +). Появляется список сообщений. Выбрать элемент BN_CLICKED, а в комбинированном списке справа от идентификатора щелкнуть на команде <Add> OnBnClickedOk. Прототип новой функции-обработчика OnBnClickedOk() будет добавлен в файл Dlg.h, а ее текст – в файл Dlg.cpp. Функция OnBnClickedOk() будет вызываться при нажатии кнопки OK. На экране появится текст функции-обработчика OnBnClickedOk ().

- Занести в переменную m_text содержимое текстового поля. Для этого вызывается функция UpdateData (true):

void CDlg :: OnBnClickedOk ()

{//

UpdateData (true);

OnOK ();

}

Отображение диалогового окна

Класс диалогового окна CDlg создан. Наше диалоговое окно появляется при выборе команды File->Dialog. Вызывается функция класса вида OnFileDialog (). В этой функции надо объявить объект класса Dlg и с помощью него вызвать функцию DoModal() этого класса. Чтобы класс вида мог иметь доступ к членам класса CDlg, необходимо сообщить классу вида о существовании класса CDlg (хотя они в одном проекте, однако функции класса CDlg - в Dlg.cpp).

- Сообщить классу вида о существовании класса диалогового окна. Для этого включить в него файл заголовков класса CDlg - Dlg.h:

// lab3_2View.cpp

# include “lab3_2View.h”

# include “Dlg.h”

- Создать объект класса Dlg в классе вида:

void Clab3_2View :: OnFileDialog ()

{

CDlg dlg;

}

- Отобразить диалоговое окно на экране. Для этого вызвать функцию DoModal():

void Clab3_2View :: OnFileDialog ()

{//

CDlg dlg;

int result = dlg. DoModal(); //вызов диалогового окна и возврат

}//IDOK

- Проверить нажатие кнопки ОК:

void Clab3_2View :: OnFileDialog ()

{//…

int result = dlg. DoModal();

if (result = = IDOK)

{ }

}

Получить указатель на документ:

void Clab3_2View :: OnFileDialog ()

{//...

if (result == IDOK)

{

Clab3_2Doc* pDoc = GetDocument();

ASSERT_VALID (pDoc);

}

}

- Создать в документе объект класса c именем StringData:

// lab3_2Doc.h

class Clab3_2Doc :: public CDocument

{ ...

public:

CString StringData;

}

- Поместить текст из переменной m_text в объект StringData:

void Clab3_2View :: OnFileDialog ()

{

if (result == IDOK)

{//...

ASSERT_VALID (pDoc);

pDoc -> StringData = dlg. m_text;

}

}

- Предусмотреть вызов Invalidate(). Вывод данных – в функции OnDraw (). Но сначала надо предусмотреть стирание прежней строки перед перерисовкой новой. Для этого – вызов функции класса вида Invalidate(). Эта функция и вызывает OnDraw ().

void Clab3_2View :: OnFileDialog ()

{//

if (

result == IDOK)

{//...

pDoc -> StringData = dlg. m_text;