Лекция № 6 Использование стандартных решений и библиотек

Базовый класс MFC. Иерархия классов в MFC. Наследование классов. Использование классов библиотеки MFC при создании приложений с помощью Microsoft Visual Studio. Динамические и статические библиотеки. Создание собственных компонентов библиотеки.

Классы MFC можно разделить на две группы: общего назначения и предназначенные для создания интерфейса пользователя [19].

Классы общего назначения:

CString – последовательность символов, для которой определены некоторые методы и операции;

CFile – средство для работы с файлами на диске.

Классы для создания пользовательского интерфейса:

CDialog – диалоговые панели,

CButton – кнопки,

CStatic – статические строки,

CEdit – окна для редактирования текста.

К началу главы

21.2. Класс CString

Класс CString – удобное средство для работы со строками. В отличие от языка C, где работа со строковыми данными сводится к использованию массивов символов, ограниченных конечным нулем, а действия над строками осуществляются через указатели на строки, класс CString позволяет создать строковую переменную, аналогичную переменной типа string в языке Pascal. CString не имеет базового класса.

Класс CString содержит последовательность символов переменной длины и набор функций и операций над ней. Тип символа – TCHAR, т. е. если в программе используется двухбайтный символ (определен макрос _UNICODE), то тип символа устанавливается как WCHAR, в противном случае тип символа определяется как char.

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

Примеры конструирования строковых объектов:

Cstring str; //Конструктор по умолчанию создает

//пустую строку

CString str1,str2;

CString str3("Строка символов"); //Конструктор с

//параметрами помещает в строку str3 значение

//своего аргумента

CString str4=str3; //Создание строки и ее

//инициализация

CString str5 = "123456"; //заданным значением

CString str6(str5); //Копирующий конструктор

//создает копию переменной типа CString

В класс CString включены операции над строками.

Присваивание:

str="Строка";

str1=str;

Конкатенация строк (сложение):

str1="Библиотека";

str2="MFC";

str=str1 + " " + str2;

Доступ к отдельному символу строки через его порядковый номер:

char ch=str[1]; //начало отсчета – индекс 0

str[2]='4';

Следует заметить, что для выполнения действий над отдельными символами лучше применять специальные функции класса GetAt() и SetAt():

str.GetAt(1); //Чтение символа с индексом 1,

str.SetAt(2,'7'); //Запись символа '7' вместо

//символа с индексом 2.

Сравнение строк (используются перегруженные операторы отношения <, >, <=, >=, ==,!=):

if (str1>str2)

str=str1;

else

str=str2;

Вставка объекта в поток (оператор <<):

cout << str1;

Извлечение объекта из потока (оператор >>):

cin >> str1;

В класс CString включены разнообразные функции для обработки строковых данных

Преобразование данных в переменную типа CString:

CString str="Число";

str.Format("%s %d",str,123);

В переменную str записывается слово. Функция Format имеет три параметра: первый представляет собой строку формата, остальные – список помещаемых в строку значений. Спецификаторы преобразования строки формата должны соответствовать типу соответствующих им аргументов. Так, первый спецификатор %s соответствует строковой, второй %d – целочисленной переменным. В результате преобразования в переменной str будет находиться строка: "Число 123". При применении других методов класса CString следует обратиться к контекстной подсказке VC++ или к справочной системе MSDN.

К началу главы

21.3. Класс CFile

Класс CFile предназначен для работы с файлами, используется как базовый класс для других классов MFC, предназначенных для работы с файлами. Обеспечивает небуфферизованный двоичный ввод/вывод в файлы.

В класс включено несколько конструкторов.

Конструктор по умолчанию:

CFile();

Конструктор с параметрами:

CFile(LPCTSTR lpszFileName,UINT nOpenFlags),

где lpszFileName – указатель на строку, содержащую имя файла и путь к нему;

nOpenFlags – целочисленная переменная, определяющая режимы доступа к файлу или его атрибуты и принимающая следующие значения:

CFile::modeCreate – создать новый файл; если файл уже существует, информация из него удаляется;

CFile::modeRead – открыть файл для чтения; для этого файл должен находиться в заданном каталоге; если файл отсутствует, возникает ошибка;

CFile::modeWrite – открыть файл для записи; если указанный файл не найден, он создается в указанном каталоге; указатель файла устанавливается на начало файла; если в файле была какая-либо информация, она стирается.

Пример создания объекта класса CFile:

CFile MyFile("my.txt",CFile::modeRead);

В класс включены методы для работы с файлами:

Virtual UINT Read(void* lpBuf,UINT nCount) – чтение из файла; lpBuf – указатель на буфер, в который помещается прочитанная информация, nCount – размер буфера; возвращает количество информации в байтах, помещенной в буфер;

virtual void Write(const void* lpBuf,UINT nCount) – запись в файл; имеет те же параметры, что и метод Read();

virtual LONG Seek(LONG lOff,UINT nFrom) – позволяет произвольно устанавливать указатель текущей позиции в файле; lOff – смещение в байтах, nFrom – позволяет устанавливать начало отсчета: значение CFile::begin – отсчет от начала файла; CFile::current – отсчет от текущей позиции указателя; CFile::end – отсчет от конца файла;

Open() – открытие файла в соответствии с выбранным режимом;

Close() – закрытие файла.

Пример сохранения строки в текстовом файле:

CFile myfile;

char* pFileName="test.txt";

myfile.Open(pFileName,CFile::modeCreate|CFile::

modeWrite);

myfile.Write("123456789",4);

myfile.Close();

Результатом выполнения этого фрагмента программы будет создание файла test.txt и запись в него строки "1234".

К началу главы

21.4. Класс CPoint

Класс CPoint представляет собой оболочку для структуры POINT (точка) из библиотеки Win32 API, которая объявлена следующим образом:

typedef struct tagPOINT

{

LONG x; //абсцисса точки

LONG y; //ордината точки

} POINT;

Класс CPoint имеет также свойства x и y, представляющие собой координаты точки. Создание объекта точки выполняется с помощью одного из нескольких вариантов конструкторов, включенных в класс.

Один из вариантов создания объекта точки:

CPoint point(200,125);

или

int x=200, y=125;

CPoint point(x, y);

Доступ к свойствам класса открытый, поэтому изменение значений свойств объекта не требует использования функций:

point.x =250;

point.y=point.x–100;

К началу главы

21.5. Класс CRect

Класс CRect включает в себя данные, однозначно определяющие прямоугольную область, и операции над такими областями. Класс представляет собой надстройку структуры RECT, входящей в интерфейс Win32 API:

typedef struct tagRECT

{

LONG left; //Абсцисса левого верхнего угла

//прямоугольника

LONG top; //Ордината левого верхнего угла

//прямоугольника

LONG right; //Абсцисса правого нижнего угла

//прямоугольника

LONG bottom; //Ордината правого нижнего угла

//прямоугольника

} RECT;

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

Конструктор по умолчанию:

CRect();

Конструктор с параметрами:

CRect(int l,int t,int r,int b);

Приведем следующие способы создания объекта прямоугольника:

CRect rect; //Создание объекта без инициализации

//полей

CRect rect (20,30,170,150); //Создание объекта

//и инициализация его полей

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

Класс также содержит методы для работы с данными, например:

Width() – возвращает ширину прямоугольника,

Height() – возвращает высоту прямоугольника,

SetRect() – позволяет изменить размеры уже созданного прямоугольника,

PtInRect() – позволяет проверить, лежит ли заданная точка внутри прямоугольника, определяемого текущим объектом.

К началу главы

21.6. Создание приложений на основе библиотеки MFC в VC++ 6.0

Для создания приложения на основе MFC используется тип проекта MFC AppWizard (exe) [20–21]. Это полноценное 32-разрядное приложение для ОС Windows, использующее для взаимодействия с пользователем стандартное графическое окно Windows.

Мастер приложений позволяет создавать три варианта приложений такого типа: SDI,MDI,Dialog Based. Для каждого варианта приложения создается особый каркас проекта.

SDI-приложение (Single Document Interface), или приложение с интерфейсом одного документа, позволяет программе работать только с одним документом. Примером такого приложения могут быть программы текстовый редактор Блокнот или графический редактор Paint.

MDI-приложение (Multiple Documents Interface), или приложение с интерфейсом многих документов, может одновременно работать с несколькими документами или с несколькими копиями одного и того же документа. Примером такого приложения могут быть некоторые версии текстового редактора Word, Adobe PhotoShop.

Dialog Based Application или приложение, основанное на диалоге, имеет отличительную черту – диалоговую панель, используемую для ввода данных в программу пользователем или для вывода результатов вычислений на экран.

Для создания каркаса приложения необходимы действия:

§ Вызов команды File/New…

§ Настройка параметров проекта в окне AppWizard/Projects:

o тип приложения – MFC AppWizard (exe),

o имя проекта (Name),

o размещение проекта (Location),

o флажок создания нового рабочего пространства в состоянии «установлен».

o нажать OK.

§ Выбор варианта приложения (Single document, Multiple documents или Dialog based).

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

К началу главы

21.7. Приложение, основанное на диалоге

Приложение, основанное на диалоге – это Dialog Based Application, этапы создания которого следующие.

1. Вызов команды File/New…

2. Настройка параметров проекта в окне AppWizard/Projects:

· тип приложения – MFC AppWizard (exe),

· имя проекта (Name),

· размещение проекта (Location),

· флажок создания нового рабочего пространства в состоянии «установлен»,

· нажать OK.

3. Первый шаг мастера: выбор варианта приложения – Dialog based, использовать для ресурсов по умолчанию английский язык.

4. Второй шаг мастера: отменить добавление окна About Box (снять флажок About Box), этим действием мы упростим код программы, остальные настройки можно оставить без изменения, кроме того, можно изменить текст заголовка окна приложения (title).

5. Третий шаг мастера: можно все настройки оставить без изменения; на этом шаге среда получает указание включать автоматически комментарии в текст программы, а также задается способ подключения библиотеки MFC к программе – динамическое подключение (As a shared DLL); для опытных программистов можно отменить добавление в код программы комментариев; при необходимости исполнения разрабатываемого приложения на компьютерах, где не установлены соответствующие файлы библиотеки MFC, сделать статическое подключение библиотеки (As a statically linked library)

На этом работа мастера MFC AppWizard завершается, каркас приложения создан. Рассмотрим, какие классы и файлы мы получили.

В каркас такого приложения вошли два класса: класс приложения, производный от класса библиотеки MFC CWinApp, и класс диалоговой панели, производный от класса CDialog. Среда разработки автоматически дает имена этим производным классам в соответствии со следующим правилом: в начало имени производного класса ставится буква C, затем добавляется имя проекта, а в конце – имя базового класса. Например, если проект получил имя Lab1, то его собственный класс приложения будет иметь имя CLab1App, а класс диалогового окна – CLab1Dlg.

Рассмотрим файловый состав проекта:

Lab1.h и Lab1.cpp – модуль, содержащий описание класса приложения CLab1App;

Lab1Dlg.h и Lab1Dlg.cpp – модуль, содержащий описание класса диалоговой панели приложения CLab1Dlg;

stdafx.h и stdafx.cpp – системный модуль, генерируемый средой для связи с библиотеками C++, прежде всего с библиотекой MFC;

resource.h – заголовочный файл, определяющий идентификаторы элементов управления;

Lab1.rc – файл ресурсов, содержащий описание в текстовом формате диалоговой панели, меню и других ресурсов Windows. Стандартная диалоговая панель (рис. 21.2), создаваемая средой по умолчанию, включает в себя строку заголовка с кнопкой закрытия окна, статический текст «TODO: place dialog controls here» и две кнопки – OK и Cancel; обе кнопки выполняют по умолчанию одно и то же действие – завершение программы.

Рассмотрим пример простейшего диалога: на диалоговую панель помещена кнопка. Когда пользователь нажимает кнопку, появляется стандартное информационное окно MessageBox с сообщением «Команда выполнена!».

Для создания такой программы выполним следующие шаги:

· перейдем на вкладку ResourceView окна Workspace,

· раскроем ветвь диаграммы ресурсов.

Рис. 21.2. Стандартная диалоговая панель

Выделим на диаграмме ресурсов объект – диалоговую панель IDD_LAB1_DIALOG – и в его контекстном меню выберем команду Properties. В открывшемся окне изменим язык ресурса на русский (окно Language). Теперь в диалоговой панели для надписей можно будет использовать кириллицу. Закроем окно Properties.

Дважды щелкнем на объекте IDD_LAB1_DIALOG в окне Workspace, при этом в графическом редакторе откроется диалоговая панель. Удалим с диалоговой панели кнопки OK и Cancel, а также статическую строку «TODO: place dialog controls here».

На панели элементов управления Controls выберите кнопку – объект Button –и укажите щелчком левой кнопки мыши место размещения объекта в диалоговом окне. В окне диалога при этом появится небольшая кнопка с надписью Button1.

Отредактируем свойства кнопки. Для этого выделим кнопку Button1 и в ее контекстном меню выберем команду Properties. Затем в окне ID изменим идентификатор кнопки с IDC_BUTTON1 на IDC_BUTTON_MSG. Изменять идентификатор вовсе не обязательно, но для облегчения чтения программы следует элементам программы давать «говорящие» имена, т. е. идентификаторы, которые не только называют элементы, но и содержат пояснения по данному элементу. Изменим также надпись на кнопке – в окно Caption введем произвольный текст, например, слово «Сообщение». Закроем окно свойств кнопки.

Создадим функцию, вызываемую нажатием кнопки. Для этого из контекстного меню кнопки выберем команду ClassWizard, которая откроет окно ClassWizard, при этом будет активна вкладка Message Maps. Message Maps – карта отображения сообщений – используется при работе с библиотекой MFC для связывания сообщения, элемента управления, реагирующего на это сообщение, и метода, выполняемого при появлении этого сообщения. Более подробно карту сообщений рассмотрим позже.

В окне Message Maps выполним следующие действия: в списке Object IDs активизируем объект IDC_BUTTON_MSG, в окне Message при этом отобразятся два сообщения, на которые реагирует кнопка – BN_CLICKED и BN_DOUBLECLICKED, что означает одиночный и двойной щелчок мышью на кнопке соответственно. В списке Messages выберем сообщение BN_CLICKED, нажмем кнопку Add Function, напечатаем, если нужно, новое имя функции (по умолчанию будет сконструировано имя OnButtonMsg) и нажмем кнопку OK. Функция создана.

Редактируем функцию. Созданная только что функция не выполняет никаких действий, и наша задача - научить ее что-нибудь делать. Для редактирования функции в окне Message Maps должна быть выделена функция OnButtonMsg(), затем нажимаем кнопку Edit Code, после чего активизируется окно с текстом этой функции. Добавим в тело функции текст: MessageBox("Команда выполнена!");

Приложение готово. Откомпилируем его. Согласимся, если будет предложено откомпилировать недостающие файлы. Если при компиляции не будут обнаружены ошибки, выполним приложение.

Рассмотрим более сложную задачу: пользователь вводит число, программа возводит его в квадрат и выводит результат на экран.

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

Для решения задачи выполним следующую последовательность действий.

Перейдем на вкладку ResourceView и дважды щелкнем на элементе IDD_LAB1_DIALOG, при этом в графическом редакторе откроется диалоговая панель.

Добавим в диалоговую панель новую кнопку, для этого элемент управления кнопку Button выберем в панели Controls (элементы управления) и поместим его в нужное место диалоговой панели. Если панель Controls по каким-либо причинам не видна на экране, включите ее командой Tools/Customize/Toolbars.

Зададим свойства кнопки – в ее контекстном меню выберем команду Properties, в окне свойств укажем идентификатор кнопки (ID) – IDC_BUTTON_CALC, в окне Caption введем текст – Вычисления. Закроем окно свойств.

Добавим в диалоговую панель окно редактирования Edit, которое будет использоваться для ввода и вывода информации. В контекстном меню окна Edit выберем команду Properties и зададим идентификатор окну – IDC_EDIT_RESULT. Закроем окно.

Свяжем с окном редактирования IDC_EDIT_RESULT переменную, которая будет использоваться для хранения числового значения, введенного в окно редактирования. Выделим окно редактирования, и в его контекстном меню выберем команду ClassWizard, вкладку Member Variable. В открывшемся окне проверим информацию, помещенную в окна: Project – Lab1, Class – CLab1Dlg. В окне Control IDs выделим объект IDC_EDIT_RESULT, нажмем кнопку Add Variable. В открывшемся окне Add Variable укажем имя переменной, оно обязательно должно начинаться с символов m_, – m_Result, укажем категорию переменной (value – переменная или control – элемент управления) – value, тип переменной – CString. Тип (класс) CString представляет собой последовательность символов – строку, над которой определены некоторые действия, например, сложение. Нажмем кнопку OK, затем второй раз OK, после чего переменная m_Result будет добавлена в программу.

Создадим функцию – обработчик нажатия кнопки, которая будет выполняться при нажатии кнопки. Для этого в контекстном меню кнопки выберем команду ClassWizard. Эта команда позволит нам войти в приложение ClassWizard, генерирующее служебную часть кода класса. В окне ClassWizard на вкладке Message Maps проверим информацию, помещенную в окна: Project – Lab1, Class – CLab1Dlg. В окне Object IDs выделим объект IDC_BUTTON_CALC. В окне Messages выберем сообщение BN_CLICKED. Затем в правой части окна Message Maps нажмем кнопку Add function, в ответ на экране появится окно, предлагающее имя нашей функции – по умолчанию она будет называться

OnButtonCalc(). Можно дать функции другое имя или согласиться с предложенным. После нажатия кнопки OK среда вставляет в программу заготовку для этой функции.

Для редактирования кода функции нажмем кнопку Edit Code окна Message Maps, после чего мы окажемся внутри редактируемой функции.

В тело функции вставим следующие строчки:

UpdateData(TRUE); //Присваивание значений,

//введенных в элементы управления,

//переменным, связанным с этими

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

double Number; //Объявление вещественной переменной

Number=atof(m_Result); //Преобразование переменной //типа CString, связанной с окном

//редактирования, в число

Number*=Number; //Вычисления

m_Result.Format("%lf",Number); //Преобразование

//числового значения в значение

//типа CString и запись

//результата в переменную,

//связанную с окном редактирования

UpdateData(FALSE); //Вывод значений переменных,

//связанных с элементами

//управления, на экран и

//обновление элементов управления

В этом методе использовалась функция UpdateData(), которая устанавливает соответствие между элементами управления на диалоговой панели и связанными с ними переменными. Функция UpdateData() имеет один параметр логического типа. Значение TRUE этого параметра означает, что переменным элементов управления присваиваются значения, введенные в эти элементы; FALSE означает, что элементам управления присваиваются значения из соответствующих переменных. Если параметр не указан, функция по умолчанию использует значение TRUE.

Откомпилируем проект, выполним программу и убедимся, что она работает правильно.

К началу главы

21.8. Использование в приложении элементов управления

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

Наиболее часто используемые элементы управления собраны в панели Controls в виде кнопок и добавляются в проект визуально с помощью мыши:

· рисунок (Picture),

· статический текст (Static Text),

· окно редактирования (Edit Box),

· группа (Group Box),

· кнопка (Button),

· флажок (Check Box),

· радиокнопка (Radio Button),

· комбинированный список (Combo Box),

· окно со списком (List Box).

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

Контекстное меню элемента управления содержит команду Properties (Свойства), с помощью которой можно настроить внешний вид элемента. Окно свойств имеет три вкладки: General – здесь собраны свойства, отвечающие за функционирование элемента; Styles – набор оригинальных свойств, характерных для данного элемента; Extended Styles – универсальный набор стандартных свойств.

Рассмотрим наиболее общие свойства элементов управления.

В разделе General для элементов определяются значения следующих свойств:

ID – идентификатор элемента управления, используется для обращения к элементу в программе, объявление идентификатора помещается в файл resource.h с помощью директивы define;

Caption – строка текста, определяющая надпись на элементе;

Visible – определяет, будет ли элемент отображаться на экране в начале работы программы, тип свойства – логический, по умолчанию имеет значение TRUE;

Disabled – определяет возможность использования элемента. Если свойство имеет значение TRUE, элемент отображается на экране, но не может быть активным; по умолчанию свойство имеет значение FALSE;

Group – определяет первый элемент в группе, имеет логический тип; при формировании группы это свойство может быть установлено только у одного элемента из группы (см. радиокнопки);

Tab Stop – определяет возможность обхода элемента при помощи клавиши Tab, тип логический; если свойство имеет значение TRUE, данный элемент может быть активизирован нажатием клавиши Tab, иначе при повторных нажатиях Tab элемент будет обходиться стороной.

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

В разделе Extended Styles находятся следующие свойства:

Client edge – устанавливает утопленную рамку вокруг элемента управления;

Static edge – устанавливает обычную рамку вокруг элемента управления;

Modal frame – устанавливает объемную рамку вокруг элемента управления;

Transparent – устанавливает прозрачность элемента.

По назначению элементы управления делятся на:

элементы, используемые для отображения (вывода) информации, например, статический текст;

элементы, используемые для сбора (ввода) информации, например, окно редактирования;

элементы, используемые для управления информацией, например, кнопки, флажки.

Все элементы управления представлены в программе объектами соответствующих классов. Так, для создания статической строки используется класс CStatic, окна редактирования – класс CEdit, кнопок – CButton. Все классы, представляющие собой элементы управления, являются потомками класса окна CWnd.

Элементы управления могут хранить некоторые значения. С такими элементами управления в программе связываются специальные переменные, которые представляют свой элемент управления в программе. Эти переменные имеют тот же тип, что и значения, присвоенные элементам управления. Например, окно редактирования хранит строку текста типа CString, в программе представителем этого элемента управления будет переменная того же типа. Связывание элементов управления и переменных в программе осуществляется с помощью мастера MFC ClassWizard, вкладка Member Variables, при этом могут быть созданы переменные двух категорий: значение (value) или элемент управления (control).

Разница между категориями переменных в том, что для категории переменной control происходит автоматическое обновление значения переменной, если изменилось значение в элементе управления, и, наоборот, если во время выполнения программы изменилось значение переменной, связанной с элементом управления, автоматически обновляется значение, хранимое элементом управления. Для категории переменных типа value обновление значений переменных и элементов управления производится с помощью функции UpdateData(). С другой стороны, такие элементы, как кнопки (button), не хранят никаких значений, используются лишь для вызова какой-либо функции и не имеют связанных переменных.

К началу главы

21.9. Мастер классов MFC ClassWizard

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

Окно MFC ClassWizard имеет несколько вкладок Message Maps, Member Variables, Class Info и др.

Message Maps – карта сообщений, связывает в программе сообщение, объект, реагирующий на это сообщение, и функцию, которая выполняется в ответ на это сообщение. При возникновении какого-либо сообщения, например, BN_CLICKED, вследствие нажатия кнопки IDC_BUTTON_MSG вызывается метод OnButtonMsg(); если бы это же сообщение возникло при нажатии другой кнопки, был бы вызван другой метод. При помощи окна Message Maps (рис. 21.3) можно добавить класс (кнопка Add Class…), функцию (Add Function…), отредактировать код функции (Edit Code…), удалить функцию (Delete Function…).

Рис. 21.3. Окно мастера MFC ClassWizard

Member Variables – связывает элементы управления, хранящие какие-либо данные, и переменные, которые являются представителями своих элементов управления в программе. Добавление переменной для элемента управления выполняется в окне Member Variables (рис. 21.4) с помощью кнопки Add Variable…; имя переменной вводится в специальное окно панели Add Member Variable, в начале имени должны быть символы "m_", затем добавляется строка текста, поясняющая связь переменной с элементом управления и ее назначением, например, для окна редактирования IDC_EDIT_RESULT может быть создана переменная с именем m_Result или m_Edit_Result. Для переменной также должен быть установлен тип значения и категория переменной. Категория переменной определяет характер связи между переменной и элементом управления и может принимать одно из двух значений – value или control. Если переменной присвоена категория control, происходит автоматическое обновление значений в переменных при изменении значений, введенных в соответствующие элементы управления, и, наоборот, автоматическое обновление элементов управления, если изменили значения связанные с ними переменные. Если переменной присвоена категория value, автоматического обновления значений не происходит, обновление выполняется функцией UpdateData().

Рис. 21.4. Окно добавления переменной Member Variables.

Следует правильно завершить добавление переменной – нажать кнопку OK для закрытия окна Add Member Variable и кнопку OK для закрытия окна ClassWizard. Игнорирование этих двух кнопок приведет к тому, что переменная не будет добавлена. Обнаружится такая ошибка при компиляции проекта – имя переменной будет неизвестным. Повторное добавление переменной через ClassWizard исправит ошибку.

Class Info – служит для просмотра списка классов, их размещения в файлах и добавления в проект новых классов.

К началу главы

21.10. Установка начального значения элементам управления

Так как набор свойств, устанавливаемых для элементов управления перед запуском программы через окно Properties, ограничен, можно устанавливать начальные значения свойств элементам стандартной функцией OnInitDialog(), которая выполняется один раз при создании диалоговой панели. Редактирование этой функции выполним через ClassWizard следующим образом.

Вызовем ClassWizard, откроем вкладку Message Maps;

В окне Project должно быть установлено имя проекта Lab1, в окне Class name – имя класса диалоговой панели CLab1Dlg;

В окне Object IDs выберем объект – диалоговую панель CLab1Dlg; в окне Messages найдем сообщение WM_INITDIALOG, выделим его, при этом автоматически будет выделена в окне Functions функция OnInitDialog(), так как она уже входит в состав класса диалоговой панели;

Нажмем кнопку Edit Code. После нажатия кнопки в окне редактора откроется модуль, содержащий код этой функции:

BOOL CLab1Dlg::OnInitDialog()

{

CDialog::OnInitDialog();

………………

//TODO: Add extra initialization here

return TRUE;

}

Отредактируем код функции OnInitDialog, добавим следующие строки (они будут выделены жирным шрифтом), место вставки нового кода указывает текст //TODO: Add extra initialization here (добавьте дополнительную инициализацию здесь):

BOOL CLab1Dlg::OnInitDialog()

{

CDialog::OnInitDialog();

………………

//TODO: Add extra initialization here

m_Result="Начальный текст"; //Установка

//начального значения переменной

UpdateData(FALSE); //Обновление экрана

return TRUE;

}

После запуска такой программы окно редактирования будет содержать слова «Начальный текст».

К началу главы

21.11. Элементы управления Picture

Изображение (Picture) – это группа элементов управления, предназначенных для представления графической информации в рамках приложения. С помощью этой группы элементов в диалоговую панель можно вставить: пиктограмму (Icon), растровый рисунок (Bitmap), метафайл Windows (Enhanced Metafile), прямоугольную рамку – кадр (Frame), заполненный прямоугольник (Rectangle).

Рассмотрим порядок размещения изображения на диалоговой панели, для определенности зададим, что наш рисунок представляет собой растровый файл my.bmp:

· скопируйте файл с рисунком в каталог проекта RES;

· откройте вкладку Resource View в окне Workspace, вызовите контекстное меню для папки Lab1 Resources и вызовите команду Import.

· в открывшемся окне найдите и выделите файл my.bmp, затем нажмите кнопку Import; на диаграмме ресурсов в Resource View появится новая папка Bitmap, а наш рисунок будет добавлен в проект под именем IDB_BITMAP1;

· поместите на диалоговой панели элемент управления Picture;

· настройте свойства элемента управления – на вкладке General в окне Type укажите тип изображения – Bitmap, в окне Image выберите ресурс – IDB_BITMAP1. Идентификатор элемента управления ID – IDC_STATIC – можно оставить без изменения.

Размещение рисунка в диалоговой панели закончено.

К началу главы

21.12. Элемент управления Group Box

Группа или групповой блок (Group Box) – это элемент управления, предназначенный для группировки других элементов управления, например, радиокнопок, служит для отображения информации. Используется в комбинации с другими элементами управления.

К началу главы

21.13. Элемент управления Radio Button

Радиокнопка или кнопка-переключатель (Radio Button) – элемент, предназначенный для модификации информации; обычно используется в группе элементов (радиокнопок) для выбора одного из нескольких исключающих друг друга вариантов. Последовательность создания группы радиокнопок следующая.

Поместите в диалоговую панель элемент Group Box. Далее в элемент Group Box поместите радиокнопки, например, три радиокнопки, которым будут присвоены идентификаторы IDC_RADIO1, IDC_RADIO2, IDC_RADIO3 соответственно.

Установите в свойствах радиокнопок подписи к каждой кнопке (caption). Для первой радиокнопки IDC_RADIO1 установите флажок Group (Группа).

Все радиокнопки будут иметь порядковый номер 0, 1, 2 и т. д. Введем для группы радиокнопок переменную, которая будет хранить номер выбранной радиокнопки. Назовем переменную m_Radio1, присвоим ей категорию value и тип значения – int.

Инициализируем группу радиокнопок, т. е. задаем начальный номер выбранной кнопки – в функции OnInitDialog() диалогового окна после текста //TODO: Add extra initialization here (добавьте дополнительную инициализацию здесь) добавим код:

m_Radio1=0; //Устанавливаем первую радиокнопку

UpdateData(FALSE); //и перерисовываем экран

Если вызов функции UpdateData(FALSE) в функции OnInitDialog() уже есть, повторный вызов не нужен.

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

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

К началу главы

21.14. Элемент управления Check Box

Флажок (Check Box) – предназначен для модификации информации; может иметь два (истина, ложь) или три (истина, ложь, не определено) состояния. Предоставляет пользователю возможность логического выбора. Хранит значение типа BOOL (int).

Последовательность работы с элементом Check Box следующая:

· установите элемент на диалоговой панели и настройте его свойства, допустим, элементу соответствует идентификатор IDC_CHECK1;

· установите переменную, связанную с элементом – дайте ей имя m_Check1, присвойте ей категорию – value, тип переменной – BOOL;

· инициализируйте элемент IDC_CHECK1 – присвойте связанной с ним переменной начальное значение TRUE или FALSE, для этого отредактируйте метод OnInitDialog() класса диалоговой панели, добавив после текста // TODO: Add extra initialization here (добавьте дополнительную инициализацию здесь) код: m_Check1=TRUE;

Не забудьте, что для отображения установленного значения элемента Check Box на экране должна быть вызвана функция UpdateData(FALSE).

К началу главы

21.15. Элемент управления List Box

Окно со списком или список (List Box) – это модификатор информации, отображает информацию и одновременно служит для выбора информации. Для создания такого элемента в программе используется класс CListBox. Каждый элемент списка – строка типа CString. Каждая строка имеет порядковый номер (индекс), нумерация строк начинается с нуля. Чтобы включить в программу элемент List Box, выполните следующие действия.

Поместите элемент на диалоговую панель.

Настроийте свойства элемента; измените, если нужно, идентификатор окна или оставьте идентификатор по умолчанию – IDC_LISTBOX1; из свойств обратите внимание на свойство Sort (Сортировка), которое обычно установлено по умолчанию. В этом случае новый элемент не добавляется в конец списка, его положение в списке определяется в результате сортировки. В зависимости от решаемой задачи можно этому свойству оставить значение «установлено» или отменить сортировку.

Создайте с помощью ClassWizard переменную, представляющую окно со списком в программе; для этой переменной установите категорию control, тип – CListBox, имя – m_ListBox1.

Теперь окно со списком готово к работе. Можно создать методы диалоговой панели для добавления элемента списка, удаления элемента из списка, выбора элемента списка и т. д., в которых будут использованы соответствующие методы класса CListBox (табл. 21.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: