Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Комп'ютерна інженерія
Кафедра:
Не вказано

Інформація про роботу

Рік:
2013
Тип роботи:
Методичні вказівки до виконання розрахунково-графічної роботи
Предмет:
Об’єктно-орієнтоване програмування

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ ”ЛЬВІВСЬКА ПОЛІТЕХНІКА” ПРОГРАМУВАННЯ, ЧАСТИНА 2 (ОБ’ЄКТНО-ОРІЄНТОВАНЕ ПРОГРАМУВАННЯ) МЕТОДИЧНІ ВКАЗІВКИ до виконання розрахунково-графічної роботи для студентів базового напряму ”Комп’ютерна інженерія” Затверджено на засіданні кафедри ”Електронно-обчислювальних машин” Протокол № 10 від 18.03.2013 р. Львів 2013 Програмування, частина 2 (Об’єктно-орієнтоване програмування): Методичні вказівки до виконання розрахунково-графічної роботи для студентів базового напряму ”Комп’ютерна інженерія”. Укл.: М.В.Олексів, Ю.В.Морозов – Львів: Видавництво Національного університету “Львівська політехніка”, 2013. – 39 с. Укладачі Олексів М. В., к.т.н., асистент Морозов Ю.В., к.т.н., доцент Відповідальний за випуск: Мельник А. О., професор, завідувач кафедри Рецензент РОЗРОБКА ДІАЛОГОВИХ ПРОГРАМ ЗАСОБАМИ MFC Мета: Оволодіти навиками розробки програм з графічними діалоговими інтерфейсами з використанням бібліотеки класів MFC. ТЕОРЕТИЧНІ ВІДОМОСТІ Концепція роботи windows програм Програма, що написана мовою С/С++, з консольним інтерфейсом працює від початку функції main до її кінця. Для здійснення операцій вводу/виводу програма викликає функції вводу/виводу операційної системи (ОС). ОС не викликає прикладну програму. Windows програма з віконним інтерфейсом працює навпаки. Програма тільки запускається операційною системою і все. Далі програма нічого не робить, а чекає поки не отримає повідомлення від ОС, яке потім буде опрацьовуватися. Повідомлення – це сигнал про те, що відбулася деяка подія. Будь-яка подія супроводжується повідомленнями, що надсилаються або конкретному вікну, кільком вікнам, чи всім вікнам одразу. Деякі події можуть породити ще кілька подій, наприклад створення вікна супроводжується його перемальовуванням. Прикладами події є переміщення курсору мишки, натискання кнопки, тощо. На відміну від звичайних С/С++ програм, де операції в програмі виконувалися лінійно, в Windows програмах виконується опрацювання повідомлень, які з’являються в довільному порядку, тобто неочікувано (асинхронно). Цим Windows програма схожа на обробник переривань. Повідомлення мають унікальний номер і часто мають символьні мнемонічні позначення, наприклад WM_PAINT замість 0x000F, і два числові параметри. Список повідомлень є у файлі winuser.h. Сюди можна додати свої повідомлення з унікальними номерами. М Повідомлення передається програмі від ОС через спеціальну функцію Windows. Після чого вони надходять в чергу повідомлень програми, яка об’являється наступним макросом в класі діалогу: DECLARE_MESSAGE_MAP(). При надходжені повідомлення з черги на обробку відбувається пошук його номера в карті повідомлень. При наявності номера повідомлення в карті повідомлень відбувається виклик зв’язаного з повідомленням обробника. Повідомлення, що відслідковуються і мають свої нестандартні обробники заносяться між макросами BEGIN_MESSAGE_MAP і END_MESSAGE_MAP. Макрос обробника повідомлення має наступну структуру: тип повідомлення, наприклад ON_BN_CLICKED, ON_COMMAND,....; номер повідомлення; назва обробника події. Наприклад: BEGIN_MESSAGE_MAP(C***App, CWinApp) ON_COMMAND(ID_HELP, &CWinApp::OnHelp) END_MESSAGE_MAP() BEGIN_MESSAGE_MAP(CLogin, CDialog) ON_BN_CLICKED(IDOK, OnBnClickedOk) END_MESSAGE_MAP() Події можна генерувати вручну методами SendMessage – синхронний метод (чекає поки повідомлення не буде опрацьоване), PostMessage – асинхронний метод (не чекає на опрацювання повідомлення, а продовжує виконання програми). Структура віконної діалогової MFC програми Бібліотека Microsoft Foundation Classes (MFC) дає можливість розробляти GUI-застосунки для Microsoft Windows на мові C++ з використанням багатого набору бібліотечних класів. Велика частина MFC є відносно тонким об'єктно-орієнтованим шаром над Windows API. Це рішення, з одного боку, підвищує продуктивність, але, з другого боку, успадковує всі недоліки дизайну Windows API і перешкоджає перенесенню програм на інші платформи. Типова діалогова програма, що написана з використанням бібліотеки класів MFC складається з двох основних класів: класу C***App і класу C***Dlg, де замість зірочок по замовчуванню мітиться назва проекту. Клас C***App містить метод InitInstance(), з якого починається виконання програми і створення об’єкту програми theApp. В функції InitInstance() ініціюється черга повідомлень, створюється об’єкт діалогу, до нього приєднується вікно діалогу і діалог відображається на екрані. Початково діалог містить 2 кнопки “OK” і “Cancel”. Кожна з них має свій обробник, який можна редагувати. Клас C***Dlg містить функції OnInitDialog() та OnPaint(). В функції OnInitDialog() налаштовується зовнішній вигляд вікна діалогу та можна робити деякі початкові налаштування і присвоєння до моменту відображення діалогу. На момент виклику більшість об’єктів вже створено. Функція OnPaint() здійснює вивід вікна діалогу на екран. Кожен з класів містить карту повідомлень. При створенні проекту діалогової програми у MS Visual Studio ці класи генеруються автоматично. Особливістю класу діалогу є те, що у нього інкапсулюються об’єкти, що прив’язані до контролів (кнопок, радіо кнопок, полів введеня тощо), меню, та інші об’єкти, що реалізують бізнес логіку програми. Структура бібліотеки класів MFC Структура бібліотеки класів MFC відображена на діаграмі класів (див. рис.1). В основі більшості класів бібліотеки MFC лежить базовий клас CObject. Як видно з рис. 1 клас, що забезпечує роботу з діалогами (CDialog), знаходиться в ієрархії класів CObject → CCmdTarget → CWnd. Отже, завдяки спадкуванню, клас діалогу CDialog володіє всією функціональність цих класів. Найціннішим у цій ієрархії є клас CWnd, який має множину методів, що забезпечують керування відображенням діалогу, обмін даними між контролами і змінними до яких вони прив’язані за допомогою механізму DDX/DDV; методи взаємодії з чергою повідомлень, меню, стандартними обробниками деяких подій, таймером. Базовий віконний клас CWnd описаний нижче. Члени Дані m_hWnd – містить хендл вікна (HWND), що відповідає вікну. Функції стану вікна GetActiveWindow – Повертає активне вікно. GetFocus – Повертає об’єкт CWnd, що є у фокусі. GetWindowContextHelpId – Повертає ідентифікатор контексту довідки. ModifyStyle – Модифікує стиль поточного вікна. SetWindowContextHelpId – Встановлює ідентифікатор контексту довідки. Розмір і позиціонування вікна CloseWindow – Мінімізує вікно. GetClientRect – Повертає розміри клієнтської області вікна. GetWindowRect – Повертає екранні координати вікна. SetWindowPos – Changes Змінює розмір, розташування і порядок дочірніх, виринаючих (pop-up) вікон і вікон верхнього рівня. SetWindowRgn – Встановлює область вікна. Функції доступу до вікна FindWindow – Повертає хендл вікна, яке ідентифікується за допомогою імені і класу вікна GetDlgCtrlID – Якщо вікно CWnd є дочірнім, то виклик цього методу повертає його ідентифікатор. GetDlgItem – Повертає контрол, що розташований у вікні діалозгу, якому відповідає ідентифікатор, що передається у метод через параметр. UpdateData – Встановлює значення у контрол, або читає значення з контролу, який розташований на діалозі. UpdateDialogControls – Викликаєтсья для оновлення стану контролів на діалозі. Методи Оновлення/Перемалювання вікна GetDC – Повертає контекст відображення клієнтської області вікна. GetWindowDC - Повертає контекст відображення цілого вікна включаючи заголовок вікна, меню і елементи прокрутки (scroll bars). Invalidate – Перемальовує (оновлює) клієнтську область. ReleaseDC – Вивільняє контексти клієнтської області і вікна, забезпечуючи доступ іншим засобам. ShowWindow – Показує/приховує вікно. Функції перетворення координат ClientToScreen – Перетворює координати точки або прямокутника з системи координат клієнтської області вікна у систему координат екрану. MapWindowPoints – Перетворює множину точок з просторо координат поточного вікна у прості координат іншого вікна. ScreenToClient – Перетворює екранні координати вказаної точки або прямокутника у систему координат клієнтської області вікна. Текстові функції вікна GetWindowText – Повертає текст, що міститься у вікні, або заголовок вікна (caption). SetWindowText – Встановлює текст у вікні або заголовок вікна (caption). GetFont – Повертає поточний стиль тексту. SetFont – Встановлює поточний стиль тексту. Функції взаємодіє з елементами діалогів GetDlgItemInt – Перетворює текст, що міститься у контрлі на діалозі, у цілочисельне. GetDlgItemText – Повертає заголовок, або текст, що асоціюється з контролом. SendDlgItemMessage – Посилає повідомлення контролу на вікні. Функції по роботі з меню GetMenu – Повертає вказівник на меню діалогу. SetMenu – Встановлює вказане меню як меню діалогу. Функції по роботі з таймером SetTimer – Встановлює системний таймер, що посилає при спрацюванні повідомлення WM_TIMER. KillTimer – Усуває системний таймер. Функції повідомлень MessageBox – Створює і відображає вікно з вказаним повідомленням. Фіунції керування повідомленнями вікна PostMessage – Розміщує повідомлення у черзі повідомлень програми, після чого завершує свою роботу не чекаючи на опрацювання розміщеного повідомлення. PreTranslateMessage - Використовується CWinApp для фільтрації повідомлень вікнам перед тим як вони надсилаютсья у віконні функції TranslateMessage і DispatchMessage. SendMessage - Sends a message to the CWnd object and does not return until it has processed the message. Перевизначаються DoDataExchange – Використовується механізмом DDX/DDV. Викликається методом UpdateData. WindowProc – Забезпечує віконну процедуру для даного вікна (Класично – саме віконна процедура здійснює керування опрацюванням повідомлень (визначає який метод яке повідомлення опрацьовує), але у MFC, по замовчуванню, керування опрацюванням повідомлень відбувається через карту повідомлень. Команда довідки Обробники і Функції OnHelp – Викликається при натисканні кнопки F1 (Довідка). Обробники повідомлень ініціалізації OnInitMenu – Викликається перед активацією меню. OnInitMenuPopup - Викликається перед активацією виринаючого (pop-up) меню. Загальні обробники повідомлень OnClose – Викликається при надходжені сигналу закриття вікна. OnCreate – Викликається при створені вікна. OnCtlColor - Викликаєтсья коли поточне вікно є батьківським вікном контрола перед тим, як контрол буде перемальованим. OnSize – Викликається коли розмір поточного вікна змінився. Обробники повідомлень операцій введення OnChar – Викликається коли натиснута несистемна клавіша. OnLButtonDblClk – Викликається при подвійному натисканні лівої кнопки мишки. OnLButtonDown - Викликається при натисканні лівої кнопки мишки. OnLButtonUp - Викликається при відтисканні лівої кнопки мишки. OnMouseMove – Викливкаєтсья коли курсор мишки перемістився. OnMouseWheel – Викликається коли користувач прокрутив колесико мишки . OnTimer – Викливкається при спрацюванні таймеру, що створений методом SetTimer. Опертаори operator HWND – Викливається щоб отримати хендл вікна. Характеристика деяких класів бібліотеки MFC CEdit – клас реалізує Edit Box, найпростіший текстовий редактор. CRichEditCtrl - клас реалізує Rich Edit Control, текстовий редактор, що за своєю функціональністю схожий на wordpad. CStatic – реалізує можливість розміщувати на діалозі статичний текст. CButton – різні кнопочки: радіо-кнопочки, кнопочки, чекбокси. CListBox – вікно з списком (текстовий список, де кожен елемент є з нового рядка, може містити в кожному з полів невидиму додаткову інформацію) CComboBox – реалізує випадаючий список. CDC – клас, що реалізує контексти пристроїв. Графічне розміщення інформації можливе переважно за допомогою маніпулювання класами пензлика, ручки, палітри в контексті пристрою. Контексти пристроїв є апаратно-залежними, тобто можуть відображати однакові значення кольорів в залежності від можливостей конкретного пристрою. CString - клас реалізує текстові рядки. Клас описаний у MSDN в розділі CStringT Class. Методи класу CString описані в розділі MSDN присвяченому CStringT Members. Меню Меню в MFC реалізовується за допомогою класу CMenu. Цей клас інкапсулює в собі об’єкт Windows, що визначається дескриптором HMENU. Конструктор об’єкт класу CMenu створює екземпляр класу, але не саме меню! Після створення об’єкту треба використати спеціальні функції для його безпосереднього створення, або завантажити його з ресурсів. Щоб отримати вказівник на меню треба викликати метод класу CWnd:: GetMenu(). Приклад: CWnd* pMain = AfxGetMainWnd(); // The main window _can_ be NULL, so this code // doesn't ASSERT and actually tests. if (pMain != NULL) { // Get the main window's menu CMenu* pMenu = pMain->GetMenu(); .... } далі меню можна редагувати програмно. Рис. 1. Діаграма класів MFC КОНТРОЛЬНІ ПИТАННЯ 1. Що таке MFC? 2. Охарактеризуйте базовий віконний клас CWnd? 3. Які класи бібліотеки MFC ви знаєте? 4. Структура типової діалогової програми? 5. Що таке повідомлення? 6. Яке призначення макросу DECLARE_MESSAGE_MAP? 7. Що таке DDX/DDV? 8. Наведіть основні етапи написання програми з використанням MFC. ЛІТЕРАТУРА Олафсен Ю., MFC и Visual C++ 6. Энциклопедия программиста (+ CD) / Ю. Олафсен, К. Скрайбнер, К. Дэвид Уайт. – М.: DiaSoft, 2004. – 992 с. Сидорина Т. Самоучитель Microsoft Visual Studio C++ и MFC (+ CD-ROM). – СпБ: BHV, 2009. – 848 c. Давыдов В. Visual C++. Разработка Windows-приложений с помощью MFC и API-функций (+ CD-ROM). – СпБ: BHV, 2008. –576 c. MSDN [електронний ресурс]. – Режим доступу до онлайн довідки: http://msdn.microsoft.com/en-us/ ЗАВДАННЯ Написати віконну діалогову програму, яка записує і читає з файлової бази даних текстову інформацію про об’єкти, що описують предметну область задану варіантом. Програма має відповідати наступним вимогам: а) Забезпечити перевірку на коректність введення даних за допомогою механізму виключних ситуацій. При спробі введення некоректних даних відобразити на екрані відповідне повідомлення за допомогою методу MessageBox та скасувати операцію. б) Для введення даних використати елемент керування типу Edit Box, а вміст файлової бази даних відобразити у елементі керування типу List Box. Позначити призначення елементів керування за допомогою групуючи контролів (Group Box). в) Продублювати функції кнопок запису/читання у меню. г) Передбачити можливість вибору файлу, з яким відбуватиметься робота у процесі виконання програми за допомогою діалогу вибору файлу. д) Шляхом спадкування від класу CStdioFile або CFile створити власний клас, який забезпечуватиме буферизований запис даних у файл (Запис даних спочатку здійснюється в програмний буфер. При спробі додати нову порцію даних у повний буфер спочатку має відбуватися запис всіх даних з буферу у файл, очищення буферу і лише тоді додавання цієї порції даних у порожній буфер). Буфер реалізувати за допомогою структури даних з бібліотеки STL визначеній варіантом. Розмір буферу визначається варіантом. Скомпілювати та відлагодити програму. Скласти звіт про виконану роботу з приведенням тексту програми та результату її виконання. Дати відповідь на контрольні запитання. ПРЕДМЕТНІ ОБЛАСТІ Варіант Завдання  1 Базовий клас: class Device { public: Device(char* fName); ~Device(); virtual bool Open() = 0; virtual bool Close() = 0; virtual bool Execute(char* cmd, void* prm) = 0; virtual bool Status(int ext=0) {return isOpened;} protected: char* deviceName; char* friendlyName; bool isOpened; }; Device() – конструктор базового класу. Виділяє пам‘ять під змінну friendlyName та ініціалізує її. ~Device() – деструктор базового класу. Вивільняє пам‘ять віділену під змінні deviceName (!якщо виділено!) та friendlyName. Друкує повідомлення якщо робота з пристроєм не була корректно завершена. Open() – відкриває пристрій для роботи. Виділяє пам‘ять та ініціалізує змінну deviceName, встановлює змінну isOpened. Друкує повідомлення, про те що пристрій готовий до роботи. Close() – завершує роботу з пристроєм. Друкує повідомлення, та встановлює змінну isOpened у відповідний стан. Execute() – виконує команду специфічну для кожного пристрою. Status() – повертає стан пристрою. Похідний клас Printer. Атрибути: bool canPrint; char* ptrBuf; Команди для функції Execute(): “Print” – друкує вмістиме буферу “Write” – завантажує текст у буфер (prm – розглядати як char*), змінює значення змінної canPrint. “Clear” – обнулює вмістиме буферу, змінює значення змінної canPrint + Перевизначити функцію Status() – коли (ext == 1) повертати значення (isOpened && canPrint). Визначити конструктор та деструктор (!вивільняти всі ресурси!) класу.  2 Базовий клас див. завд. 1 Похідний клас Scaner. Атрибути: char* scrBuf; Команди для функції Execute(): “Scan” – заповнити вмістиме буферу випадковими даними. “Read” – завантажує текст у prm – розглядати як char*. “Clear” – обнулює вмістиме буферу. Визначити конструктор та деструктор (!вивільняти всі ресурси!) класу.  3 Базовий клас: class Animal { protected: char* name; int weight; public: Animal() ; virtual ~Animal() ; virtual void Call() = 0; virtual bool Feed(); virtual void DoAnimalStuff(); }; Animal() – конструктор базового класу. Виділяє пам‘ять під змінну name та ініціалізує змінну weight = 0. ~Animal() – деструктор базового класу. Вивільняє пам‘ять віділену під змінну name. Call() – імітує притаманні тварині звуки (!виводить на екран повідомлення!). Feed() – збільшує вагу тварини після годування (змінює змінну weight). DoAnimalStuff() – зменшує вагу тварини (змінює змінну weight) та виводить повідомлення. Похідні класи Dog та Cat. Конструктори похідних класів ініціалізують змінну name та weight. Перевизначити функції Feed() та DoAnimalStuff(). В основній програмі створити кілька тварин і змоделювати їхню поведінку.  4 Базовий клас: class Shape2D { public: Shape2D(); virtual ~ Shape2D(); virtual float Area( )= 0; virtual float Perimeter() = 0; virtual void PrintMessage(); }; Shape2D() – конструктор базового класу. ~ Shape2D() – деструктор базового класу. Area() – повертає значення площі фігури. Perimeter() – повертає значення периметру фігури. PrintMessage() – виводить повідомлення про тип фігури. Похідні класи Triangle та Rectangle Визначити необхідні для похідних класів параметри та перевизначити необхідні функції.  5 Базовий клас: class Shape3D { public: Shape3D(); virtual ~ Shape3D(); virtual float Area( )= 0; virtual float Volume() = 0; virtual void PrintMessage(); }; Shape3D() – конструктор базового класу. ~ Shape3D() – деструктор базового класу. Area() – повертає значення площі фігури. Volume () – повертає значення об’єму фігури. PrintMessage() – виводить повідомлення про тип фігури. Похідні класи Sphere та Cube Визначити необхідні для похідних класів параметри та перевизначити необхідні функції.  6 Базовий клас: class Resource { protected: int id; bool isUsed; char* title; char* author; public: Resource(int number) ; virtual ~ Resource() ; virtual bool TakeResource (); virtual bool GiveBackResource(); virtual void PrintInfo(); virtual bool Status() {return isUsed;} }; Resource() – конструктор базового класу. Ініціалізує змінну id та isUsed. Виділяє пам’ять під title та author. ~ Resource() – деструктор базового класу. TakeResource() – встановлює змінну isUsed=1 (виводить на екран повідомлення). GiveBackResource() – встановлює змінну isUsed=0 (виводить на екран повідомлення). PrintInfo () – виводить інформацію про ресурс. Status() – повертає стан ресурсу. Похідний клас Book. Атрибути: int pages; int year; Похідний клас CD. Атрибути: int cdType; Визначити конструктор та деструктор (!вивільняти всі ресурси!) класу. В основній програмі створити декілька ресурсів та продемонструвати процес їхнього використання.   ВАРІАНТИ ЗАВДАННЬ Варіант № предметної області Структура даних Розмір буферу  1 1 queue 5  2 2 vector 4  3 3 list 3  4 4 deque 6  5 5 map 4  6 6 multimap 5  7 1 vector 5  8 2 List 4  9 3 deque 3  10 4 Map 5  11 5 multimap 4  12 6 queue 6  13 1 List 2  14 2 deque 3  15 3 Map 4  16 4 multimap 3  17 5 queue 5  18 6 vector 3  19 1 deque 4  20 2 Map 5  21 3 multimap 4  22 4 queue 3  23 5 vector 4  24 6 List 5  25 1 Map 6  26 2 multimap 4  27 3 queue 5  28 4 vector 3  29 5 List 4  30 6 deque 5   ПОРЯДОК ВИКОНАННЯ Запустити MS Visual Studio 2012 У меню середовища MS Visual Studio вибрати «Файл» → «Создать» → «Проект». Вибрати тип проекту «Visual C++» → «Приложение MFC», задати ім’я проекту RGR (див. рис. 2) і натиснути «ОК».  Рис.2. Створення проекту з використанням бібліотеки MFC. У вікні, що відкриється вибрати пункт «Тип приложения» де вибрати «На основе диалоговых окон» та зняти пташку з «Использовать библиотеки с поддержкой Юникода» (див. рис. 3). Ознайомитися з вмістом інших вкладок. Натиснути «Готово».  Рис.3. Налаштування властивостей проекту В результаті цих дій має створитися проект типу діалог (див. рис. 4) який складається з таких файлів:  Рис.4. Вигляд проекту Resource.h – заголовочний файл, що описує ідентифікатори ресурсів. RGR.h – заголовочний файл, що описує клас задачі (CRGRApp). RGRDlg.h – заголовочний файл, що описує клас діалогу (CRGRDlg). Stdafx.h – наперед скомпільований заголовочний файл, що містить файли, що часто використовуються в проекті, але рідко змнюються. Використання цього файлу дозволяє зменшити час компіляції складних проектів. targetver.h – забезпечує визначення останньої доступної платформи Windows. RGR.cpp – файл, що містить визначення методів, що оголошені у класі CRGRApp. RGRDlg.cpp – файл, що містить визначення методів, що оголошені у класі CRGRDlg. Stdafx.cpp – тіло наперед скомпільованого заголовочного файлу RGR.pch. RGR.ico – файл з іконками програми. RGR.rc – файл з ресурсами, у якому місяться у графічному вигляді діалоги, меню, курсори, іконки, а також таблиця текстових рядків, що будуть доступні через ідентифікатори і інформація про версію програми. Ці ресурси можна редагувати у MS Visual Studio. Ресурси не можна відкрити поки є відкритий файл Resource.h. RGR.rc2 – файл з ресурсами, які не можна редагувати. ReadMe.txt – містить інформацію про призначення файлів проекту, що були згенеровані MS Visual Studio. Додати до проекту класи з бізнес логікою. Для цього в меню середовища MS Visual Studio натиснути «Проект» → «Добавить класс…». У вікні, що відкрилося вибрати «Класс С++» (див. рис. 5) та натиснути «Добавить». У наступному вікні задати назву класу та інші його характеристики такі як базовий клас, наявність віртуального деструктора тощо (див. рис. 6). Натиснути «Готово». В результаті цих дій має утворитися клас з заданим у налаштуваннях ім’ям, що розміщується у двох файлах – заголовочному і файлі з реалізацією класу. Імена цих файлів задаються при створенні класу. При необхідності створити таким самим способом всі класи, що необхідні для реалізації бізнес логіки програми.  Рис. 5. Вибір типу класу, що додаватиметься  Рис. 6. Налаштування характеристик класу, що додаватиметься У даному прикладі використовуватиметься клас CMyInt з наступним вмістом: //------------------------------------------ Файл MyInt.h ---------------------------------- #pragma once class CMyInt { int * m_pnNum; public: /* * При використанні динамічного виділення пам'яті у членів-даних класу * слід обов'язково перевизначити конструктор за замовчуванням, * конструктор копіювання, деструктор та оператор присвоювання, які * мають забезпечити коректне опрацювання * динамічно створених членів класу */ CMyInt(void); CMyInt(const CMyInt&); ~CMyInt(void); CMyInt& operator=(const CMyInt&); void SetInt(int); int GetInt(void) const; }; //------------------------------------------ Файл MyInt.cpp ---------------------------------- #include "stdafx.h" #include "MyInt.h" CMyInt::CMyInt(void) { m_pnNum = new int; *m_pnNum = 0; } CMyInt::CMyInt(const CMyInt& obj) { m_pnNum = new int; *m_pnNum = *obj.m_pnNum; } CMyInt::~CMyInt(void) { delete m_pnNum; } CMyInt& CMyInt::operator=(const CMyInt& obj) { if (this != &obj) { *m_pnNum = *obj.m_pnNum; return *this; } return *this; } void CMyInt::SetInt(int n) { *m_pnNum = n; } int CMyInt::GetInt(void) const { return *m_pnNum; } Інкапсулювати об’єкт необхідного створеного класу у клас CRGRDlg у який вводитимуться дані з елементів керування діалогу та об’єкт структури даних, що застосовуватиметься для буферизації: #pragma once #include "MyInt.h" #include <list> #include <iterator> using namespace std; // диалоговое окно CRGRDlg class CRGRDlg : public CDialogEx { private: CMyInt m_intObj; list<int> lst; ………… У ресурсах відкрити графічне зображення діалогу. Для цього у меню MS Visual Studio вибрати: «Вид» → «Ресурсы». У панелі, що відкрилася, двічі клікнути лівою кнопкою мишки на елемент IDD_RGR_DIALOG. В результаті цього має відкритися графічне зображення діалогу. Далі у меню MS Visual Studio вибрати: «Вид» → «Панель элементов». В результаті має відкритися панель, що містить типові елементи керування (контроли) (див. рис.7).  Рис.7. Редактор діалогів У редакторі діалогів вибрати елемент типу Lable з текстом «TODO:…» та видалити його натисканням кнопки «Delete». Те саме повторити для двох кнопок: «ОК» і «Отмена». Вибрати в панелі елементів керування контрол «Edit Control» та перетянути його на діалог. Те саме повторити для двох елементів типу «Group Box», двох елементів типу «Button» та одного елементу «List Control». Розташувати їх так, як зображено на рис. 8.  Рис.8. Редактор діалогів з створеним прототипом діалогу Вибрати мишкою елемент керування типу «Group Box» навколо елемента керування типу «Edit Control». Клікнути на ньому правою кнопкою мишки та вибрати в випадаючому меню пункт «Свойства». В результаті відкриється панель властивостей елемента керування «Group Box» (див. рис. 9). Ознайомитися з її вмістом. Двічі клікнути мишкою на тексті «Статический» у полі «Подпись». Видалити текст «Подпись» і замість нього написати «Поле введення даних» та натиснути «Enter». Те саме повторити для іншого елемента керування «Group Box».  Рис. 9. Редактор діалогів з відкритю панеллю властивостей елемента керування «Group Box». Вибрати елемент керування типу «Edit Control» та відкрити його властивості. Ознайомитися з його властивостями. Клікнути правю кнопкою мишки на елемент керування типу «Edit Control» та вибрати пункт меню «Добавить переменную». В результаті має відкритися вікно, що зображене на рис. 10. Задати значення полів так, як зображено на рис. 10. На даному рисунку вказується, що елемент керування з ідентифікатором IDC_EDIT1 зв’язується за допомогою механізму DDX/DDV по значенню (value) зі змінною m_nData типу int, яка буде розташована у полі private класу CRGRDlg. Натиснути «Готово». У результаті у полі private класу CRGRDlg створиться змінна m_nData типу int, а у методі void CRGRDlg::DoDataExchange(CDataExchange* pDX) з’явиться запис DDX_Text(pDX, IDC_EDIT1, m_nData)та у конструктор класу CRGRDlg буде додано поле ініціалізації m_nData(0). Вибрати елемент керування типу «List Box» та відкрити його властивості. Ознайомитися з його властивостями. Клікнути правю кнопкою мишки на елемент керування типу «List Box» та вибрати пункт меню «Добавить переменную». В результаті має відкритися вікно, що зображене на рис. 11. Задати значення полів так, як зображено на рис. 11. На даному рисунку вказується, що елемент керування з ідентифікатором IDC_LIST1 зв’язується з об’єктом m_DlgList класу CListCtrl який буде розташований у полі private класу CRGRDlg. Натиснути «Готово». У результаті у полі private класу CRGRDlg створиться об’єкт m_DlgList класу CListCtrl, а у методі void CRGRDlg::DoDataExchange(CDataExchange* pDX) з’явиться запис DDX_Control(pDX, IDC_LIST1, m_DlgList).  Рис. 10. Діалог зв’язування змінної з елементом керування типу «Edit Control»  Рис. 11. Діалог зв’язування об’єкту з елементом керування типу «List Box» Вибрати елемент керування типу «Button» з текстом «Button1» та відкрити його властивості. Ознайомитися з його властивостями. У полі «Подпись» переназвати кнопку на «Записати дані». Кнопку «Button2» переназвати на «Прочитати дані». Клікнути правою кнопкою мишки на кнопку «Записати дані» та вибрати пункт меню «Добавить обработчик событий…». У вікні, що відкриється, встановити значення так, як зображено на рис. 12 та натиснути «Добавить/править». На рис. 12 вказується, що у клас CRGRDlg буде додано обробник події (метод) натискання на кнопку (BN_CLICKED), який називатиметься OnWriteData. Те саме повторити для кнопки «Прочитати дані», назвавши обробник події OnReadData. В результаті цих дій у клас CRGRDlg будуть додані 2 методи – OnWriteData і OnReadData, в макрос BEGIN_MESSAGE_MAP(CRGRDlg, CDialogEx) будуть додані 2 макроси – ON_BN_CLICKED(IDC_BUTTON1,&CRGRDlg::OnWriteData) і ON_BN_CLICKED (IDC_BUTTON2, &CRGRDlg::OnReadData), які вказують диспетчеру повідомлень, що повідомлення про натискання кнопки з ідентифікатором IDC_BUTTON1 слід обробляти методом CRGRDlg::OnWriteData. Аналогічно для другого макроса. Відкрити тіло методу обробника події натискання на кнопку «Записати дані» і добавити в нього код для буферизованого запису даних у файл: void CRGRDlg::OnWriteData() { // Записуємо значення з контролів в змінні UpdateData(true); // перевіряємо чи буфер не повний if (lst.size()<3) lst.insert(lst.end(), m_nData); else
Антиботан аватар за замовчуванням

02.06.2014 20:06-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!