В.М. СНem:JБ Практикум прикладного программирования на МРС и С++ в среде VS.NET 2-е издание, исправленное Снетков В.М. Национальный ОжРЬПЫЙ Университет "интуит" 2016 , В.М. CHem:JB Пракmкум приклцного прогр"-,,мирования на MFC н С. + в среде VS.NET Пракшкум прикладного программирования иа MFC и С++ в среде VS.NEfI В.М. CHe1"КDB -М.: Нациоиальный ОткРЫ1ЫЙ Университет "ИНТУИТ", 2016 В курсе представлены лабораторные раБOlЫ, Ю)торые были подготовлены ДfIЯ сryдентов сразу после появления VS.NEf 2003. Материал базируется на применении MFC и С++. НеЮ)торые работы используют VCLC++Builder. Содержание курса oxвa1ыветT различные аспеКlЫ программирования оконных приложений на иеуправляемом С++. На учебных примерах описываются технологии разрабопш пользовательских библиотек и приложений в средах проекшрования VS.NEf 2003 и, 01'JаСП1, C++Builder 6.0. Большое внимание уделено применению ИНС1рументов новой, иа тот момеит, оболочки VS.NEf, Ю)торые в современных версиях в основе своей остались прежними. Несмотря на то, что в последних выпусках библиотека MFC сущеClВенно увеличила свою мощь, базовые принципы ее использования сохранились. поэтому представленный в курсе материал не потерял свою акryальиоClЪ и может быlЪ использован (возможно, с иезначительными дораБOl1(ами) ДfIЯ иачального обучения программированию. (с) 000 "ИНТУИТ.РУ", 2010-2016 (с) Cнe1"КDB В.М., 2010-2016 в.м. CHem:JB Пракmкум приклцного прогр"-,,мирования на MFC н С. + в среде VS.NET MFC 5DI-приложение В первой лекции вы изучите, что такое 5DI и MDI приложения. Выполните конструирование данных класса документа и класса представления. Для практической значимости выполните: отображение круга на экране, рисование круга в произвольной точке экрана. Сохранение и загрузка данных Документа. Изменение заголовка окна приложения и назначение фильтра. Изменение иконки приложения. Русификация меню. Текст в центре клиентской области. Спецификация задачи Файлы к данной лабораторной работе, Вы можете скачать здесь скачать: http://Oи . iпtШ. ruld epartment/se/p пnfсv/ 1 /р го gram. пр. 1. При запуске SDI -приложения внyrри окна представления в 20 точке х=200 , у=100 должен появиться круг радиусом пикселов. 2. Круг перерисовывается с центром в месте щелчка мыlШf. з. Можно сохранить круг в файле и считать его на экран. 4. Предусмотреть возможность печати круга на принтер. s. Основные пункты меню должны дУблироваться кнопками на панели инструментов. б. Пункты меню необходимо русифицировать. 7. Оформить требуемые подсказки в строке состояния главного окна рамки и всплывающие подсказки. 8. Вывести текст в центре окна документа. Приступим К решению поставленной задачи. Создание заготовки приложения • ~ Командой меню Fi le/New/Project вызовите окно мастера создания заготовки, выберите место размещения и задайте имя проекта С i r с 1 е , В.М. CHem:JB Пракmкум приклцного прогр"-,,мирования на MFC н С. + в среде VS.NET .lJ~ ,",',"'''',',",',''''''';:o;o'''''',--__ 11 [iI ,';orrvЫeo: =rms IntellQэrrn А"О)ЮS QR cmsole p'«cltatOO IiIYISL;3I~t !!!IAТL Pro.>J(1 $ У;ш"J С# u::t'~ofio> R-o)1ct ffi Yi"", J# liI Y;,u,! С+ + ~Tl Sm,.-t Dov>:o есОрсl liI о ...... R-ojoct TrP'" ~ E"l'tr Pro,~[t :t=мoe Д:~veX Ш-!Jоl ,~м=c Srrar! ce'~e Ас!"", Cct11:fol Ам=е s.-r...! Do'~~ CLl ~..,32 Smor!C<3'~~ РсОjoc! .lf'ВI'IO:icbw' 5er;~o ,пh Onlho To"l'''tw" LocatOO: "-О\Olm" ::::J Icro.1:o now Sou!bn Г Croote ct,ocbry for юutbn ~u'iOn~~:D' ГIС.~~~~---- • r;;;r Установите вюыДку Application Туре мастера MFC Appli cation Wizard в указанное состояние генерации SDI приложения И-С Аррl<оtiоп Wi,ord Corc!e '.0'.; .', Applic<dkm Typ~ чрtа00f11}ор8' ProjEC!sЦle: ~~\:atOO TJP3 r. :>;-,ge dccL.-r..-:t r \','mc.., E1I'n" Ccщ>cLrd ~! SLp:or\ rt!JJtple~ts r.""'C~d ="~"" Terцclate 51:frq3 r Q.i.~b.""d s'-',)pCrt U""of~C D,ru,эо Г <со ~r." 1'1">] (о "'О и=е .., ~ ,h..-od CLl u""г н..-f,ю, Fodll.", r UЭ!: мое.., ~ ,t>,~ Ih""l ACt';n:oo F8a1fe< Gooor3'Od С!;;С""" C"",~I в.м. CHem:JB Пракmкум приклцного прогр"-,,мирования на MFC н С. + в среде VS.NET • [;$' Состояние остальных ВЮIaДОК пусть останется установленным по умолчанию, а име,н~н;;о;;:=====::::::=:..,;~ И-С Аррl<оtiоп Wi,ord Corcle !!!! .1J~ D"tab"a;e Support D"taba93 sц:p:<1: .o.pplcatoo Туре (."~ Ccщ>c<.rd Doo.xnent SLp:ort (" fieЮ3" (*" "'~ =U~"" Terrpam 5trrq3 (" D.G!b,,"o ~iow w,1tJootfik> o~ Do\>t.±.e 5.+Р<>! (" oa~ ,~". w;tl, fle щ:p:f1 u,..,.-h!:!>-Г~F"d!l.<"" A"';n:OO FeaVes Gooor3'Od CI;>O<<>< Со"," СЕ. ~',;., ff.mo oty~: р Ih~, ij-ycc Р MГjrr)>E to: PM~"'rI'" ь", r M!:im;:ed Гма!I'r~Ю Ps.\'"",m"""", Р Abcct!;oo: r '''" (." SQ"dard lIxll1Q Pht,,"S~bif r Si1ltwnoo," Г Вra,;:= ct)k> HaMFC нС.+ 0,. ...... '_ A(N,.-.:OO reаы-ез' nt:IJrr IJe< 01 nles ()f1 roc""t (., I~t: .'.pplc,",oo Туре Г =te,t-ш-ыr.e~" Ссщ>сcrdDoo.xnentSLp:ort r Yl<nHolpf:O-rr« ,""",-пnr~, " H~~ ~oj~ Foт-rn.! D,ru,зо SL>,>PCrt р EYnt,-,. dПd prnt P""~ ".",... h'и"f.юо F.""".", Г A~toOl..tbn Р A<:t~"X aJ"ЦoI, Г МАР! (/-'<><'"'3"'3 АР!) Г ~sю;:kе:s Г Actwo 6o:o"Ibii'i Р СОm'Юl = 1fol Wi<lIE t На последней вкладке цифра 4 означает размер списка последних обработанных документов. • 1;$ Просмотрите все вкладки мастера и нажмите кнопку F i n i s h, чтобы мастер создал заготовку приложения • 1;$ в раскрывающемся списке Solution Configur ations поменяйте режим работы оболочки с Debug на Release, чтобы ОТЮlючить генерацию отладочного кода при сборке проекта • 1;$ Запустите заготовку, созданную мастером, на компиляцию и Buil d/Bui ld Solut ion, линковку командой а затем на Debug/Start Debugging (F5) выполнение командой Windows Появится полноценное окно с однодокументным интерфейсом ( SDI ) , в.м. CHem:JB Пракmкум приклцного прогр"-",,ирования на MFC н С. + в среде VS.NET ~. Untitled - Circle - о 2>.J Fie Edit Viw€ ~ Ready Конструирование данных класса документа в массе документа нам нужно добавить поля, в которых будуг храниться координаты центра БУдущего круга . • r;;;r Вызовите панель View/Soluti on Expl orer и в дереве файлов проекта двойным щелчком откройте на редактирование заголовочный файл Circ l eDoc . h • 1;$ Найдите объявление масса CCircl eDoc и добавьте в него объявления полей, которые будуг хранить координаты центра круга Объявления полей в массе документа CCircleDoc class CCircleDoc : public CDocument { protected: 11 create fгoт sегializatiоп опly CCircleDocO; , В.М. CHem:JB Пракmкум приклцного прогр"-,,мирования на MFC н С. + в среде VS.NET DECLARE_DYNCREAТE(CCirc!eDoc) 11 Аttгшutеs риыic: iпt ш_РоsХ; 1/ координата х (по горизонтали) центра круга iпt m_PosY; // координата у (по вертикали) центра круга I/ Operations риЬlic: ) в объявлении класса язык С++ не допускает инициализацию членов данных (кроме перечисления епит ). Поэтому инициализацию поместим в функцию-член масса, которая выполняется при создании нового документа. Для этого • r;;:.-- В раскрывающемся списке Functions in CCircleDoc (сведения о CCircleDoc ) выберите функцию-метод OnNewDocument() Именно функция OnNewDocument () срабатывает при создании . нового документа • U$ Внесите в функцию OnNewDocument () код инициализации объявленных координат круга Инициализация полей в функции ОnNеwDосшnепtО масса CCirc! BOOL CCircleDoc::OnN еwDосumeпtО { if (!СDосшnепt::ОnN еwDосumeпtО) геtшп FALSE; 1/ ТООО: add геinitializatiоп code here 1/ (SDI documents will reuse this document) ш_РоsХ = 200; ш_РоsУ = 100; , В.М. CHem:JB Пракmкум приклцного прогр"-,,мирования на MFC н С. + в среде VS.NET return ТRUE; ) Конструирование данных класса представления Схема "Документ-Представление" реализует отношение "один ко многим", т.е. одни и те же данные класса Документа можно по разному отображать пользователю в классах Представления. В нашем случае будет только одно представление данных Документа. Класс Представления ее i r с 1 е Vi ew будет выполнять непосредственное взаимодействие с пользователем и в нем тоже понадобятся поля для хранения координат центра круга. • [j.$' Через панель Solution Explor e r откройте заголовочный файл eircleView . h, найдите объявление класса eCircleView и внесите в него объявления переменных членов, которые будуг хранить координаты центра круга Объявления полей в классе представления CCircleView class CCircleView : public CView ( protected: 11 create fгoт serialization опly CCircIeVJt'wO; DECLARE_DYNCREAТE(CCirc!eView) 11 Аttrшutеs риыic: CCircleDoc* GetDocument() const; int m_PosX; 11 координата х (по горизонтали) центра круга int m_PosY; 11 координата у (по вертикали) центра круга II Operations риЬlic: ) ; Значения полей, хранящих координаты центра круга, в классе Документа и в классе Представления всегда должны совпадать, поэтому