КАТЕГОРИИ: Архитектура-(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. Добавьте в программу меню в соответствии с приведенными выше желанными методическими указаниями. Для этого создайте новый ресурс меню с такими командами и ресурсными идентификаторами:
Для всего меню задайте идентификатор 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; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |