Задание 4. Отображение диалогового окна и данных в его элементах управления




Мы написали код, управляющий диалоговым окном Format при его отображении, но в процессе работы программы диалоговое окно не отображалось. Обычно в приложениях Windows диалоговые окна открываются командами меню. Исключением является приложение, в котором диалоговое окно является главным окном. Для добавления команды меню, открывающей диалоговое окно Format, выполните следующие действия

1. Откройте окно редактора ресурса меню. выполнив двойной щелчок на идентификаторе IDR_MAINFRAME в узле Menu графа ресурсов.

2. Создайте меню как на рис. 6.14, заменив надпись File на надпись &Text, удалив из этого меню все комнады,.кроме Exit и добавив команду с надписью &Format...\tCtrl+F. Определите идентификатор команды ID_TEXT_FORMAT.

3. Если в процессе удаления команд меню был удален разделитель перед командой Exit, то вставьте его.

4. Сохраните изменения в файле сценария ресурсов, выполнив команду File4Save All

5. Чтобы при последующей работе с проектом (после его повторного открытия) в свойствах команд меню отображались введенные ранее идентификаторы, скорректируйте файл FontDemo.rc, заменив численное значение идентификатора команды &Format...\tCtrl+F на значение ID_TEXT_FORMAT, открыв этот файл в редакторе Notepad. Сохраните файл FontDemo.rc.

6. Затем в таблицу горячих клавиш Accelerator4IDR_MAINFRAME добавьте комбинацию клавиш для команды Format. Используйте метод, описанный в предыдущих главах, определяя одинаковый идентификатор ID_TEXT_FОRMАТ и для команды Format, и для комбинации клавиш Ctrl+F.

7. Когда ресурсы программы будут определены, сохраните результаты работы, выбрав команду Save All в меню File или щелкнув на кнопке Save All в стандартной панели инструментов Developer Studio.

 

 

Рис. 6.14. Меню Text программы FontDemo

 

8. Постройте программу и протестируйте ее, выполнив команду Debug4Start. Вы увидите главное окно программы с заданными командами меню. Команда Format не доступна, поскольку отсутствует обработчик командного сообщения. Окно приложения показано на рис. 6.15.

Определите обработчик сообщения, получающий управление при выборе в меню команды Format или нажатии клавиш Ctrl+F. Для этого выполните п. п. 9 — 13 задания 4.

9. Откройте окно Class View и выберите класс CFontDemoDoc в списке классов, чтобы обработчик сообщений был добавлен в класс документа программы. В программе FontDemo выбор класса для обработки команды Format несколько произволен. Однако в реальных текстовых процессорах команда Format непосредственно воздействует на данные, сохраняемые в документе (а не на определенное представление документа или на приложение в целом). Поэтому рекомендуется обрабатывать команду с помощью класса документа.

10. Откройте окно Properties. Щелкните на кнопке Events (с изображением молнии) и раскроется список идентификаторов команд. Выберите идентификатор ID_TEXT_FORMAT, соответствующий команде меню Text4Format….. В списке сообщений выберите сообщение COMMAND и команду <Add> OnTextFormat. В файл заголовка класса документа добавится объявление функции CFontDemoDoc::OnTextFormat(), в файл реализации класса документа добавится ее шаблон.

11. В функцию CFontDemoDoc::OnTextFormat() добавьте код, в котором создайте экземпляр класса диалогового окна CFormatDlg и вызовите функцию CDialog::DoModal() для открытия модального диалогового окна. Для модального диалогового окна этот объект обычно определяется как локальная переменная, удаляемая сразу после завершения функции, в которой она определена.

void CFontDemoDoc::OnTextFormat()
{
// TODO: Add your command handler code here
CFormatDlg m_FormatDlg;
m_FormatDlg.DoModal ();

}

12. Добавьте в файл FontDemoDoc.cpp реализации класса документа директиву препроцессора для включения файла заголовков FormatDlg.h, содержащего интерфейс класса диалогового окна, в его реализацию, чтобы можно было использовать константы с номерами переключателей и соответствующие стили.

 

#include "stdafx.h"
#include "FontDemo.h"
#include "FontDemoDoc.h"
#include "FormatDlg.h"

13. Постройте программу и протестируйте ее.

Вы увидите окно, в котором команды меню Text доступны. Щелчок на команде Format отображает на экране диалоговое окно. Выбор переключателей и установка флажков приводят к отображению в области Sample образца текста.

Задание 5. Отображение текста в окне представления
в соответствии с выбранными в диалоговом
окне атрибутами

Мы поставили задачу получить в окне представления строки, отформатированные в соответствии с установками, выбранными в диалоговом окне, после его закрытия нажатием кнопки OK. Внесите необходимые дополнения в код класса документа и класса представления. Это необходимо для использования данных объекта документа при выводе текста в окне представления программы.

1. Добавьте определения переменных в интерфейс класса CFontDemoDoc в файле FontDemoDoc.h. Для этого можно воспользоваться окном редактора кода и внести соответствующие объявления с клавиатуры. Можно вызвать мастер Add Member Variable Wizard для добавления переменных-членов класса CFontDemoDoc по команде контекстного меню Add4Add Variable… и повторить действия параграфа «Определение класса диалогового окна и добавление переменных-членов». В результате в файл FontDemoDoc.h добавятся следующие строки.

// FontDemoDoc.h: interface of the CFontDemoDoc class
class CFontDemoDoc: public CDocument
{
//объявления атрибутов и методов
//...
public:
afx_msg void OnTextFormat();
bool m_Bold;
bool m_Italic;
bool m_Underline;
int m_Justify;
int m_Pitch;
int m_Spacing;
};

2. Добавленные переменные сохраняют значения параметров форматирования документа и соответствуют переменным класса диалогового окна с такими же именами. Если вы добавляли переменные
с помощью мастера Add Member Variable Wizard, то в конструкторе класса документа появился список инициализации этих переменных. Измените значения, которыми инициализируются переменные в конструкторе класса CFontDemoDoc в файле FontDemoDoc.cpp, заменив нулевые значения переключателей значениями, которые в примере выделены полужирным шрифтом.

CFontDemoDoc::CFontDemoDoc()
: m_Bold(false)
, m_Italic(false)
, m_Underline(false)
, m_Justify(JUSTIFY_LEFT)
, m_Pitch(PITCH_VARIABLE)
, m_Spacing(1)
{
// TODO: add one-time construction code here
}

3. Измените функцию CFontDemoDoc::OnTextFormat(). В окне редактора кода добавьте операторы, которые копируют данные о форматировании из переменных объекта документа в переменные объекта диалогового окна, с которыми они связаны. Это необходимо для использования текущих значений переменных при первом открытии диалогового окна. Вызовите функцию CDialog::DoModal() для отображения диалогового окна. Если его закрыть, щелкнув на кнопке OK, то функция CDialog::DoModal() возвращает значение IDOK. В этом случае функция CFontDemoDoc::OnTextFormat() должна передать новые значения переменных объекта диалогового окна обратно переменным объекта документа, а затем вызвать функцию CDocument::UpdateAllViews(), инициирующую перерисовку окна представления. При нажатии кнопки Cancel функция CDialog::DoModal() возвращает значение IDCANCEL. В этом случае переменные объекта документа остаются неизменными, а MFC не проверяет и не сохраняет содержимое элементов управления. В приведенном коде закомментированы строки первоначального варианта функции

void CFontDemoDoc::OnTextFormat()
{
// TODO: Add your command handler code here
CFormatDlg m_FormatDlg;
// m_FormatDlg.DoModal ();
// инициализиолвать переменные-члены класса диалога:
m_FormatDlg.m_Bold = m_Bold;
m_FormatDlg.m_Italic = m_Italic;
m_FormatDlg.m_Justify = m_Justify;
m_FormatDlg.m_Pitch = m_Pitch;
m_FormatDlg.m_Spacing = m_Spacing;
m_FormatDlg.m_Underline = m_Underline;
// отобразить диалоговое окно:
if (m_FormatDlg.DoModal () == IDOK)
{
//сохранить значения, установленные в диалоговом окне:
m_Bold = m_FormatDlg.m_Bold;
m_Italic = m_FormatDlg.m_Italic;
m_Justify = m_FormatDlg.m_Justify;
m_Pitch = m_FormatDlg.m_Pitch;
m_Spacing = m_FormatDlg.m_Spacing;
m_Underline = m_FormatDlg.m_Underline;
//перерисовать текст :
UpdateAllViews (NULL);
}
}

4. Функция CDocument::UpdateAllViews()инициирует перерисовку окна представления и передает управление функции CFontDemoView::OnDraw() класса представления. Получив управление, функция OnDraw()классаCFontDemoView перери -



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-04-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: