Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Сценарий выполнения первой части работы




Шаг 1. Создайте приложение MFC с графическим интерфейсом (не консольное). Предполагается, что проекту присвоено имя CNTXMenu. Оставьте все свойства по умолчанию, кроме типа приложения: выберите, для разнообразия, приложение с единственным документом и без поддержки архитектуры документ/вид (рис. 1). Налягьте на Finish.

 

 
 

Рис. 1. Задание вида приложения

 

Сгенерированное мастером приложение имеет класс вида CChildView, класс окна-рамки CMainFrm и класс приложения CCNTXMenu – проверьте на всякий случай, все ли Вам выдали мастера ИС.

 

Шаг 2. Изменим начальный размер окна приложения, несколько уменьшив его по сравнению с размером по умолчанию. Для этого в конец функции CCNTXMenuApp::InitInstance() добавим следующий код:

 

 
 

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

Команда меню Идентификатор
Загрузка файла с изображением ID_OPENIMAGE
Сохранение изображения в файле ID_SAVEIMAGE
Растянуть изображение на все окно ID_SIZE_FILL
Масштаб 50% ID_SIZE_HALF
Масштаб 100% ID_SIZE_ORIGINAL
Масштаб 200% ID_SIZE_DOUBLE

 

Для всего меню задайте идентификатор IDR_CNTXMENU.

 

Замечание. Конечно, на шаге 2 для изменения размеров окна при запуске можно было бы просто запустить программу на выполнение, изменить размеры окна программы и элементарно завершить ее работу: в следующий раз при запуске программа, как миленькая, имела бы заданный Вами мануально нужный размер окна. Но мы легких путей не ищем, не так ли? Ну и кроме того наш путь лучше – догадайтесь почему и поделитесь своей прозорливой догадкой с преподавателем.

Шаг 4. Добавьте в класс вида CChildView обработчик сообщения WM_CONTEXTMENU:

 
 

 

Запустите приложение на выполнение и проверьте вызов контекстного меню с помощью ПКМ. Если получилось – похвалите себя, пока не поздно. Прочтите в MSDN, для чего предназначена функция CMenu::TrackPopupMenu() и какие она имеет параметры, а то не сможете ответить на контрольно-убийственный вопрос преподавателя.

 

Шаг 5. Добавьте в файл ChildView.h подключение заголовочных файлов и описание перечисления (в глобальную область, перед описанием класса CChildView):

 
 

 

В тело класса CChildView (тот же файл ChildView.h) добавьте описание таких членов:

private:

CImage imgOriginal;

int m_nFilterLoad;

SizesEnum m_nImageSize;

 

MFC класс CImage мы будем использовать для работы с изображениями, а в переменной m_nFilterLoad будет храниться индекс текущего выбранного фильтра загруженного файла.

В конструкторе класса CChildView (файл ChildView.cpp) инициализируйте переменную:

m_nImageSize = SIZE_NONE;

 

Проверьте, что приложение компилируется и собирается без ошибок.

Шаг 6. Добавьте в класс вида обработчик команды меню ID_OPENIMAGE, с помощью которой пользователь будет выбирать файл с изображением:

 

 
 

 
 

 
 

 

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

Внимательно изучите код функции CChildView::OnOpenimage(). Что означает описание CSimpleArray <GUID> aguidFileTypes, зачем оно нужно?

 

Шаг 7. Добавьте код отрисовки изображения в функцию CChildView::OnPaint( ):

 
 

 
 

 

Запустите приложение на выполнение, откройте какой-нибудь файл с поддерживаемым системой форматом. Изображение картинки должно появиться в окне программы в масштабе 1:1, что не очень удобно, особенно при отсутствии скроллинга окна.

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

 

Шаг 8. Добавьте обработчик команды меню ID_SAVEIMAGE и добавьте в него приведенный ниже код. Обратите внимание, что при сохранении изображения пользователю предоставляется возможность изменения формата изображения, например, файл.bmp можно сохранить в формате jpg.

 
 

 
 

 
 

 

 

Шаг 9. Теперь нам надо добавить обработчики команд меню, масштабирующих изображение. Код масштабирования уже реализован в методе CChildView::OnPaint() и, посему, нам остается только присвоить корректное значение члену m_nImageSize перед вызовом функции OnPaint(). В связи с этим целесообразно создать один-единственный обработчик для всех команд масштабирования, так как они функционально подобны. И, о чудо!, такая возможность есть! При этом, однако, придется вручную добавлять такой «групповой» обработчик команд меню.

Модифицируем (ручками) карту сообщений, приведя ее к следующему виду (файл ChildView.cpp):

 

 

Обратите внимание на новый макрос ON_COMMAND_EX, с помощью которого разным командам ставится в соответствие один и тот же обработчик.

В тот же файл, опять-таки вручную, добавим обработчик команд масштабирования контекстного меню:

 
 

 

И, наконец, надо добавить прототип этого метода в заголовочный файл ChildView.h:

public:

afx_msg BOOL OnSize(UINT nID);

 

Как Вы уже догадались, каркас приложения передает методу OnSize() в качестве параметра nID идентификатор выбранной команды меню. Если бы у нас была уверенность в том, что идентификаторы имеют последовательные номера, то код метода можно было бы упростить.

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

Шаг 10. Видом команд контекстного меню и их состоянием можно управлять. Например, в нашем случае до загрузки файла с изображением все темы меню, кроме собственно загрузки файла, логично сделать недоступными. В частности, недурно метод CChildView::OnContextMenu() сделать таким:

 
 

 




Поделиться с друзьями:


Дата добавления: 2014-12-26; Просмотров: 390; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.021 сек.