Програма з використанням бібліотеки MFC
Розробка візуальної програми, яка містить головне меню та забезпечує введення-виведення даних у діалоговому вікні. Створення панелі інструментів, рядку стану. Реалізація функції мовою Assembler. Створення та підключення бібліотеки Dll. Робота з файлами.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | украинский |
Дата добавления | 01.04.2016 |
Размер файла | 370,9 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
АНОТАЦІЯ
Дана курсова робота складається з двох програмних проектів - основного, який використовує бібліотеки MFC пакету Microsoft Visual C++, та проекту мовою Assembler, що під'єднано до основного проекту як динамічну бібліотеку DLL. Зміст першого проекту полягає у розробці візуальної програми, яка містить головне меню, та забезпечує введення-виведення даних у діалоговому вікні. Динамічна бібліотека DLL знаходить рішення функції згідно індивідуального завдання, для чого отримує з основної програми необхідні їй дані. Після виконання операцій DLL бібліотека повертає результат у основну програму. Результати роботи програми виводяться в числовому вигляді в різних діалогових вікнах.
ЗМІСТ
ВСТУП
1. ЗАГАЛЬНА СТРУКТУРА КУРСОВОЇ РОБОТИ
2. РОЗРОБКА МЕНЮ
3. ПІДКЛЮЧЕННЯ ПАНЕЛІ ІНСТРУМЕНТІВ ТА РЯДКУ СТАНУ
3.1 Створення панелі інструментів
3.2 Створення рядку стану
4. СТВОРЕННЯ ДІАЛОГОВИХ ВІКОН
4.1 Основні етапи створення діалогу
4.2 Створення діалогу для введення змінних
5. РЕАЛІЗАЦІЯ ФУНКЦІЇ МОВОЮ ASSEMBLER
6. СТВОРЕННЯ ТА ПІДКЛЮЧЕННЯ БІБЛІОТЕКИ DLL
7. ВИВЕДЕННЯ РЕЗУЛЬТАТІВ ОБЧИСЛЕНЬ
7.1 Числове виведення результату
7.2 Графічне виведення результату
8. РОБОТА З ФАЙЛАМИ
8.1 Відкриття файлу
8.2 Функція перейменування
9. КЕРІВНИЦТВО СИСТЕМНОГО ПРОГРАМІСТА
10. КЕРІВНИЦТВО ОПЕРАТОРА
ВИСНОВКИ
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
ДОДАТКИ
ВСТУП
Програмне забезпечення поділяється на наступні два типи: системне програмне забезпечення та прикладне програмне забезпечення. Системне програмне забезпечення - це тип програм, який забезпечує роботу комп'ютера. До складу системного програмного забезпечення входять операційні системи, операційні оболонки, антивірусні програми, драйвери пристроїв та інші системні програми.
Прикладне програмне забезпечення - це програми, що дозволяють кінцевому користувачу виконання конкретних функцій, таких як обробляння текстів або редагування зображень. До складу прикладного програмного забезпечення входять редактори текстів, програми для моделювання, графічні редактори та ін.
Системне програмне забезпечення пишуть на мовах системного програмування. До них належать мови С/С++ та Assembler.
Мова С++, а зокрема Microsoft Visual C++, представляє собою потужний і складний інструмент для створення програмного забезпечення під операційну систему Windows. У зв'язку з тим, що cьогодні рівень складності програмного забезпечення дуже високий, розробка програм для Windows з використанням будь-якої мови програмування(наприклад, мови C++) значно ускладнюється.
Тому щоб полегшити роботу програміста практично всі сучасні компілятори з мови C++ містять спеціальні бібліотеки класів. Такі бібліотеки включають в себе практично весь програмний інтерфейс Windows і дозволяють користуватися при програмуванні засобами більш високого рівня, ніж звичайні виклики функцій. За рахунок цього значно спрощується розробка програм, що мають складний інтерфейс користувача і взаємодія з базами даних.
Переваги створення програм за допомогою пакету Microsoft Visual C++ забезпечується за рахунок стандартної бібліотеки класів Microsoft Foundation Classes (MFC), яка стала фактично стандартом для розробників програмного забезпечення на мові С++ [1].
1. ЗАГАЛЬНА СТРУКТУРА КУРСОВОЇ РОБОТИ
Дана курсова робота складається з двох програмних проектів - основного, який використовує бібліотеки MFC пакету Microsoft Visual C++, та проекту мовою Assembler, що під'єднано до основного проекту як динамічну бібліотеку DLL. Файл динамічної бібліотеки *.dll має знаходитись в тій же дерикторії, що й програма. Програма повинна відобразити інформацію про розробника, забезпечувати введення в діалоговому режимі вхідних даних з клавіатури, виведення результату роботи програми в числовому вигляді у різних вікнах, виконувати стандартні операції з файлами: Open, Save.
Файл *.dll повинен містити функцію, яка знаходить значення заданої функції. Файл *.dll створюється за допомогою мови програмування Assembler.
Динамічна бібліотека повинна отримувати з основної програми необхідні їй дані. Після виконання операцій *.dll бібліотека повинна повертати результат у основну програму.
Проект динамічної бібліотеки складається з двох основних файлів:
1) Файл dlla.cpp містить функцію, що виконує обчислення згідно з індивідуальним завданням і яка написана мовою програмування Assembler. Вона приймає дані з основної програми, обробляє їх і повертає назад.
2) Файл dlla.def - це файл, в якому вказується ім'я бібліотеки що створюється, та ім'я функції що експортується, яка необхідна для правильного функціонування програми.
Другий проект дозволяє створити файл типу *.ехе - головну програму, яка використовує створену динамічну бібліотеку. Цей проект складається з основного файлу з текстом самої програми symbols.cpp, файлів проекту, що автоматично створюються середовищем, заголовочного файлу resource.h.
У файлі symbols.cpp описані наступні класи:
1) CSymbolsDlg(похідний від CDialog) - використовується для створення модельного вікна, у якому відбувається введення даних, необхідних для виконання завдання;
class CSymbolsDlg: public CDialog;
2) CMyFrameWin (похідний від CFrameWnd) - використовується для створення головного вікна програми;
class CMyFrameWin:public CFrameWnd
Для зручності керування процесами, що виконує програма, головні операції головного меню повинні бути продубльовані на панелі інструментів. Введення самих даних відбувається у діалоговому вікні. Після введення даних, по натисненні кнопки Run має відбутись обмін даними с динамічною бібліотекою та обчислення функції. Результат повинен виводитись в двох незалежних вікнах, результат виводиться у окремих вікнах у графічному режимі.
Операція Open відображає вміст текстового файлу в головному вікні, а операція Save - зберігає результат роботи програми у текстовому файлі під заданим ім'ям.
2. РОЗРОБКА МЕНЮ
В усіх програмах меню розташовується у верхній частині вікна під заголовком програми. Призначення елементів меню - виконувати певні команди. Меню, що розташоване під смугою заголовка вікна, називається головним меню додатку.
Елементи меню можуть мати різні типи і містити ряд модифікаторів. Команди в меню означають визначені дії (наприклад, виклик функції), а модифікатори - деякі особливості меню: маркер, знак підкреслення, стрілка, крапки, лінії розділу.
Процес створення меню складається із трьох етапів:
створення шаблона меню;
підключення ресурсу меню до головної програми;
обробка повідомлень від команд меню.
Зовнішній вигляд меню приведений на рисунку 1.
Рисунок 1 - Атрибути меню.
Після візуального створення шаблону меню кожен його пункт отримує певні атрибути. Зовнішній вигляд вікна властивостей, приведений на рисунку 2.
Рисунок 2 - Атрибути меню в вікні властивостей
Підключення меню в програму базується на використанні методу Create() класу CFrameWnd, який створює головне вікно програми. За допомогою макросу MAKEINTRESOURCE відбувається перетворення числового ідентифікатора ресурсу меню до символьного вказівника [2]. В результаті отримаємо:
CMyFrameWnd::CMyFrameWnd()
{
Create(NULL,"My Program",
WS_OVERLAPPEDWINDOW,rectDefault,NULL,
MAKEINTRESOURCE(IDR_MAINFRAME));
}
Ідентифікатори меню та всіх пунктів представлені в заголовочному файлі ресурсів Resource.h в Visual Studio 2008, який задається автоматично.
Після запуску на виконання в верхній частині клієнтської області вікна можна буде побачити створене меню.
Включено в карту повідомлень MESSAGE_MAP макроси, які зв'язують ідентифікатори кожного пункту меню з функціями-обробниками.
BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
ON_WM_CREATE()
ON_COMMAND(ID_INFO,OnInfo)
ON_COMMAND(ID_INPUT,OnInput)
ON_COMMAND(ID_RUN_RUN,OnRun)
ON_COMMAND(ID_RUN_RESULT,OnResult)
ON_COMMAND(ID_FILE_RENAME,OnRename)
ON_COMMAND(ID_FILE_OPEN,OnOpen)
ON_COMMAND(ID_FILE_SAVE_AS,OnSave)
ON_COMMAND(ID_FILE_EXIT,OnExit)
END_MESSAGE_MAP();
3. ПІДКЛЮЧЕННЯ ПАНЕЛІ ІНСТРУМЕНТІВ ТА РЯДКУ СТАНУ
3.1 Створення панелі інструментів
Панель інструментів (toolbar) - це сукупність растрових картинок в якості кнопок одного розміру і розподілювачів. Натиснення на кнопку панелі інструментів подібно вибору одного пункту меню [3]. У даній роботі панель інструментів використовується разом з меню, нижче основного меню, дублюючи основні його функції.
Для створення панелі інструментів необхідно натиснути правою кнопкою миші на папці Toolbar в вікні Resource View, а потім вибрати із контекстного меню Insert Toolbar, в результаті чого буде створена нова пуста панель інструментів (див. рисунок 3).
Рисунок 3 - Вигляд панелі інструментів в ресурсах.
При її створені було задано відповідний ідентифікатор ID: IDR_MAINFRAME. Після створення панелі інструментів вона була заповнена кнопками. Для цього в Visual Studio 2008 існує спеціальний редактор. При створенні кожної кнопки, їй присвоювався певний ідентифікатор, так як в даній програмі кнопки панелі інструментів повторюють пункти меню, то використовувалися ті ж самі ідентифікатори, що й для пунктів головного меню. У кожній кнопці даної програми прописані підказки, що записані в полі Prompt в діалоговому вікні властивостей кнопок. По замовчуванню встановлено, що всі кнопки можуть бути натиснені.
На рисунку 4 представлено властивість кнопки Rename, яка має в собі ідентифікатор ID, в змінній Promt описується властивість яка дозволяє підписувати клавішу в StatusBar та біля курсору, в момент наведення курсора на кнопку, також представленна властивість висоти(heght) та ширини(width).
Рисунок 4 - Меню властивостей кнопки Rename
На рисунку 5 зображено створену панель інструментів.
Рисунок 5 - Панель інструментів
По закінченні створення панелі інструментів переходимо до створення програмного коду, що буде обробляти виклики з панелі інструментів. Спершу потрібно створити екземпляр класу панелі інструментів:
CToolBar m_wndToolBar;
У функції OnCreate CMyFrameWin код для створення панелі інструментів:
int CMyFrameWin::OnCreate(LPCREATESTRUCT lpCreateStruct)
{if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD
| WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS
| CBRS_FLYBY | CBRS_SIZE_DYNAMIC)||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1;
},
де TBSTYLE_FLAT - стиль кнопки; WS_CHILD, WS_VISIBLE, CBRS_TOP,CBRS_GRIPPER, CBRS_TOOLTIPS, CBRS_FLYBY, CBRS_SIZE_DYNAMIC - стилі панелі інструментів.
3.2 Створення рядку стану
Рядок стану розташовується в нижній частині вікна. Вікно рядка стану не приймає введення від користувача і не генерує командних повідомлень, його задача - просто показувати від управлінням програми текст у відповідних секціях [3].
Рядок стану використовується для відображення опису команд і стану клавіш клавіатури, включаючи Caps Lock і Scroll Lock, та інформувати користувача про стан визначених атрибутів або параметрів програми [2]. В рядку стану відображаються підказки при наведені курсора на кнопки панелі інструментів, що передбачені розробником програми.
Для створення рядка стану були виконані такі кроки:
1. В класі вікна програми оголошено екземпляр класу CStatusBar для об'єкта - рядка стану:
CStatusBar m_wndStatusBar;
2. Створено структуру з ідентифікаторами полів, що відображаються в рядку стану[1]:
static UINT indicators[] =
{
ID_SEPARATOR,
ID_INDICATOR_NUM,
ID_INDICATOR_CAPS,
ID_INDICATOR_SCRL,
};
3. У функції OnCreate CMyFrameWin код для створення панелі інструментів:
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1;
}
4. СТВОРЕННЯ ДІАЛОГОВИХ ВІКОН
4.1 Основні етапи створення діалогу
Діалогове вікно має всі ознаки звичайного. Його можна переміщувати, закривати, а також передавати йому повідомлення. Перевага діалогового вікна в тому, що в ньому можна легко розмістити кнопки, текстові поля та інші елементи керування.
В даній програмі ми застосовуємо одне діалогове вікно. В ньому будуть розташовані елементи запису даних для роботи функції.
По способу взаємодії з користувачем діалогові вікна бувають модальні та немодальні. У даній програмі використовуються модальні вікна. Ці вікна виводяться поверх інших вікон і поки користувач не закінчив з ним роботу, він не може працювати з іншими вікнами додатку. Всі повідомлення, що направленні вікнам одного з ним рівня або батьківським вікнам, перехоплюються ним [4].
Створення діалогового вікна починається зі створення діалогу в візуальному режимі. Додаємо діалог в області Dialog в toolbar6.rc.
Далі виставляємо певні компоненти на область діалогу, результат на рисунку 6:
Рисунок 6 - Основний діалог програми
Основний діалог ми використовуємо для обробки інформації та в програмі через діалог ми будемо передавати дані в dlla.dll бібліотеку.
4.2 Створення діалогу для введення змінних
Для створення діалогового вікна в середовищі Visual Studio 2010 в створеному проекті відкривається новий ресурс (діалогове вікно) і задається потрібний розмір діалогового вікна. Після цього у новостворене вікно додаються потрібні обєкти з меню на верхній панелі інструментів. Після того, як зображення елемента зявилось йому задаються певні параметрів та властивості. Програміст виконує дані дії візуально.
Створюємо новий ресурс діалогу, MyDialog для введення даних: натискаємо у вікні переглядача ресурсів правою кнопкою миші на файл ресурсів і вибираємо команду Add Resource (рисунок 7) [4].
Рисунок 7 - Створення нового ресурсу
Елементи керування додаються за допомогою панелі інструментів і властивостей відповідного елемента (рисунок 8).
Рисунок 8 - Панель інструментів створення діалогу
Додаємо до ресурсу діалогу такі елементи як: Control; Edit - для введення змінних, Static Text - для відображення статичного тексту інформаційного характеру.
Текст основної програми приведено в додатку А.
5. РЕАЛІЗАЦІЯ МАТЕМАТИЧНОЇ ФУНКЦІЇ МОВОЮ ASSEMBLER
При програмуванні функції на асемблері, яка повинна реалізовувати обчислення функції ми маємо вивести формулу для проходження по всім елементам масиву. Розмірність масиву дорівнює 5. Адреси елементів матриці мають розмір 4 біта, тобто кожен наступний елемент матриці знаходиться на відстані L=4 біта від попереднього.
Перед виконанням самого обчислення ми аналізуємо значення змінної R і визначаємо яку саму частину формули нам обраховувати, яке здійснюється за допомогою команди CMP, що порівнює два значення і виставляє флаги у відповідних регістрах і JX, де замість Х може стояти A B E, яка виконує скачок на мітку, при виконанні певної умови, яка визначається Х. У нашому випадку ми використовуємо
CMP r,2
JB l1
що означає перейти на мітку 1 якщо r менше 2, і
CMP r,3
JE l2
що означає перейти на мітку 2 якщо r дорівнює 3.
Для обчислення першої частини формули ми будемо додавати до регістра eax значення всіх елементів масиву, поступово зсуваючи адресу від першого до останнього елементу
mov esi,arr
mov edx,l
mov ecx,n
mov eax,0
l4:
add eax,[esi]
add esi,edx
А вкінці помножимо отриману суму на змінну а і віднімем від результату змінну с
mul a
sub eax,c
Друга частина формули обчислюється за допомогою простих математичних операцій sub add div:
mov eax,c
sub eax,d
add eax,a
mov ebx,d
sub ebx,3
div ebx
Всі дані необхідні для обчислення, ініціалізація програми, та вивід данних здійснюється за допомогою C++:
Текст коду асемблера приведено у додатку Б.
6. СТВОРЕННЯ ТА ПІДКЛЮЧЕННЯ БІБЛІОТЕКИ DLL
Бібліотеки DLL - це програмний код або дані, які динамічно доступні всім процесам операційної системи.
Динамічне завантаження DLL дозволяє програмі визначити, яка з бібліотек і коли буде завантажуватись, а також задати дію при невдалому завантаженні бібліотеки. Призначення бібліотек DLL - бути викликаними процесами (тобто програмами в стадії виконання) або іншими бібліотеками в потрібний момент. Бібліотека DLL бере участь в роботі лише тоді, коли викликається одна з її функцій. Стандартним розширення ім'я бібліотеки вважається.dll, якщо не вказувати інше. Так як в імені файлу вказано лише його назву, то цей файл повинен знаходитись в одному каталозі з основним файлом типу.exe.
При створення бібліотеки DLL створюємо новий проект MFC AppWizard (dll) та вибираємо Regular DLL with MFC statically linked. У проект автоматично були включені необхідні файли (*.cpp і *.def).
В файлі *.cpp описуємо цілочисельну функцію calculation(), де зберігаються всі змінні програми.
В середині функції ми описуємо код програми асемблера. Підключення відбувається за допомогою наступного коду
_asm{
//код на ассемблері
}
Ім'я експортованої функції потрібно вказати в окремому файлі визначень (файл типу *.def) [1]. В данному файлі описуємо наступні значення:
; calculation.def : Declares the module parameters for the DLL.
LIBRARY "calculation"
EXPORTS
FindMin @1.
; Explicit exports can go here;
В цьому коді вказано ім'я експортованої функції та її номер, по якому функцію можна викликати в головній програмі.
7. РОБОТА З ФАЙЛАМИ
В завданні нам потрібно вивести вміст будь-якого файлу в головне вікно програми, для цього ми застосовуємо одну із функції MFC для відкриття файлу.
Для відкриття файлу використаємо стандартні класи бібліотеки MFC: CFile - власне, клас файлу, CFileDialog - клас-діалог, у якому можна вибирати потрібні нам файли, CFileException - клас помилок при відкритті файлу.
Для прикладу покажемо роботу з ними при натисканні кнопки Open.
Спочатку створимо всі необхідні нам об'єкти класів:
CFile myFile;//об'єкт файлу
char *szBuffer;//буфер считування
CFileException fileException;//об'єкт помилок
CFileDialog dlgopen(TRUE, "*", NULL, OFN_HIDEREADONLY,
"All Files (*.*)|*.*||");//створення діалогу для вибору файлу
Розглянемо детальніше останню стрічку. Перший параметр означає, що даний діалог буде діалогом «Открыть», про це нам говорить значення TRUE. Слідуючий параметр сказує значення розширення файлів за замовчуванням (в нашому випадку будуть показані усі файли). Значення OFN_HIDEREADONLY говорить про те, що файли, призначені тільки для читання, показуватися в діалозі не будуть. І в кінці кінців стрічка в лапках є значенням фільтрів розшиернь файлів, по яких ми можемо фільтрувати зміст діалогу.
Далі ми повині використати метод DoModal з наступним прототипом:
virtual int DoModal();
Цей метод повертає значення IDOK або IDCANCEL, в залежності від того, які кнопки були натиснуті при закриті діалогового вікна [7].
При натисненні на кнопку ОК по завершенні роботи з діалоговим вікном виконується слідуючі команди:
char text [1024] = "";
CFileDialog fileDlg(true, "*", NULL, OFN_HIDEREADONLY, "Файли txt (*.txt)|*.txt||");
if (fileDlg.DoModal() == IDOK)
{
CFile file(fileDlg.GetPathName(), CFile::modeRead);
file.Read(text, sizeof(text));
file.Close();
}
displey_txt.SetWindowTextA(text);
Якщо змінити в конструкторі класу TRUE на FALSE, то отримається конструктор класу для збереження файлу:
CFileDialog dlgsave(FALSE, "*", NULL, OFN_HIDEREADONLY,
"All Files (*.*)|*.*|Text Files (*.txt)|*.txt||");
Далі ми знову викликаємо діалог модально і при натисненні кнопки ОК виконуємо слідуюче:
if(DlgSave.DoModal()==IDOK)
{
CStdioFile File(DlgSave.GetPathName(),
CFile::modeCreate | CFile::modeWrite);
File.WriteString(LPCSTR(string));
}
Перейменовування файлу відбувається за наступним принципом. Спочатку відкривається обраний файл. Далі відбувається збереження файлу під новим іменем, а старий файл видаляється
CFileDialog dlgopen(TRUE, "*", NULL, OFN_HIDEREADONLY, "Всі (*.*)|*.*||");
if (dlgopen.DoModal()==IDOK)
{
CFileDialog dlgsave(FALSE, "*", NULL, OFN_HIDEREADONLY, "Всі (*.*)|*.*||");
if (dlgsave.DoModal()==IDOK)
{
CopyFile(dlgopen.GetPathName(), dlgsave.GetPathName(), 1);
DeleteFile(dlgopen.GetPathName());
}
}
8. ВИВЕДЕННЯ РЕЗУЛЬТАТІВ ОБЧИСЛЕНЬ
Числове виведення результату здійснюється по натисненню кнопки Run. У програмі числове виведення результату відбувається в окремому вікні. Для цього створено нове вікно класу CFirstWnd похідного від класу CFrameWnd, яке створюється за допомогою функції Create(), що містить початкові параметри вікна:
classCFirstWnd:publicCFrameWnd
{
public:
CFirstWnd(CWnd *wnd,int x1,int x2,int y1,int y2);
};
CFirstWnd::CFirstWnd(CWnd *wndPerent,int x1,int x2,int y1,int y2)
CRectrectWnd(x1,x2,y1,y2);
Create(NULL, "Числовий результат",WS_OVERLAPPEDWINDOW, rectWnd, wndPerent, NULL);
}
Далі потрібно вивести результат. Виконуємо виведення результату за допомогою функції TextOut.
chartext_displey[200];
CFirstWnd *FirstWnd=newCFirstWnd(this,20,20,300,300);
FirstWnd ->ShowWindow(SW_SHOWNORMAL);
CClientDCdc(FirstWnd);
dc.SetTextColor(RGB(100,60,10));
sprintf(text_displey,"Відповідь %i",result );
dc.TextOut(20,20,text_displey);
FirstWnd ->UpdateWindow();
FirstWnd ->UpdateWindow();
Виведення числового результату зображено на рисунку 9.
Рисунок 9 - Вікно виведення числового результату
Бібліотека OpenGL являє собою програмний інтерфейс для апаратного забезпечення машинної графіки. Цей інтерфейс складається приблизно з 250 окремих команд (майже 200 команд в ядрі OpenGL і ще 50 команд у бібліотеці утиліт OpenGL), які використовуються для того, щоб визначити об'єкти й операції, необхідні для створення інтерактивних тривимірних прикладних програм.
В нашому проекті Visual C + +, треба буде додати бібліотеки для збірки проекту бібліотеки OpenGL. У меню Project / setting, потрібно вибрати закладку LINK. У рядку "Object / Library Modules" додати "OpenGL32.lib GLu32.lib GLaux.lib". Тоді клацнути OK. Тепер все готово для створення програми з OpenGL.
Потрібно використати бібліотечні файли.Які виглядять так:
#include <gl\gl.h> // Заголовочний файл для OpenGL32 бібліотеки
#include <gl\glu.h>// Заголовочний файл для GLu32 бібліотеки
#include <gl\glaux.h> // Заголовочний файл для GLaux бібліотеки
Далі, необхідно ініціалізувати всі змінні, які будуть використані у нашій програмі. Ця програма буде створювати пусте OpenGL вікно, тому ми не будемо мати потребу у великій кількості змінних. Розглянемо деякі функції які використовуються в нашій програмі [6].
Функція glCIearCoIor() визначає те, який колір фону буде встановлений для вікна, а функція glClear () фактично встановлює колір вікна. Як тільки колір фону встановлено, вікно заливається цим кольором кожного разу, коли викликається функція glClear (). Цей колір фону може бути змінений за допомогою другого виклику функції glClearColor (). Точно так само функція glColor3f () встановлює те, який колір варто використовувати для промальовування об'єктів на екрані. Всі об'єкти, що виводяться на екран після цього моменту, використовують даний колір до тих пір, поки він не буде змінений за допомогою наступного виклику команди установки кольору.
Наступна функція OpenGL, що використовується в даній програмі, glOrtho(), визначає систему координат, яку OpenGL приймає для промальовування остаточного зображення, і те, як це зображення відображається на екрані [6].
Після натиснення кнопки Resalt, проводиться ініціалізація графіки. Виведення графічного зображення здійснюється в окремому вікні Resalt. На екран виводиться кубик-трансформер, який то складається, то розкладається і швидкість його руху залежить від результату обчислення формули:
Опишемо процес створення об'єктів:
1) Напишемо функцію яка буде створювати грань з 9 кубів (рисунок 10), для цього створим два вкладених цикла, в яких будем переміщати центр координат і малювати куби:
for (int i=0;i<3;i++){
for (int j=0;j<3;j++){
glPushMatrix();
glTranslated(0,(float)j*1.1f,0);
auxSolidCube(1);
glPopMatrix();
glTranslated(1.1,0,0);
Рисунок 10 - Грань куба
2) Використовуючи функцію для побудови граней, відобразимо весь куб:
glPushMatrix();
glColor3f(0.5f,0.25f,0.25f);
said();
glPopMatrix();
glPushMatrix();
glTranslated(0,0,1.1);
glColor3f(0.25f,0.25f,0.5f);
said();
glPopMatrix();
glPushMatrix();
glTranslated(0,0,2.2);
glColor3f(0.25f,0.5f,0.25f);
said();
glPopMatrix();
Рисунок 11 -Весь куб
3) Для анімації складання-розкладання куба використаємо функцію повороту glRotatef, додамо її в місця створення граней, а для контролю створимо додаткові змінні, в яких будуть зберігатися кути:
const float at=0.22f*speed;
static float rotate=0;
if(rotate<180 && cubFlage)
rotate+=at;
if(rotate>0 && !cubFlage)
rotate-=at;
Рисунок 12 - Куб в розкладеному стані
4) Масштабуванням швидкості займається змінна speed, вона дорівнює одній десятій від значення, що ми отримали при обчислені функції:
speed= (float)rezultat/10;
Повний код програми наведений у додатку А
9. КЕРІВНИЦТВО СИСТЕМНОГО ПРОГРАМІСТА
Комп'ютер, на якому працює програма, повинен мати наступні мінімальні конфігурації:
· Процесор Pentium 500 MHz або більше;
· Оперативну пам'ять не менше 256 МБ;
· Не менше 2 МБ вільного місця на диску;
· ОС Windows ME/2000/XP;
· Монітор з розширенням 800 x 600 та кольоропередачею в 32 біт;
Програма викликається за рахунок запускання її виконуваного файлу Tkachenco.exe. Для її правильного функціонування необхідно, щоб у папці, де знаходиться цей файл, також розміщувався файл calculation.dll, що містить динамічно підключувану бібліотеку, яка використовується при роботі.
Основними файлами для створення проекту є: файли для створення основної програми: код програми на С++ - toolbar6.cpp; файл ресурсів - TOOLBAR6.RC; заготовочний файл для зв'язку з ресурсами - Resource.h і Tkachenco.sln - основний файл проекту, що містить посилання на необхідні об'єкти. Також до основного проекту потрібно добавити папку з ресурсами RES, що містить малюнки панелі інструментів, іконки програми(toolbar1.bmp, MINIDOC2).
10. КЕРІВНИЦТВО ОПЕРАТОРА
Користувачу потрібно вибрати певні значення для обчислення у спеціально призначеному для цього діалоговому вікні введення, який викликається при натисканні кнопки «Input».
Виведення інформації здійснюється у двох формах. Текстовий результат та 3D-результат. Відомості про розробника виводяться при натисненні кнопки «About». При натисненні на пункт меню «Open», можна відкрити існуючий файл з даними. Якщо натиснути на пункт меню «Rename», можна перейменувати файл, а кнопка «Save» реалізує операцію збереження. Щоб вийти з програми необхідно вибрати пункт меню «Exit».
Дана програма не вимагає попереднього установлення, для її запуску необхідно скопіювати в один каталог головний завантажувальний файл Tkachenco.exe, файл динамічно підключуваної бібліотеки calculation.dll.
При роботі програми може виникнути таке повідомлення:
dll не знайденo! - це повідомлення виникає якщо у папці з програмою відсутній файл динамічно підключаємої бібліотеки.
Внаслідок виникнення критичної помилки слід перезавантажити головну програму.
візуальний файл програма меню
ВИСНОВКИ
При виконанні курсової роботи були використані мови системного програмування С++ та Assembler. Було розроблено меню програми з використанням бібліотеки MFC, яке дає можливість виконувати обробку повідомлень від його команд. Були розроблені панелі інструментів та рядок стану. Було написано функцію мовою Assembler та підключено її до головного проекту у бібліотеці DLL. При роботі з діалоговими вікнами було здобуто навики по організації обміну та обробки даних, введених користувачем та проектуванні діалогових вікон довільної складності. Використовувались також такі елементи системного програмування як робота з файлами та керування графічними пристроями.
При роботі з графічною бібліотекою OpenGL було встановлено, що OpenGL дає надзвичайно великі можливості у проектуванні та моделюванні графічних об'єктів, вимагаючи при цьому володіння складним математичним апаратом. Бібліотека є відкритою та нескладною у застосуванні, оскільки містить більше двохсот п'ятдесяти функцій для рисування складних трьохвимірних сцен із простих примітивів.
Виконуючи завдання курсової роботи, я в цілому поглибила свої навички з написання системних об'єктно-орієнтованих програм, навчилась створювати складні програми на базі простих за допомогою бібліотек MFC пакету Microsoft Visual Studio 2008.
СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ
1. Секунов Н.Ю. Самоучитель Visual C++. - СПб.: БХВ-Петербург, 2002. - 736 с.
2. Шеферд Джордж, Программирование на MicroSoft Visual C++/Пер. с англ, - М.: “Русская Редакція”, 2003.--928с.
3. C.Холзнер. Visual C++.: Учебный курс - СПб.:Питер, 2001. - 576с.
4. Поляков А.К., Брусенцев В.С., Методы и алгоритмы компьютерной графики в примерах на Visual C++.- СПб.: БХВ-Петербург, 2003 г. -560с.
5. Семеренко В.П., Програмування мовами С та С++ в середовищі Windows.- Вінниця: ВДТУ, 2002 р. -128с.
6. Герберт Шилдт. Полный справочник по С.-Київ:Вільямс, 2002г.- 365с.
7. Бурдаев О. В., Иванов М. А., Тетерин И. И.- Ассемблер в задачах защиты информации.-Москва: КУДИЦ-Образ, 2004 г.- 320с.
8. Баженова І.Ю., Visual C++ 6.0 Уроки програмування.- Київ:Фоліо,1997. - 634с.
ДОДАТКИ
ДОДАТОК А
Лістинг файлу symbolsDlg.CPP
// SymbolsDlg.cpp : файл реализации
//
#include "stdafx.h"
#include "Symbols.h"
#include "SymbolsDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// Диалоговое окно CAboutDlg используется для описания сведений о приложении
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
double y;
// Данные диалогового окна
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // поддержка DDX/DDV
// Реализация
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// диалоговое окно CSymbolsDlg
CSymbolsDlg::CSymbolsDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CSymbolsDlg::IDD, pParent)
, m_S(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CSymbolsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_SYMB_EDIT, m_S);
}
BEGIN_MESSAGE_MAP(CSymbolsDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_EN_CHANGE(IDC_SYMB_EDIT, &CSymbolsDlg::OnChangeSymbEdit)
ON_COMMAND(ID_32771, &CSymbolsDlg::On32771)
//ON_COMMAND(ID_32772, &CSymbolsDlg::On32772)
ON_COMMAND(ID_32772, &CSymbolsDlg::On32772)
ON_COMMAND(ID_32773, &CSymbolsDlg::On32773)
ON_COMMAND(ID_32774, &CSymbolsDlg::On32774)
ON_COMMAND(ID_FILE_OPEN32775, &CSymbolsDlg::OnFileOpen32775)
ON_COMMAND(ID_RUN_RUN, &CSymbolsDlg::OnRunRun)
END_MESSAGE_MAP()
// обработчики сообщений CSymbolsDlg
BOOL CSymbolsDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// Добавление пункта "О программе..." в системное меню.
// IDM_ABOUTBOX должен быть в пределах системной команды.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Задает значок для этого диалогового окна. Среда делает это автоматически,
// если главное окно приложения не является диалоговым
SetIcon(m_hIcon, TRUE);// Крупный значок
SetIcon(m_hIcon, FALSE);// Мелкий значок
// TODO: добавьте дополнительную инициализацию
return TRUE; // возврат значения TRUE, если фокус не передан элементу управления
}
void CSymbolsDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// При добавлении кнопки свертывания в диалоговое окно нужно воспользоваться приведенным ниже кодом,
// чтобы нарисовать значок. Для приложений MFC, использующих модель документов или представлений,
// это автоматически выполняется рабочей областью.
void CSymbolsDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // контекст устройства для рисования
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Выравнивание значка по центру клиентского прямоугольника
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Нарисуйте значок
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
// Система вызывает эту функцию для получения отображения курсора при перемещении
// свернутого окна.
HCURSOR CSymbolsDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CSymbolsDlg::OnChangeSymbEdit()
{
// TODO: Если это элемент управления RICHEDIT, то элемент управления не будет
// send this notification unless you override the CDialogEx::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
UpdateData(TRUE);
// TODO: Добавьте код элемента управления
}
void CSymbolsDlg::On32771()
{
}
void CSymbolsDlg::On32772()
{
OnOK();
}
void CSymbolsDlg::On32773()
{
CAboutDlg dlg;
dlg.DoModal();
}
void CSymbolsDlg::On32774()
{
CString string="Результати обчислень : ";
CString s;
s.Format("%.2f",y);
CFileDialog DlgSave(FALSE,"txt","",OFN_HIDEREADONLY,
"Text file (*.txt)|*.txt|All Files(*.*)|*.*|",this);
string+=s;
if(DlgSave.DoModal()==IDOK)
{
CStdioFile File(DlgSave.GetPathName(),
CFile::modeCreate | CFile::modeWrite);
File.WriteString(LPCSTR(string));
}
// TODO: добавьте свой код обработчика команд
}
void CSymbolsDlg::OnFileOpen32775()
{
// TODO: добавьте свой код обработчика команд
char text [1024] = "";
CFileDialog fileDlg(true, "*", NULL, OFN_HIDEREADONLY, "Файли txt (*.txt)|*.txt||");
if (fileDlg.DoModal() == IDOK)
{
CFile file(fileDlg.GetPathName(), CFile::modeRead);
file.Read(text, sizeof(text));
file.Close();
}
MessageBox(text);
}
void CSymbolsDlg::OnRunRun()
{
double x,a,b,c,d,m1,m2,m3,m4,m5,m6,m7;
CString s,stx,sta,stb,stc,std,stm1,stm2,stm3,stm4,stm5,stm6,stm7;
GetDlgItemText(IDC_SYMB_EDIT,stx);
GetDlgItemText(IDC_SYMB_EDIT2,sta);
GetDlgItemText(IDC_SYMB_EDIT3,stb);
GetDlgItemText(IDC_SYMB_EDIT4,stc);
GetDlgItemText(IDC_SYMB_EDIT5,std);
GetDlgItemText(IDC_SYMB_EDIT11,stm1);
GetDlgItemText(IDC_SYMB_EDIT6,stm2);
GetDlgItemText(IDC_SYMB_EDIT7,stm3);
GetDlgItemText(IDC_SYMB_EDIT8,stm4);
GetDlgItemText(IDC_SYMB_EDIT9,stm5);
GetDlgItemText(IDC_SYMB_EDIT10,stm6);
GetDlgItemText(IDC_SYMB_EDIT12,stm7);
b=1;
x = atof(stx);
a = atof(sta);
b = atof(stb);
c = atof(stc);
d = atof(std);
m1 = atof(stm1);
m2 = atof(stm2);
m3= atof(stm3);
m4= atof(stm4);
m5= atof(stm5);
m6= atof(stm6);
m7= atof(stm7);
double arr[7];
arr[0]=m1;
arr[1]=m2;
arr[2]=m3;
arr[3]=m4;
arr[4]=m5;
arr[5]=m6;
arr[6]=m7;
HINSTANCE hDll;
hDll = ::LoadLibrary("dlla.dll");//завантаження
if (hDll==NULL)
{
MessageBoxA("dll не знайденo!");
SendMessage(WM_CLOSE);
return;
}
typedef int (*FUN)(double,double,double,double,double,double[7]);
FUN func;
func = (FUN)::GetProcAddress(hDll, "calculation");
double
rezultat = (*func)(a,b,c,d,x,arr);
::FreeLibrary(hDll);//вивантаження
s.Format("%.2f", rezultat);
MessageBox(s);
}
ДОДАТОК Б
Лістинг файлу dlla.cpp
#include "stdafx.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
double calculation(double a,double b,double c,double d,double x,double arr[7])
{
double l=8,x=0,n=7;
_asm
{
mov eax,0
CMP x,3
JB l1
CMP x,7
JAE l2
jmp l3
l1:
mov eax,a
sub eax,c
add eax,a
div eax,d
mov ebx,b
mul ebx,b
mov ebz,5
mul ebz,d
div ebx,ebz
add eax,ebx
jmp l3
l2:
mov esi,arr
mov edx,l
mov ecx,n
mov eax,0
l4:
add eax,[esi]
add esi,edx
loop l4
mov esb,a
mul esb,a
sub esb,b
mul eax
l3:
mov x,eax
}
return x;
}
ДОДАТОК В
Лістинг файлу resource.h
// Next default values for new objects
//
ДОДАТОК Г
Лістинг файлу symbolsDlg.h
// SymbolsDlg.h : файл заголовка
//
#pragma once
// диалоговое окно CSymbolsDlg
class CSymbolsDlg : public CDialogEx
{
// Создание
public:
CSymbolsDlg(CWnd* pParent = NULL);// стандартный конструктор
// Данные диалогового окна
enum { IDD = IDD_SYMBOLS_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX);// поддержка DDX/DDV
// Реализация
protected:
HICON m_hIcon;
// Созданные функции схемы сообщений
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
double y;
CString m_S;
afx_msg void OnChangeSymbEdit();
afx_msg void On32771();
//afx_msg void On32772();
afx_msg void On32772();
afx_msg void On32773();
afx_msg void On32774();
afx_msg void OnFileOpen32775();
afx_msg void OnRunRun();
};
Размещено на Allbest.ru
Подобные документы
Розробка меню програми: головне меню; таблиця акселератора. Панель інструментів та рядок стану. Створення діалогових вікон. Реалізація математичної функції мовою Assembler. Створення та підключення бібліотеки dll. Роботи з файлами: відкриття, збереження.
курсовая работа [1,3 M], добавлен 26.12.2009Програма на мові програмування С++. Аналіз стану технологій програмування та обґрунтування теми. Розробка програми виконання завдання, методу вирішення задачі. Робота з файлами, обробка числової інформації і робота з графікою. Розробка програми меню.
курсовая работа [41,0 K], добавлен 17.02.2009Призначення модулів та їх структура. Компіляція програм, які використовують модулі. Програмна реалізація алгоритму створення бібліотеки операцій над векторами. Інструкція користувачеві програми. Контрольні приклади та аналіз результатів їх реалізації.
курсовая работа [145,6 K], добавлен 20.03.2011Опис процесу створення технічного завдання на розробку бази даних для сільської бібліотеки. Виявлення масиву даних та їх структури. Внесення інформації в базу. Визначення типів і зв’язків між таблицями. Створення інтерфейсу системи керування базою даних.
контрольная работа [174,9 K], добавлен 07.01.2015Розв'язання задач мовою програмування VBA з використанням алгоритмів лінійної, розгалуженої та ітераційної циклічної структури. Розробка блок-схеми алгоритму, таблиці ідентифікаторів та тексту програми. Створення власної панелі інструментів користувача.
практическая работа [1012,6 K], добавлен 19.02.2010Програмування під DOS мовою низького рівня Асемблер (ASM-86). Функції програми: виведення в довільне місце екрану тексту заданого стилю та кольору, змінення шрифту, розміру літер та напрямку їх виводу. Алгоритм програми, системні вимоги до комп'ютера.
курсовая работа [47,4 K], добавлен 03.06.2009Меню та панелі інструментів Microsoft Excel. Введення та редагування даних. Відкриття робочої книги. Форматування табличних даних. Порядок введення формули. Стиль подання даних. Робота з майстром функцій. Сортування, фільтрація даних зведених таблиць.
курсовая работа [1,7 M], добавлен 13.07.2014Аналіз сучасного стану технологій програмування. Порівняння відстані між центрами кіл з радіусами. Класи, які використовуються при розробці програми меню. Розробка та виконання тестового прикладу. Виведення кіл на екран та інструкція користувача.
курсовая работа [229,0 K], добавлен 14.03.2013Загальні відомості про мову програмування, історія створення та використовування. Програма мовою Паскаль складається з лексем і символів – розділювачів. Робота з масивами, створення алгортимів. Складання програм з використанням процедур та функцій.
реферат [18,3 K], добавлен 22.10.2010Концепції об'єктно-орієнтованого програмування. Методи створення класів. Доступ до методів базового класу. Структура даних, функції. Розробка додатку на основі діалогових вікон, програми меню. Засоби розробки програмного забезпечення мовами Java та С++.
курсовая работа [502,5 K], добавлен 01.04.2016