- •О.С. Зеленський
- •Розділ 1. Загальні відомості створення додатку windows
- •1.1. Створення додатку Windows за допомогою майстра AppWizard
- •1.2. Варіанти майстрів для різних проектів
- •1.3. Короткий опис sdi програми
- •1.4. Короткий опис mdi програми
- •1.5. Короткий опис простого діалогового додатку
- •Контрольні питання
- •Розділ 2. Повідомлення і команди
- •2.1. Обробка повідомлень
- •2.2. Цикли обробки повідомлень
- •2.3. Карти повідомлень
- •Контрольні питання
- •Розділ 3. Документи та види
- •3.1. Клас додатку
- •3.2. Клас головного вікна
- •3.3. Клас документа
- •3.4. Класи виду
- •Контрольні питання
- •Розділ 4. Робота з клавіатурою, мишею і меню
- •4.1. Робота з клавіатурою
- •4.2. Робота з мишею
- •4.3. Робота з меню
- •Контрольні питання
- •Розділ 5. Виведення на екран
- •5.1. Класи графічних об'єктів
- •5.2. Робота зі шрифтами
- •5.3. Робота з пензликами та малювання графічних фігур
- •5.4. Робота з пензликом
- •5.5. Робота зі скролінгом
- •5.6. Приклад роботи з таблицями
- •5.7. Малювання на екрані маніпулятором "миша"
- •5.8. Завантаження та виведення на екран бітових зображень
- •5.9. Копіювання бітових образів
- •5.10. Малювання графічних об'єктів з використанням резинових контурів та метафайлів
- •5.11. Виділення графічних об'єктів у прямокутній області
- •5.12. Універсальний приклад роботи з двовимірною графікою з використанням резинового контуру
- •5.13. Запис на диск та зчитування з диску графічних об'єктів
- •5.14. Побудова кругових діаграм і гістограм
- •5.15. Користувацький режим роботи з графікою на прикладі малювання годинника Clock
- •Контрольні питання
- •Завдання
- •Розділ 6. Друк і попередній перегляд документів
- •6.1. Вибір і налаштування параметрів друку
- •6.2. Створення контекста пристрою
- •6.3. Друк документів і бібліотека mfc
- •6.4. Масштабування
- •6.5. Друк багатосторінкового документа
- •Контрольні питання
- •Розділ 7. Робота з файлами
- •7.1. Приклад роботи з файлами на основі класів cFile, cStdioFile та потоку fstream
- •7.1.1. Робота з класом cFile
- •7.1.2. Робота з потоком fstream
- •Можливі режими доступу
- •7.1.3. Робота з класом cStdioFile
- •7.2. Серіалізація даних, клас cArchive
- •7.3. Використання реєстру в додатках
- •Контрольні питання
- •Завдання
- •Розділ 8. Діалогові вікна
- •8.1. Створення діалогового вікна та простіші елементи керування
- •8.2. Робота зі списками і комбінованими полями
- •8.3. Ускладнений приклад зі списками
- •8.4. Робота з повзунками
- •8.5. Виведення бітових матриць в діалозі та у вікні виду
- •8.6. Лінійний регулятор, лінійний індикатор, інкриментний регулятор
- •8.7. Стандартні діалоги вибору файлів, шрифтів та кольору
- •8.8. Взаємоз'вязок діалога, документа та виду при розробці додатку
- •8.8.1. Клас cDialDoc
- •8.8.2. Клас cDialView
- •8.8.3. Клас Cdlg
- •8.9. Формування вхідного документа на основі діалогу
- •Контрольні питання
- •Завдання Робота з типовими елементами керування
- •Робота зі списками і комбінованими полями
- •Список літератури
7.3. Використання реєстру в додатках
У перших версіях операційної системи Windows додатки зберігали параметри налаштування і власні опції у файлах ініціалізації, які, як правило, мали розширення .INI. У сучасних версіях Windows-додаток може зберігати необхідну для його запуску інформацію в централізованому системному реєстрі Registry. Системний реєстр полегшує розподіл інформації про налаштування між декількома процесами. У даному розділі ви зможете познайомитися з деякими сторонами існування системного реєстру і навчитися самостійно програмувати роботу з ним в додатках.
Як встановлюється системний реєстр
У попередніх версіях Windows INI-файли представляли собою звичайні текстові файли, які можна було обробляти за допомогою будь-якого текстового редактора. На відміну від них системний реєстр Registry містить як двійкову інформацію, так і символьну, записану в кодах ASCII. Вміст Registry можна редагувати тільки за допомогою спеціальної програми Registry Editor або за допомогою спеціальних функцій API, розроблених саме для цієї мети. Якщо вам коли-небудь доводилося використовувати Registry Editor для перегляду системного реєстру, то для вас не повинно бути новиною, що останній містить величезну кількість інформації, організованої у вигляді ієрархічної деревоподібної структури. На рис. 7.5 показано, яким чином вміст реєстру видається користувачеві при першому зверненні до Registry Editor. (Цю програму, виконуваний файл якої називається RegEdit.EXE, можна знайти в головній папці Windows або запустити на виконання з меню Start (Пуск) за допомогою команди Run (Виконати), набравши в полі введення імені файлу regedit, а потім клацнувши на ОК. У Windows NT файл називається RegEdit32.EXE.)
Рис. 7.5. RegistryEditor дозволяє переглянути системний реєстр
У лівому вікні перераховані ключі реєстру. Знак плюс (або трикутник) поруч з ім'ям ключа означає вузол дерева, який можна "розвернути", щоб побачити більш детальну інформацію про ключ. Кожен ключ має кілька рівнів ієрархії, які при бажанні можна послідовно розгортати. Кожен ключ (або його підключі) може мати (а може і не мати) асоційований з ним параметр. На рис. 7.6 показані параметри, асоційовані з поточним дизайном екрану. Якщо треба дістатися до цих параметрів, необхідно розгорнути послідовно HKEY_CURRENT_USER, Control Panel, Appearence і Schemes, і праворуч будуть знаходитись параметри схеми дизайну екрану, встановлені в системі.
Попередньо визначенні ключі
Для того щоб дізнатися, що зберігається в реєстрі, треба познайомитися із зумовленими ключами та їх призначенням. На рис. 7.5 представлено наступні ключі.
• HKEY_CLASS_ROOT
• HKEY_CURRENT_USER
• HKEY_LOCAL_MACHINE
• HKEY_USERS
• HKEY_CURRENT_CONFIG
Рис. 7.6. Структура реєстру у вигляді ієрархічного дерева
Ключ HKEY_CLASS_ROOT зберігає інформацію про типи документів і властивості, а також інформацію про класи і різні додатки, встановлені на комп'ютері. Наприклад, якщо ви розгорнете цей ключ на своєму комп'ютері, то, швидше за все, знайдете в розгорнутому списку елемент з розширенням файлу .doc, під яким будуть перераховані програми, які можуть обробляти документи цього типу (рис. 7.7).
Рис. 7.7. Інформація про документи у ключі HKEY_CLASS_ROOT
Ключ HKEY_CURRENT_USER містить всі системні установки, зроблені користувачем, включаючи схему кольорів, принтери, програмні групи і т.п. З іншого боку, ключ HKEY_LOCAL_MACHINE містить статусну інформацію, що стосується комп'ютера, а ключ HKEY_USERS організовує інформацію про кожного користувача системи і про конфігурацію системи за замовчуванням. І нарешті, ключ HKEY_CURRENT_CONFIG містить інформацію про конфігурації апаратних засобів системи. Крім зазначених ключів, може мати місце ключ HKEY_DYN_DATA, який включає інформацію про динамічні дані реєстру, тобто про дані, які часто змінюються.
Використання реєстру в MFC-додатках
Для роботи з реєстром в MFC-додатках використовується клас CWinApp та його метод SetRegistryKey(). Цей метод створює новий або відкриває в дереві реєстру існуючий вузол, відповідний ключу програми. Все, що потрібно від програміста, – передати ім'я ключа (як правило, ім'я фірми) як аргумент методу, наприклад
SetRegistryKey("MyCoolCompany");
Функцію SetRegistryKey() потрібно викликати усередині функції InitInstance(), яка викликається тільки одного разу – при запуску програми.
Після того як буде викликана функція SetRegistryKey(), додаток зможе створити підключі і задати їх параметри, викликавши ще одну або дві функції-члени класу CWinApp. Функція WriteProfileString() включає параметр-рядок до реєстру, а WriteProfileInt() включає цілочисельний параметр до реєстру. Для того щоб отримати параметри з реєстру, можна використовувати методи GetProfileString() і GetProfileInt(). (Крім того, для звернення до параметрів реєстру можна використовувати методи RegSetValueEx() і RegQueryValueEx().)
На замітку. У перших версіях функції WriteProfileString(), WriteProfileInt(), GetProfileString() і GetProfileInt() програмувався обмін інформацією з INI-файлом. Однак якщо перед викликом цих методів відбувається звернення до SetRegistryKey(), то MFC перепризначає приймач-джерело інформації – встановлює в якості такого системний реєстр.
Ревізія раніше створених додатків
У цьому розділі ви, можливо, самі того не підозрюючи, створили програму, яка звертається до системного реєстру. Нижче наведено фрагмент тексту функції CMultiStringApp::InitInstance() у тому вигляді, в якому він згенерований AppWizard. Точно такий же вигляд має і заготовка методу CFileDemoApp::InitInstance().
// Змініть ключ реєстрації, під яким зберігаються
// ваші установки.
// Після редагування в цьому рядку повинно бути щось,
// пов'язане з найменуванням вашої компанії
// або організації.
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
LoadStdProfileSettings(); // Завантаження стандартних
// опцій INI-файлів (включаючи MRU).
Абревіатура MRU означає Most Recently Used (останні, якими користувалися, – свіжі) і має відношення до файлів, список яких наводиться в меню File після того, як ви відкриєте з його допомогою хоча б один файл (причому не має значення, коли це було зроблено: у поточному або попередніх сеансах роботи програми).