Проектування користувальницького інтерфейсу в C++ Builder
Міністерство освіти і науки України
Закарпатський державний університет
ФАКУЛЬТЕТ ІНФОРМАТИКИ
КАФЕДРА ІНФОРМАЦІЙНИХ УПРАВЛЯЮЧИХ СИСТЕМ ТА ТЕХНОЛОГІЙ
Реєстраційний №________
Дата ___________________
КУРСОВА РОБОТА
Тема:
Проектування користувальницького інтерфейсу в C++ Builder
Рекомендована до захисту
“____” __________ 2008р.
Робота захищена
“____” __________ 2008р.
з оцінкою
_____________________
Підписи членів комісії
Зміст
Вступ
Теорія
Практична частина
Висновки
Література
Вступ
Borland C++ Builder - створене недавно компанією Borland засіб швидкої розробки проектів, що дозволяє створювати проекту мовою C++, використовуючи при цьому середовище розробки та бібліотеку компонентів Delphi. У даній частині роботи розглядається середовище розробки C++ Builder та основні прийоми, застосовувані при проектуванні користувальницького інтерфейсу. C++ Builder виробництва корпорації Borland призначена для операційних систем Windows 95 та NT. Інтегроване середовище C++ Builder забезпечує швидкість візуальної розробки, продуктивність повторно використовуваних компонентів у сполученні з міццю мовних засобів C++, удосконаленими інструментами та різномасштабними засобами доступу до баз даних. C++ Builder може бути використаний скрізь, де потрібно доповнити існуючі додатки розширеним стандартом мови C++, підвищити швидкодія та додати користувальницькому інтерфейсу якості професійного рівня.
Головною метою нашої роботи, буде написання інтерактивної системи навчання програмуванню на мові C++. В теоретичній частині наведемо основні відомості про інструментарій.
Теорія
Розглянемо характеристики, які притаманні Borland C++ Builder на як системі объєктно-орієнтованого програмування для швидкої розробки сучасного математичного забезпечення персональних комп'ютерів. Borland C++ Builder випускається в трьох варіантах: Standard, Professional й Client/Server Suite.
Швидкість візуальної розробки
Інтегроване середовище розробки поєднує Редактор форм. Інспектор об'єктів. Палітру компонентів. Адміністратор проекту й повністю інтегровані Редактор коду й Отладчік - інструменти швидкої розробки програмних додатків, що забезпечують повний контроль над кодом і ресурсами.
Професійні засоби мови C++ інтегровані у візуальне середовище розробки. C++Builder надає швидкодіючий компілятор з мови Borland C++, ефективний інкрементний завантажник і гнучкі засоби налагодження як на рівні вихідних інструкцій, так і на рівні ассемблерних команд - у розрахунку задовольнити високі вимоги програмістів-професіоналів.
Конструювання по способі "drag-and-drop " дозволяє створювати додаток простим перетаскуванням захоплених мишею візуальних компонентів з Палітри на форму додатка. Інспектор об'єктів надає можливість оперувати із властивостями й подіями компонент, автоматично створюючи заготівлі функцій обробки подій, які наповнюються кодом і редагуються в процесі розробки.
Механізми двунаправленої розробки (two-way-tools) усувають бар'єри між програмістом і його кодом. Технологія двунаправленої розробки забезпечує контроль за вашим кодом за допомогою гнучкого, інтегрованого й синхронізованої взаємодії між інструментами візуального проектування й Редактором коду.
Властивості, методи й події - це саме ті елементи мови, які забезпечують швидку розробку додатків у рамках об‘єктно - орієнтованого програмування. Властивості дозволяють легко встановлювати різноманітні характеристики об'єктів. Методи роблять певні, іноді досить складні, операції над об'єктом. Події зв'язують впливу користувача на об'єкти з кодами реакції на ці впливи. Події можуть виникати при таких специфічних змінах стану об'єктів як відновлення даних в інтерфейсних елементах доступу до баз даних. Працюючи спільно, властивості, методи й події утворять середовище RAD (Rapid Application Development) швидкого й інтуїтивного програмування надійних додатків для Windows.
Візуальне спадкування форм втілює найважливіший аспект об‘єктно -орієнтованого програмування в зручному для користування інструменті візуального проектування. Характеристики нової форми додатки можуть бути успадковані від будь-якої іншої існуючої форми, що забезпечує централізовану репродукцію змін користувальницького інтерфейсу, полегшує контроль за кодом і зменшує тимчасові витрати на введення нових якісних атрибутів.
Випробування прототипу дозволяє без праці переходити від прототипу додатка до повністю функціонального, професійно оформленому програмному продукту, діючи в межах інтегрованого середовища. Щоб упевнитися, що ваша програма робить очікувані результати, раніше доводилося багаторазово проходити по циклі редагування => компіляція => зборка, непродуктивно витрачаючи час. C++Builder поєднує три етапи розробки в єдиний виробничий процес. У результаті вдається будувати додатка, що базуються на поточних вимогах замовника, разом з тим гнучкі настільки, щоб швидко адаптувати їх до нових запитів користувачів.
Майстер інсталяції керує створенням уніфікованих дистрибутивних пакетів для розроблених додатків.
Вихідні тексти Бібліотеки Візуальних Компонентів полегшують розробку нових компонентів на базі готових прикладів.
Відриті інструменти API можуть бути безпосередньо інтегровані у візуальне середовище системи. Ви зможете підключити звичний текстовий редактор або створити власного майстра для автоматизації виконання повторюваних процедур.
Розширена математична бібліотека містить додаткові уніфіковані функції статистичних і фінансових обчислень.
Продуктивність компонентів
Бібліотека Візуальних Компонентів VCL придбала статус нового промислового стандарту й у цей час застосовується більш ніж півмільйоном користувачів, істотно прискорюючи розробку надійних додатків будь-якого ступеня складності. VCL містить близько 100 повторно використовуваних компонентів, які реалізують всі елементи користувальницького інтерфейсу операційної системи Windows 95. Крім того, VCL надають у розпорядження програмістів такі оригінальні об'єкти, як записні книжки із закладками, табличні сітки для відображення вмісту баз даних і навіть органи керування пристроями мультимедія. Перебуваючи в середовищі об‘єктно - орієнтованого Програмування C++Builder, компоненти можна використати безпосередньо, міняти їхні властивості, вигляд і поводження або породжувати похідні елементи, з потрібними відмітними характеристиками.
Сховище об'єктів є інструментом нової методики зберігання й повторного використання модулів даних, об'єктів, форм і програмної бізнесу-логіки. Оскільки побудова нового додатка на існуючому фундаменті значно заощаджує тимчасові витрати, сховище об'єктів надає для повторного використання готові структури: форми й закінчених програмних модулів. Створюючи прототип нового додатка, ви можете успадковувати, посилатися або просто копіювати існуючу структуру - точно так само архітектор приступає до проектування нового будинку.
Компонента ChartFX забезпечує негайна побудова на вашій формі різноманітних графіків, діаграм, таблиць і передбачає перевірку правопису на багатьох мовах. У варіанті C++Builder Standard цей компонент є єдиним представником групи Active.
Інтеграція компонентів Active дозволяє розширити Бібліотеку Візуальних Компонентів, включивши компоненти стандарту Active для розробки додатків у мережі Internet. Якщо ваш комп'ютер має вихід в Internet, з'єднаєтеся із сервером за адресою
http://www.borland.com/devsupport/bcppbuilder/netmanage.html
і скачайте файл автоматичної інтеграції OCXINTEG.ZIP (12 Кбайт) і файл керування мережею AX602.ZIP (6.5 байт), розроблений фірмою NetManage. Файл інтеграції автоматично проведе для вас процедуру додавання нових компонентів до VCL й установить їх на Палітру. У результаті ви одержите можливість розробляти додатка для Internet, аж до створення власного мережного коммуникатора (HTML browser).
Потужність язикових засобів C++
Оптимизирующий 32-розрядний компілятор побудований по перевіреної провідної компіляторної технології корпорації Borland, що забезпечує винятково відмінкову й швидку оптимізацію як довжини вихідного коду, що виконує, так і витрачає пам‘яті, що.
Нові елементи стандарту ANSI/ISO мови C++ представлені шаблонами, просторами імен, виключеннями, інформацією про типи часу виконання (RTTI), поряд з розширенням набору ключових слів bool, explicit, mutable, typename. automated й ін.
Инкрементальный линкер здійснює швидку й надійну зборку додатку у форматі ЕХЕ файлів порівняно меншого розміру. Автоматично усуваючи повторну зборку не змінилися вихідних об'єктних файлів і підключення невикористовуваних функцій, інкрементальній линкер будує ефективну виконувану програму з мінімальними втратами часу.
Чистий і доступний код додатків, які C++Builder будує на основі надаваних розроблювачеві компонентних властивостей, подій і методів, виключає сховані й важкі в налагодженні макроси.
Підтримка промислових стандартів Active, OLE, СОМ, MAPI, Windows Sockets TCP/IP, ISAPI. NSAPI, ODBC, Unicode й MBCS.
Отладчик низького рівня CPU View дозволяє проникнути в специфіку роботи вашого додатка на рівні машинних кодів. Вікно отладчіка розділене на п'ять панелей. Панель ассемблерних команд інтерпретує виконання вихідної C++ програми. Панель пам'яті показує вміст блоку пам'яті, доступного завантаженому й модулю, що виконує в даний момент. Панель стека відображає поточний уміст верхівки програмного стека. Панель регістрів і панель прапорів показують поточні значення регістрів і службових битов центрального процесора. Кожна панель включає власне меню, що управляє її видом і поводженням.
Інструменти командного рядка включені в систему на вимогу професіоналів, які завжди прагнуть зберегти детальний контроль над процесами компіляції й зборки своїх програмних файлів.
Створення DLL, LIB, і ЕХЕ файлів надає волю вибору формату цільового додатка відповідно до вимог конкретного проекту.
Пряме звертання до системних функцій Windows 95 й NT дає можливість програмістам, що працюють у середовищі C++Builder. при необхідності скористатися всіма вдосконаленнями сучасних операційних систем.
Механізм OLE Automation надає вашому додатку можливість управляти іншими типовими програмними комплексами для Windows (такими як Microsoft Word, Excel, Visual Basic, Lotus 1-2-3, dBASE й Paradox) за схемою мережної взаємодії контролер/сервер.
Масштабовані з'єднання з базами даних
Розробка по способі "drag-and-drop" багаторазово спрощує й прискорює звичайно трудомісткий процес програмування СУБД в архітектурі клієнт/сервер. Широкий вибір компонентів керування візуалізацією й редагуванням дозволяє легко змінювати вид відображуваної інформації й поводження програми. C++Builder використає Провідник баз даних (Database Explorer) і масштабований Словник даних (Data Dictionary ), щоб автоматично настроїти засобу відображення й редагування стосовно до специфіки вашої інформації.
Провідник баз даних надає графічний спосіб проводки користувача по вмісту бази даних, забезпечуючи створення й модифікацію таблиць, ієрархічних покажчиків і псевдонімів.
Словник даних підтримує цілісність інформації, що змінюється, про вміст таблиць баз даних. Користувач може динамічно модифікувати склад Словника. Словник містить інформацію про розширені атрибути полів у записах: мінімальні й максимальні значення, властивості відображення, маски редагування й т.п.
Живі дані (live data) надаються розроблювачеві в процесі візуального проектування прототипів і при випробуванні додатків баз даних. Вам не буде потрібно більше писати тестові пастки або багаторазово перетранслювати й запускати додаток - дані на стадії проектування будуть точно такими ж і представлені точно так само, як їх побачить користувач закінченої програми.
Механізм BDE (Borland Database Engine) підтримує високопродуктивний 32-розрядний доступ до баз даних dBASE, Paradox: Sybase. Oracle, DB2. Microsoft SQL Server. Informix, InterBase й Local InterBase. C++Builder використає контролер ODBC (Open Database Connectivity) виробництва Microsoft для зв'язку із серверами баз даних Excel, Access, FoxPro й Btrieve. Будучи фундаментом будь-якого додатка бази даних, BDE тісно пов'язаний зі Сховищем об'єктів і Модулями даних.
Об'єкти Модулів даних діють як сполучний каркас додатка - вони визначають джерела й бізнес-логіку бази даних, фіксують взаємозв'язку компонентів. У централізованій моделі доступу до даних бізнесу-логіка відділена від розробки графічного інтерфейсу з користувачем (GUI). Будь-яка зміна бізнесу-логіки вашої бази даних позначається на поводженні тільки відповідного Модуля даних, а результати зміни проявляються негайно у всіх додатках, що використають даний модуль. Працюючи з модулями даних, ви однократно встановлюєте зв'язки вашого додатка з адресуємої базою даних, а потім по способі "drag-and-drop" можете перетаскувати поля записів на нові форми - у будь-який вузол вашої мережі. Ніякого додаткового кодування при цьому не потрібно.
Фільтри поля посилань установлюють обмеження пошуку й відображення інформації бази даних простим натисканням кнопки. Змінюючи значення властивості Filter у компонентах доступу, можна специфіцировати деяка підмножина даних, що цікавлять вас. Посилання забезпечують автоматичне відображення даних з декількох таблиць.
Копійовані відновлення (cached updates) помітно прискорюють відгук SQL сервера за рахунок зменшення загального числа мережних обмінів із клієнтом. Будучи впакованими, множинні комунікації проявляють себе як одиночні транзакції, тим самим знижуючи завантаженість сервера й поліпшуючи продуктивність вашого додатка.
Звіти Quick Reports дозволяють візуально конструювати стилізовані звіти за даними, що поставляє будь-яким джерелом, включаючи таблиці й запити компонентів доступу до баз даних. Звіти можуть містити поля заголовків, колонтитулів, виносок і підсумків. Quick Reports надають потужні кошти відображення звітів у різних видах, автоматичного підведення підсумків і підрахунку полів - на будь-якому рівні угруповання даних.
Застосування BORLAND C++ BUILDER для створення ігрових програм:
Borland C++ Builder - випущене недавно компанією Borland засіб швидкої розробки проектів, що дозволяє створювати проекту мовою C++, використовуючи при цьому середовище розробки та бібліотеку компонентів Delphi. У даній частині роботи розглядається середовище розробки C++ Builder та основні прийоми, застосовувані при проектуванні користувальницького інтерфейсу.
Середовище розробки C++ Builder
C++ Builder являє собою SDI-додаток, головне вікно якого містить інструментальну панель, що набудоване (ліворуч) і палітру компонентів (праворуч). Крім цього, при запуску C++ Builder з'являються вікно інспектора об'єктів (ліворуч) і форма нового проекту (праворуч). Під вікном форми проекту перебуває вікно редактора коду.
Рис.1. Середовище розробки C++ Builder
Форми є основою проектів C++ Builder. Створення користувальницького інтерфейсу проекту полягає в додаванні у вікно форми елементів об'єктів C++ Builder, називаних компонентами. Компоненти C++ Builder розташовуються на палітрі компонентів, виконаної у вигляді многостранічного блокнота. Важлива особливість C++ Builder полягає в тому, що він дозволяє створювати власні компоненти та набудовувати палітру компонентів, а також створювати різні версії палітри компонентів для різних проектів.
Компоненти C++ Builder
Компоненти розділяються на видимі (візуальні) і невидимі (невізуальні). Візуальні компоненти з'являються під час виконання точно так само, як і під час проектування. Прикладами є кнопки та редагують поля, що. Невізуальні компоненти з'являються під час проектування як піктограми на формі. Вони ніколи не видні під час виконання, але мають певну функціональність (наприклад, забезпечують доступ до даних, викликають стандартні діалоги Windows 95та ін.)
Рис. 2. Приклад використання видимих і невидимих компонентів
Для додавання компонента у форму можна вибрати мишею потрібний компонент у палітрі та клацнути лівою клавішею миші в потрібнім місці проектованої форми. Компонент з'явиться на формі, і далі його можна переміщати, міняти розміри та інші характеристики.
Кожен компонент C++ Builder має три різновиди характеристик: властивості, події та методи.
Якщо вибрати компонент із палітри та додати його до форми, інспектор об'єктів автоматично покаже властивості та події, які можуть бути використані з тім компонентом. У верхній частині інспектора об'єктів є список, що випадає, що дозволяє вибирати потрібний об'єкт із наявних на формі.
Рис.3. Інспектор об'єктів
Властивості компонентів
Властивості є атрибутами компонента, що визначають його зовнішній вигляд і поводження. Багато властивостей компонента в колонку властивостей мають значення, яке встановлюється за замовчуванням (наприклад, висота кнопок). Властивості компонента відображаються а сторінці властивостей (Properties). Інспектор об'єктів відображає опубліковані (published) властивості компонентів. Крім published-властивостей, компоненти можуть і найчастіше мають загальні (public), опубліковані властивості, які доступні тільки під час виконання проекту. Інспектор об'єктів використається для установки властивостей під час проектування. Список властивостей розташовується на сторінці властивостей інспектори об'єктів. Можна визначити властивості під час проектування або написати код для видозміни властивостей компонента під час виконання проекту.
При визначенні властивостей компонента під час проектування потрібно вибрати компонент на формі, відкрити сторінку властивостей в інспекторі об'єктів, вибрати обумовлена властивість і змінити його за допомогою редактора властивостей (це може бути пусте поле для уведення тексту або числа, що випадає список, що розкривається список, діалогова панель і т.д.).
Події
Сторінка подій (Events) інспектори об'єктів показує список подій, розпізнаваних компонентом (програмування для операційних систем із графічним користувальницьким інтерфейсом, зокрема, для Windows 95 або Windows NT пре думає опис реакції проекту на ті або інші події, а сама операційна система займається постійним опитуванням комп'ютера з метою виявлення настання якої-небудь події). Кожен компонент має свій власний набір оброблювачів подій. В C++ Builder варто писати функції, називані оброблювачами подій, і зв'язувати події із цими функціями. Створюючи оброблювач тої чи іншої події, ви доручаєте програмі виконати написану функцію, якщо ця подія відбудеться.
Для того, щоб додати оброблювач подій, потрібно вибрати на формі за допомогою миші компонент, якому необхідний оброблювач подій, потім відкрити сторінку подій інспектори об'єктів і двічі клацнути лівою клавішею миші на колонку з поруч із подією, щоб змусити C++ Builder згенерувати прототип оброблювача подій і показати його в редакторі коду. При цьому автоматично генерується текст порожньої функції, і редактор відкривається в тім місці, де варто вводити код. Курсор позиціюється усередині операторних дужок { ... }. Далі потрібно ввести код, що повинен виконуватися при настанні події. Оброблювач подій може мати параметри, які вказуються після імені функції в круглих дужках.
Рис.4. Прототип оброблювача подій.
Методи
Метод є функцією, що пов'язана з компонентом, і яка оголошується як частина об'єкта. Створюючи оброблювачі подій, можна викликати методи, використовуючи наступну нотацію: ->, наприклад:
Edit1->Show();
Відзначимо, що при створенні форми пов'язані з нею модуль і заголовний файл із розширенням *.h генеруються обов'язково, тоді як при створенні нового модуля він не зобов'язаний бути пов'язаний з формою (наприклад, якщо в ньому втримуються процедури розрахунків). Імена форми та модуля можна змінити, причому бажано зробити це відразу після створення, поки на них не з'явилося багато посилань в інших формах і модулях.
Менеджер проектів
Файли, що утворять додаток – форми та модулі - зібрані в проект. Менеджер проектів показує списки файлів і модулів проекту та дозволяє створювати навігацію між ними. Можна викликати менеджер проектів , вибравши пункт меню View/Project Manager. За замовчуванням знову створений проект одержує ім'я Project1.cpp.
Рис.5. Менеджер проектів
За замовчуванням проект спочатку містить файли для однієї форми та вихідного коду одного модуля. Однак більшість проектів містять кілька форм і модулів. Щоб додати модуль або форму до проекту, потрібно клацнути правою кнопкою миші та вибрати пункт New Form з контекстного меню. Можна також додавати існуючі форми та модулі до проекту, використовуючи кнопку Add контекстного меню менеджера проектів і вибираючи модуль або форму, яку потрібно додати. Форми та модулі можна видалити в будь-який момент протягом розробки проекту. Однак, через те, що форма зв'язані завжди з модулем, не можна видалити одне без видалення іншого, за винятком случаючи, коли модуль не має зв'язку з формою. Видалити модуль із проекту можна, використовуючи кнопку Remove менеджера проектів.
Якщо вибрати кнопку Options у менеджері проектів, відкриється діалогова панель опцій проекту, у якій можна вибрати головну форму проекту, визначити, які форми будуть створюватися динамічно, які параметри компіляції модулів (у тому числі створених в Delphi 2.0, тому що C++ Builder може включати їх у проекти) і компонування.
Рис. 6. Установка опцій проекту
Важливим елементом середовища розробки C++ Builder є контекстне меню, яке з‘являється при натисканні на праву клавішу миші та дозволяє швидкий доступ до найбільше часто використовуваних команд.
Зрозуміло, C++ Builder має убудовану систему контекстно-контекстно-залежної допомоги, доступної для будь-якого елемента інтерфейсу та довідкової інформації, що є великим джерелом, про C++ Builder.
Практична частина
Середою розробки був вибраний інструментарій C++ Builder. Програма складається з 6 основних модулей лістинг який проводиться нище. Зауважимо лише, що вся текстова інформації системи навчання міститься у відповідних .DOC файлах, що дозволяє досить просто та оперативно управляти самою програмою.
Лістинг 1. (project.cpp)
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
USERES("Project1.res");
USEFORM("Unit1.cpp", Form1);
USEFORM("Unit2.cpp", Form2);
USEFORM("Unit3.cpp", Form3);
USEFORM("Unit4.cpp", Form4);
USEFORM("Unit5.cpp", Form5);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->CreateForm(__classid(TForm2), &Form2);
Application->CreateForm(__classid(TForm3), &Form3);
Application->CreateForm(__classid(TForm4), &Form4);
Application->CreateForm(__classid(TForm5), &Form5);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
return 0;
}
//---------------------------------------------------------------------------
Лістинг 2. (Unit1.cpp)
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Timer1Timer(TObject *Sender)
{
Timer1->Enabled = false;
DrawScene();
Yield();
Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
BOOL bSetupPixelFormat(HDC hdc)
{
PIXELFORMATDESCRIPTOR pfd, *ppfd;
int pixelformat;
ppfd = &pfd;
ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
ppfd->nVersion = 1;
ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER;
ppfd->dwLayerMask = PFD_MAIN_PLANE;
ppfd->iPixelType = PFD_TYPE_COLORINDEX;
ppfd->cColorBits = 8;
ppfd->cDepthBits = 16;
ppfd->cAccumBits = 0;
ppfd->cStencilBits = 0;
if ( (pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0 )
{
MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK);
return FALSE;
}
if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE)
{
MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK);
return FALSE;
}
return TRUE;
}
void TForm2::DrawScene()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();
latitude += latinc;
longitude += longinc;
polarView( radius, 0, latitude, longitude );
glIndexi(RED_INDEX);
glCallList(CONE);
glIndexi(BLUE_INDEX);
glCallList(GLOBE);
glIndexi(GREEN_INDEX);
glPushMatrix();
glTranslatef(0.8F, -0.65F, 0.0F);
glRotatef(30.0F, 1.0F, 0.5F, 1.0F);
glCallList(CYLINDER);
glPopMatrix();
glPopMatrix();
SwapBuffers(ghDC);
}
GLvoid TForm2::resize( GLsizei width, GLsizei height )
{
GLfloat aspect;
glViewport( 0, 0, width, height );
aspect = (GLfloat) width / height;
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 45.0, aspect, 3.0, 7.0 );
glMatrixMode( GL_MODELVIEW );
}
GLvoid TForm2::createObjects()
{
GLUquadricObj *quadObj;
glNewList(GLOBE, GL_COMPILE);
quadObj = gluNewQuadric ();
gluQuadricDrawStyle (quadObj, GLU_LINE);
gluSphere (quadObj, 1.5, 16, 16);
glEndList();
glNewList(CONE, GL_COMPILE);
quadObj = gluNewQuadric ();
gluQuadricDrawStyle (quadObj, GLU_FILL);
gluQuadricNormals (quadObj, GLU_SMOOTH);
gluCylinder(quadObj, 0.3, 0.0, 0.6, 15, 10);
glEndList();
glNewList(CYLINDER, GL_COMPILE);
glPushMatrix ();
glRotatef ((GLfloat)90.0, (GLfloat)1.0, (GLfloat)0.0, (GLfloat)0.0);
glTranslatef ((GLfloat)0.0, (GLfloat)0.0, (GLfloat)-1.0);
quadObj = gluNewQuadric ();
gluQuadricDrawStyle (quadObj, GLU_FILL);
gluQuadricNormals (quadObj, GLU_SMOOTH);
gluCylinder (quadObj, 0.3, 0.3, 0.6, 12, 2);
glPopMatrix ();
glEndList();
}
GLvoid TForm2::initializeGL(GLsizei width, GLsizei height)
{
GLfloat maxObjectSize, aspect;
GLdouble near_plane;
glClearIndex( (GLfloat)BLACK_INDEX);
glClearDepth( 1.0 );
glEnable(GL_DEPTH_TEST);
glMatrixMode( GL_PROJECTION );
aspect = (GLfloat) width / height;
gluPerspective( 45.0, aspect, 3.0, 7.0 );
glMatrixMode( GL_MODELVIEW );
near_plane = 3.0;
maxObjectSize = 3.0F;
radius = near_plane + maxObjectSize/2.0;
latitude = 0.0F;
longitude = 0.0F;
latinc = 6.0F;
longinc = 2.5F;
createObjects();
}
void TForm2::polarView(GLdouble radius, GLdouble twist, GLdouble latitude,
GLdouble longitude)
{
glTranslated(0.0, 0.0, -radius);
glRotated(-twist, 0.0, 0.0, 1.0);
glRotated(-latitude, 1.0, 0.0, 0.0);
glRotated(longitude, 0.0, 0.0, 1.0);
}
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
/* Timer1->Enabled = false;
*/
if (ghRC)
wglDeleteContext(ghRC);
if (ghDC)
ReleaseDC(Handle, ghDC);
MediaPlayer1->Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormCreate(TObject *Sender)
{
ghDC = GetDC(Handle);
if (!bSetupPixelFormat(ghDC))
Close();
ghRC = wglCreateContext(ghDC);
wglMakeCurrent(ghDC, ghRC);
initializeGL(ClientRect.Right, ClientRect.Bottom);
MediaPlayer1->Open();
MediaPlayer1->Play();
ProgressBar1->Position = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
MediaPlayer1->Close();
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormResize(TObject *Sender)
{
resize(ClientRect.Right, ClientRect.Bottom);
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Timer2Timer(TObject *Sender)
{
ProgressBar1->Position++;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
int step=0;
TForm3::nextstep(){
switch(step){
case 0:
deltatime(300);
break;
case 1:
MediaPlayer1->FileName = "data\\765888.mp3";
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 2:
deltatime(1000);
break;
case 3:
Shape3->Visible=true;
deltatime(300);
break;
case 4:
MediaPlayer1->FileName = "data\\9564334.mp3";
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 5:
Label1->Visible = false;
Label2->Visible = false;
Label3->Visible = false;
Label4->Visible = false;
Label5->Visible = false;
Label6->Visible = false;
Label7->Visible = false;
Label8->Visible = false;
Label9->Visible = false;
Label13->Visible = false;
Shape3->Visible=false;
/* Label10->Visible = false;
Label11->Visible = false;
Label12->Visible = false;
Label14->Visible = false;
Label15->Visible = false;
Label16->Visible = false;*/
Label10->Visible = true;
Label11->Visible = true;
Label12->Visible = true;
Label14->Visible = true;
deltatime(300);
break;
case 6:
MediaPlayer1->FileName = "data\\533677.mp3";
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 7:
deltatime(400);
break;
case 8:
Label1->Visible = true;
Label2->Visible = true;
Label3->Visible = true;
Label4->Visible = true;
Label5->Visible = true;
Label6->Visible = true;
Label7->Visible = true;
Label8->Visible = true;
Label9->Visible = true;
Label13->Visible = true;
Label10->Visible = false;
Label11->Visible = false;
Label12->Visible = false;
Label14->Visible = false;
deltatime(300);
break;
case 9:
Shape2->Visible=true;
deltatime(300);
break;
case 10:
MediaPlayer1->FileName = "data\\822567.mp3";
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 11:
deltatime(400);
break;
case 12:
Shape2->Visible=false;
deltatime(300);
break;
case 13:
MediaPlayer1->FileName = "data\\6345676.mp3";
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 14:
deltatime(400);
break;
case 15:
Label1->Visible = false;
Label3->Visible = false;
Label4->Visible = false;
Label5->Visible = false;
Label8->Visible = false;
Label9->Visible = false;
Label13->Visible = false;
deltatime(300);
break;
case 16:
MediaPlayer1->FileName = "data\\123423.mp3";
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 17:
deltatime(300);
break;
case 18:
Label1->Visible = true;
Label2->Visible = true;
Label3->Visible = true;
Label4->Visible = true;
Label5->Visible = true;
Label6->Visible = true;
Label7->Visible = true;
Label8->Visible = true;
Label9->Visible = true;
Label13->Visible = true;
Label10->Visible = false;
Label11->Visible = false;
Label12->Visible = false;
Label14->Visible = false;
deltatime(300);
break;
case 19:
MediaPlayer1->FileName = "data\\908976.mp3";
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 20:
deltatime(300);
break;
case 21:
Label2->Visible = false;
Label4->Visible = false;
Label6->Visible = false;
Label7->Visible = false;
Label8->Visible = false;
Label9->Visible = false;
deltatime(300);
break;
case 22:
MediaPlayer1->FileName = "data\\444555.mp3";
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 23:
deltatime(300);
break;
case 24:
Label1->Visible = true;
Label2->Visible = true;
Label3->Visible = true;
Label4->Visible = true;
Label5->Visible = true;
Label6->Visible = true;
Label7->Visible = true;
Label8->Visible = true;
Label9->Visible = true;
Label13->Visible = true;
Label10->Visible = false;
Label11->Visible = false;
Label12->Visible = false;
Label14->Visible = false;
deltatime(1500);
break;
case 25:
Label1->Visible = false;
Label2->Visible = false;
Label3->Visible = false;
Label5->Visible = false;
Label6->Visible = false;
Label7->Visible = false;
Label8->Visible = false;
Label9->Visible = false;
Label13->Visible = false;
deltatime(300);
break;
case 26:
MediaPlayer1->FileName = "data\\444777.mp3";
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 27:
deltatime(300);
break;
case 28:
MediaPlayer1->FileName = "data\\8349244.avi";
MediaPlayer1->Open();
MediaPlayer1->Play();
Label4->Visible = false;
break;
case 29:
Close();
break;
}
}
TForm3::deltatime(int delta){
Timer1->Interval = delta;
Timer1->Enabled = true;
}
void __fastcall TForm3::FormActivate(TObject *Sender)
{
Label1->Visible = true;
Label2->Visible = true;
Label3->Visible = true;
Label4->Visible = true;
Label5->Visible = true;
Label6->Visible = true;
Label7->Visible = true;
Label8->Visible = true;
Label9->Visible = true;
Label13->Visible = true;
Label10->Visible = false;
Label11->Visible = false;
Label12->Visible = false;
Label14->Visible = false;
step=0;
nextstep();
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Timer1Timer(TObject *Sender)
{
Timer1->Enabled = false;
step++;
nextstep();
}
//---------------------------------------------------------------------------
void __fastcall TForm3::BitBtn1Click(TObject *Sender)
{
MediaPlayer1->Close();
Timer1->Enabled = false;
deltatime(10);
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Timer2Timer(TObject *Sender)
{
nextstep();
}
//---------------------------------------------------------------------------
void __fastcall TForm3::MediaPlayer1Notify(TObject *Sender)
{
step++;
nextstep();
}
//---------------------------------------------------------------------------
void __fastcall TForm3::FormClose(TObject *Sender, TCloseAction &Action)
{
MediaPlayer1->Close();
Timer1->Enabled = false;
step=1000;
}
//---------------------------------------------------------------------------
int t=1;
void __fastcall TForm3::BitBtn3Click(TObject *Sender)
{
if(t)
{
MediaPlayer1->Notify = false;
MediaPlayer1->Pause();
}
else
{
MediaPlayer1->Resume();
MediaPlayer1->Notify = true;
}
//Timer1->Enabled = false;
}
//---------------------------------------------------------------------------
Лістинг 4. (Unit4.cpp)
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit4.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm4 *Form4;
//---------------------------------------------------------------------------
__fastcall TForm4::TForm4(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
TForm4::deltatime(int delta){
Timer1->Interval = delta;
Timer1->Enabled = true;
}
int step=0;
TForm4::nextstep(){
switch(step){
case 0:
deltatime(200);
break;
case 1:
MediaPlayer1->FileName = "data\\6565.mp3";
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 2:
deltatime(200);
break;
case 3:
MediaPlayer1->FileName = "data\\555.mp3";
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 4:
deltatime(200);
break;
case 5:
MediaPlayer1->FileName = "data\\4567.mp3";
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 6:
Close();
break;
}
}
void __fastcall TForm4::Timer1Timer(TObject *Sender)
{
Timer1->Enabled = false;
step++;
nextstep();
}
//---------------------------------------------------------------------------
void __fastcall TForm4::FormActivate(TObject *Sender)
{
step=0;
nextstep();
}
//---------------------------------------------------------------------------
void __fastcall TForm4::MediaPlayer1Notify(TObject *Sender)
{
step++;
nextstep();
}
//---------------------------------------------------------------------------
void __fastcall TForm4::FormClose(TObject *Sender, TCloseAction &Action)
{
MediaPlayer1->Close();
Timer1->Enabled = false;
step=1000;
}
//---------------------------------------------------------------------------
void __fastcall TForm4::BitBtn1Click(TObject *Sender)
{
MediaPlayer1->Close();
Timer1->Enabled = false;
deltatime(10);
}
//---------------------------------------------------------------------------
int t=1;
void __fastcall TForm4::BitBtn3Click(TObject *Sender)
{
if(t)
{
MediaPlayer1->Notify = false;
MediaPlayer1->Pause();
}
else
{
MediaPlayer1->Resume();
MediaPlayer1->Notify = true;
}
}
//---------------------------------------------------------------------------
Лістинг 5. (Unit5.cpp)
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit5.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm5 *Form5;
//---------------------------------------------------------------------------
__fastcall TForm5::TForm5(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
int step=0;
TForm5::nextstep(){
switch(step){
case 0:
deltatime(300);
break;
case 1:
MediaPlayer1->FileName = "data\\89674.mp3";
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 2:
deltatime(300);
break;
case 3:
Image3->Visible = true;
deltatime(300);
break;
case 4:
MediaPlayer1->FileName = "data\\888777.mp3";
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
case 5:
deltatime(200);
break;
case 6:
Image3->Visible = false;
deltatime(400);
break;
case 7:
Label1->Visible = true;
Label2->Visible = true;
Label3->Visible = true;
deltatime(200);
break;
case 8:
MediaPlayer1->FileName = "data\\876.mp3";
MediaPlayer1->Open();
MediaPlayer1->Play();
break;
}
}
TForm5::deltatime(int delta){
Timer1->Interval = delta;
Timer1->Enabled = true;
}
void __fastcall TForm5::FormActivate(TObject *Sender)
{
Label1->Visible = false;
Label2->Visible = false;
Label3->Visible = false;
Label4->Visible = false;
Label5->Visible = false;
Label6->Visible = false;
Label7->Visible = false;
Label8->Visible = false;
Label9->Visible = false;
Label13->Visible = false;
Label10->Visible = false;
Label11->Visible = false;
Label12->Visible = false;
Label14->Visible = false;
Image1->Visible = false;
Image2->Visible = false;
step=0;
nextstep();
}
//---------------------------------------------------------------------------
void __fastcall TForm5::Timer1Timer(TObject *Sender)
{
Timer1->Enabled = false;
step++;
nextstep();
}
//---------------------------------------------------------------------------
void __fastcall TForm5::BitBtn1Click(TObject *Sender)
{
MediaPlayer1->Close();
Timer1->Enabled = false;
deltatime(10);
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TForm5::MediaPlayer1Notify(TObject *Sender)
{
step++;
nextstep();
}
//---------------------------------------------------------------------------
void __fastcall TForm5::FormClose(TObject *Sender, TCloseAction &Action)
{
MediaPlayer1->Close();
Timer1->Enabled = false;
step=1000;
}
//---------------------------------------------------------------------------
int t=1;
void __fastcall TForm5::BitBtn3Click(TObject *Sender)
{
if(t)
{
MediaPlayer1->Notify = false;
MediaPlayer1->Pause();
}
else
{
MediaPlayer1->Resume();
MediaPlayer1->Notify = true;
}
//Timer1->Enabled = false;
}
//---------------------------------------------------------------------------
Результат роботи програми
Розроблена нами програма має досить простий інтерфейс та фактично буде являти собою простий док – вьюєр скомпонованих документів, які містять інформацію для навчання.
Скрін 1. Загальний графічний інтерфейс програми.
Скрін 2. Приклад уроку по Borland C++ Builder в розробленій нами програмі
Висновки
В нашій роботі були проаналізовані питання відносно теоретичної основи побудови програм з простим інтерфейсом користувача в середовищі Borland C++ Builder а також проблеми, які виникають при цьому. Результатом цього є програма яка реалізує процес навчання програмування на даній мові програмування.
Дана програма має досить простий інтерфейс та алгоритмічну структуру.
Література
Касаткин А.И., Вальвачев А.Н. Профессиональное прогрпммирование на языке Си. Мн., 1992. 240 С.
Бруно Бабэ. Просто и ясно о Borland C++. М., 1996. 400 С.
Справочник по классам Borland C++ 4.0. К., 1994. 256 С.