Лабораторна робота №4
Основи Windows. Графічний інтерфейс користувача. Визначення параметрів жорсткого диску
Мета роботи: вивчити принципи створення графічного інтерфейсу в ОС Windows, навчитися використовувати функції WinAPI для визначення параметрів логічних дисків системи.
4.1 Короткі теоретичні відомості
4.1.1 Загальні відомості про жорсткі диски
Кожний сектор диску складається з поля даних та поля службової інформації. Фізичний адрес сектора на диску визначається тріадою [t, h, s], де:
t - номер доріжки або циліндру;
h - номер головки або поверхні;
s - номер сектора.
Логічний дисковий простір любого логічного диску ділиться на дві області: системну та даних. Системна область створюється та ініціалізується при форматуванні, а в послідуючим відновляється при маніпуляції файловою структурою. Системна область кожного логічного диску складається із наступних компонентів:
- Boot Record;
- FAT;
- Root Directory;
Область даних містить файли та каталоги, що підпорядковуються кореневому.
4.1.2 Функції для роботи з дисковими накопичувачами
Для визначення інформації щодо вільного місця на певному диску можна використовувати функції WinAPI GetDiskFreeSpace і GetDiskFreeSpaceEx. Для використання обох функцій необхідно підключити до своєї програми модуль Windows.h, якщо він ще не був підключений.
Розглянемо більш детально роботу цих функцій.
Функція
BOOL GetDiskFreeSpace
(LPCTSTR lpRootPathName,
LPDWORD lpSectorsPerCluster,
LPDWORD lpBytesPerSector,
LPDWORD lpNumberOfFreeClusters,
LPDWORD lpTotalNumberOfClusters);
повертає інформацію про кількість секторів на один кластер (lpSectorsPerCluster), розмір кластера в байтах (lpBytesPerSector), кількість вільних кластерів (lpNumberOfFreeCluster), загальну кількість кластерів (lpTotalNumberOfClusters). В якості вхідного параметра функція приймає покажчик на нуль-термінований рядок, який визначає кореневий каталог диску, інформацію про який необхідно повернути. Визначення диску має завершуватися зворотнім слешем (наприклад, C:\). В разі успіху функція повертає ненульове значення.
Слід відзначити, що ця функція повертає некоректну інформацію для дисків обсягом більше ніж 2 ГБ. Для отримання коректної інформації про диски великого обсягу слід використовувати функцію
BOOL GetDiskFreeSpaceEx
(LPCTSTR lpDirectoryName,
PULARGE_INTEGER lpFreeBytesAvailable,
PULARGE_INTEGER lpTotalNumberOfBytes,
PULARGE_INTEGER lpTotalNumberOfFreeBytes);
Ця функція повертає кількість вільних і доступних користувачеві байт (lpFreeBytesAvailable), загальну кількість доступних користувачеві байт (lpTotalNumberOfBytes), загальну кількість вільних байт (lpTotalNumberOfFreeBytes). В якості вхідного параметра lpDirectoryName функція може приймати не тільки кореневий каталог, але й будь-який каталог на диску.
Необхідно відмітити, що значення, які повертаються функціями GetDiskFreeSpace і GetDiskFreeSpaceEx, можуть бути відмінними від фактичних значень, якщо використовуються дискові квоти.
Також слід відзначити, що функція GetDiskFreeSpaceEx повертає 64-бітні значення, тому треба бути уважними при роботі з ними, щоб не усікти до 32-бітних значень.
Для визначення типу диску може використовуватись функція
UINT GetDriveType
(LPCTSTR lpRootPathName);
Вона приймає, аналогічно попереднім функціям, визначення кореневого каталогу диску, і повертає одне з наступних значень:
DRIVE_UNKNOWN – якщо тип диску не може бути визначений;
DRIVE_NO_ROOT_DIR – вказаний корень не є коректним;
DRIVE_REMOVABLE – диск знімний;
DRIVE_ FIXED – диск незнімний;
DRIVE_REMOTE – диск в мережі;
DRIVE_CDROM – диск є CD-ROM-диском;
DRIVE_RAM – диск є RAM-диском.
Для визначення мітки диску і його серійного номеру використовують функцію GetVolumeInformation.
Перелік дисків, наявних у системі, можна отримати за допомогою однієї із функцій GetLogicalDrives або GetLogicalDrivesStrings.
4.1.3 Створення графічного інтерфейсу Windows
Найсуттєвіша відміна програм під Windows від програм, які були написані під інші операційні системи, - це повідомлення. Більшість програм під DOS періодично опитують пристрої вводу, такі, як клавіатура і миша, і таким чином відслідковують стан цих пристроїв. У Windows, це відбувається через так звані повідомлення. По суті, повідомлення – це спосіб взаємодії операційної системи з програмою. За допомогою повідомлень програми отримують необхідну їм інформації щодо подій, які відбуваються в системі.
Життєвий цикл віконної програми для ОС Windows складається з початкового створення вікон, ініціалізації необхідних даних, і головного циклу, в якому оброблюються повідомлення, що надходять до вікна програми.
Створення графічного інтерфейсу Windows-програми і забезпечення обробки повідомлень є доволі трудомістким. Для спрощення цього процесу існують розроблені різними фірмами бібліотеки класів, які інкапсулюють роботу з компонентами графічного інтерфейсу Windows. Серед цих бібліотек можна виділити MFC (Microsoft Foundation Classes) від Microsoft і VCL (Visual Components Library) від Borland.
Розглянемо принцип створення графічного інтерфейсу програми у середовищі MS Visual Studio 2005, використовуючи бібліотеку MFC. Найкращих результатів при використанні цієї бібліотеки можна досягнути, використовуючи технологію Документ/Представлення (Document/View), але для реалізації елементарного інтерфейсу можна обмежитися створенням діалогового вікна.
Для створення проекту діалогового вікна у MS Visual Studio 2005 необхідно викликати пункт меню File – New – Project, і у вікні, що з’явилося, обрати Visual C++ - MFC – MFC Application, і ввести ім’я майбутнього проекту. Після цього буде викликано майстер настройки нового проекту. У розділі Application Type слід обрати Dialog Based, також там можна обрати, яким чином використовувати бібліотеку MFC (як загальну DLL або як статичну бібліотеку), і чи треба включати в програму підтримку кодування Unicode. В розділі Unit Interface Features підстроюється вид майбутнього вікна. На цьому попередню настройку можна завершити, натиснувши кнопку Finish.
В результаті буде згенеровано:
– файли, які містять клас додатку (звичайно носять ім’я проекту), успадкований від класу MFC CWinApp;
– файли, які містять клас діалогового вікна (звичайно носять ім’я проекту плюс Dlg), успадкований від класу MFC CDialog;
– файли ресурсів Resource;
– файли прекомпільованих заголовків stdafx.
Навігацію цими файлами можна здійснювати за вікна Solution Explorer (CTRL-ALT-L).
Налаштування інтерфейсу діалогового вікна зберігаються у файлі ресурсів. Для створення його дизайну слід перейти до вікна Resource View (CTRL-SHIFT-E) і в розділі Dialog обрати відповідне діалогове вікно. В результаті з’явиться поточний вигляд вікна. Додавати компоненти до нього можна за допомогою панелі компонентів Toolbox (CTRL-ALT-X).
Розмістимо на діалоговому вікні компонент Combo Box (поле зі списком). Настроїти його параметри можна, виділивши його за допомогою миші і відкрив панель Properties (F4). На цій панелі розміщується список всіх компонентів, які розміщені на діалоговому вікні. Нижче розміщені кнопки, які дозволяють переключати тип сортування властивостей/подій об’єкта (категорізоване або за алфавітом), а також переключатися між відображенням властивостей і подій.
Виставимо у відкритій панелі Properties у розділі Properties властивість Type у значення Drop List. Такий стиль дозволить лише обирати елементи із вже існуючих у списку, без можливості вводити їх у полі для вводу.
Додамо до створеного списку функцію, що оброблює подію зміни поточного вибраного елементу списку. Для цього необхідно переключитися на відображення в панелі Properties подій (Control Events), знайти назву події CBN_SELCHANGE і, натиснувши у відповідному до нього полі на стрілку, обрати <Add>. Після цього у класі діалогового вікна з’явиться нова функція-член, в яка буде викликатися при зміні обраного в списку елементу.
З більшістю компонентів діалогового вікна можна пов’язувати змінні-члени. Для цього слід викликати контекстне меню відповідного компоненту і обрати пункт Add Variable. У вікні, що з’явилося, проставляється ім’я нової змінної (Variable Name), модифікатор доступу (Access), категорію змінної (якщо треба маніпулювати лише значенням компоненту – обирають категорію Variable, якщо ж необхідно виконувати інші дії над ним – категорію Control). Пов’яжемо створений список зі змінною m_ComboBox категорії Control. В клас діалогового вікна буде додано змінну-член класу CComboBox.
Додамо на діалогове вікно компонент Edit Control (поле для редагування). Пов’яжемо його зі змінною m_Edit категорії Value. В клас діалогового вікна буде додано змінну-член класу CString.
У функцію-член OnInitDialog класу діалогового вікна додамо код, який ініціалізує поле зі списком:
m_ComboBox.AddString(L"Text 1");
m_ComboBox.AddString(L"Text 2");
m_ComboBox.AddString(L"Text 3");
Повернемося до функції, яка оброблює зміну поточного елементу поля зі списком, внесемо туди наступний код:
m_ComboBox.GetLBText(m_ComboBox.GetCurSel(), m_Edit);
UpdateData(false);
Функція-член класу CComboBox GetLBText заносить у змінну m_Edit значення рядку зі списку з номером m_ComboBox.GetCurSel() (поточний обраний елемент). Функція-член класу CDialog UpdateData обновлює дані, пов’язані з компонентами діалогового вікна. При цьому її параметр вказує, в якому напрямку виконувати обновлення – зі змінних до компонентів (false), або навпаки (true).
Тепер при зміні елементу поля зі списком новий обраний елемент буде відображатися у полі для редагування.
4.2 Домашнє завдання
Використовуючи конспект лекцій, рекомендовану літературу, вивчити роботу функцій WinAPI для GetDiskFreeSpace, GetDiskFreeSpaceEx, GetDriveType, GetVolumeInformation, GetLogicalDrives, GetLogicalDrivesStrings. Вивчити структуру фізичного диску, методи його обслуговування. Ознайомитися з засобами проектування графічного інтерфейсу для програм Windows.
4.3 Хід виконання роботи
Реалізувати програму для Windows, яка за допомогою графічного інтерфейсу надає відомості про всі диски системи: тип диску, загальний обсяг диску, обсяг вільної пам’яті на диску, число секторів у кластері, кількість байтів в секторі, мітка диску, його серійний номер і тип файлової системи.
4.4 Зміст звіту
4.4.1 Сформульована мета роботи.
4.4.2 Алгоритм функціонування програми.
4.4.3 Лістинг готової програми.
4.5 Контрольні питання
4.5.1 Пояснити відміну в роботі функцій GetDiskFreeSpace і GetDiskFreeSpaceEx.
4.5.2 Пояснити відміну в роботі функцій GetLogicalDrives і GetLogicalDrivesString.
4.5.3 Яку інформацію можна отримати за допомогою функції GetVolumeInformation?
4.5.4 Пояснити структуру фізичного диску, розділеного на томи.
4.5.5 Пояснити призначення та зміст FAT.
4.5.6 Пояснити призначення, структуру та зміст Master Boot.
4.5.7 Пояснити призначення, структуру та зміст Boot.
4.5.8 Пояснити призначення, структуру та зміст Root.
4.5.9 Принципи побудови графічного інтерфейсу користувача в середовищі Windows.