You are on page 1of 11

Міністерство освіти і науки України

Національний університет “Запорізька політехника”

Кафедра програмних засобів

Звіт
з лабораторної роботи №4
з дисциплін “Операційні системи”
на тему: «Основи Windows. Графічний інтерфейс користувача. Визначення
параметрів жорсткого диску»

Виконав:
Студент групи КНТ-211 Дмитро КАТЕЛЕВСЬКИЙ
2023
1. Мета роботи
Вивчити принципи створення графічного інтерфейсу в ОС Windows,
навчитися використовувати функції WinAPI для визначення параметрів
логічних дисків системи.

2. Алгоритм функціонування програми:

1. Ініціалізація: У функції OnInitDialog відбувається ініціалізація діалогового


вікна. Це включає установку значка, додавання пункту "Про програму..." у
системне меню та інші налаштування.
2. Обробка системних команд: У функції OnSysCommand обробляються
системні команди, такі як відображення діалогу "Про програму..." при
виборі відповідного пункту у системному меню.
3. Відображення вікна значка: У функції OnPaint обробляється відображення
вікна значка в залежності від того, чи воно згорнуте чи ні.
4. Запит курсора: У функції OnQueryDragIcon обробляється запит курсора при
переміщенні згорнутого вікна.
5. Обробка подій елементів управління: Відбувається обробка подій елементів
управління, таких як зміна значення у випадаючому списку
(OnCbnSelchangeCombo1) та зміна тексту у полі вводу (OnEnChangeEdit1).
6. Отримання інформації про диски: У функції OnBnClickedButton1
відбувається основна робота. Для кожного логічного диска:
 Отримується його літера (driveLetter).
 Визначається тип диска (driveType) з використанням GetDriveType.
 Отримується інформація про том (GetVolumeInformation): назва тому,
серійний номер та файлова система.
 Отримується інформація про вільне простір на диску
(GetDiskFreeSpaceEx).
 Відкривається диск для отримання інформації про геометрію диска
(CreateFile).
 Використовується DeviceIoControl з
IOCTL_DISK_GET_LENGTH_INFO для отримання інформації про
довжину диска.
 Виводиться інформація про сектори на диску (Total Sectors).
7. Вивід інформації: Отримана інформація для кожного диска виводиться у
діалоговому вікні за допомогою MessageBox.
3. Текст програми:

// DiskInfoApp1Dlg.cpp: файл реализации


//

#include "pch.h"
#include "framework.h"
#include "DiskInfoApp1.h"
#include "DiskInfoApp1Dlg.h"
#include "afxdialogex.h"
#include <string>
#include <iostream>
#include <winioctl.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// Диалоговое окно CAboutDlg используется для описания сведений о приложении

class CAboutDlg : public CDialogEx


{
public:
CAboutDlg();

// Данные диалогового окна


#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUTBOX };
#endif

protected:
virtual void DoDataExchange(CDataExchange* pDX); // поддержка DDX/DDV

// Реализация
protected:
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)


{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()

// Диалоговое окно CDiskInfoApp1Dlg

CDiskInfoApp1Dlg::CDiskInfoApp1Dlg(CWnd* pParent /*=nullptr*/)


: CDialogEx(IDD_DISKINFOAPP1_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDiskInfoApp1Dlg::DoDataExchange(CDataExchange* pDX)


{
CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CDiskInfoApp1Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_CBN_SELCHANGE(IDC_COMBO1, &CDiskInfoApp1Dlg::OnCbnSelchangeCombo1)
ON_BN_CLICKED(IDC_BUTTON1, &CDiskInfoApp1Dlg::OnBnClickedButton1)
ON_EN_CHANGE(IDC_EDIT1, &CDiskInfoApp1Dlg::OnEnChangeEdit1)
END_MESSAGE_MAP()

// Обработчики сообщений CDiskInfoApp1Dlg

BOOL CDiskInfoApp1Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// Добавление пункта "О программе..." в системное меню.

// IDM_ABOUTBOX должен быть в пределах системной команды.


ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);


if (pSysMenu != nullptr)
{
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 CDiskInfoApp1Dlg::OnSysCommand(UINT nID, LPARAM lParam)


{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}

// При добавлении кнопки свертывания в диалоговое окно нужно воспользоваться приведенным


ниже кодом,
// чтобы нарисовать значок. Для приложений MFC, использующих модель документов или
представлений,
// это автоматически выполняется рабочей областью.

void CDiskInfoApp1Dlg::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 CDiskInfoApp1Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}

void CDiskInfoApp1Dlg::OnCbnSelchangeCombo1()
{
// TODO: добавьте свой код обработчика уведомлений
}

void CDiskInfoApp1Dlg::OnBnClickedButton1()
{
DWORD drivesMask = GetLogicalDrives();
CString result;

for (char drive = 'A'; drive <= 'Z'; ++drive)


{
if ((drivesMask & 1) != 0)
{
CString driveLetter;
driveLetter.Format(_T("%c:\\"), drive);

result += _T("Drive: ") + driveLetter + _T("\r\n");

// GetDriveType
UINT driveType = GetDriveType(driveLetter);
result += _T("Drive Type: ");
switch (driveType)
{
case DRIVE_UNKNOWN:
result += _T("Unknown\r\n");
break;
case DRIVE_NO_ROOT_DIR:
result += _T("No Root Directory\r\n");
break;
case DRIVE_REMOVABLE:
result += _T("Removable\r\n");
break;
case DRIVE_FIXED:
result += _T("Fixed\r\n");
break;
case DRIVE_REMOTE:
result += _T("Remote\r\n");
break;
case DRIVE_CDROM:
result += _T("CD-ROM\r\n");
break;
case DRIVE_RAMDISK:
result += _T("RAM Disk\r\n");
break;
default:
result += _T("Unknown Type\r\n");
break;
}

// GetVolumeInformation
TCHAR volumeName[MAX_PATH + 1];
TCHAR fileSystem[MAX_PATH + 1];
DWORD serialNumber;
DWORD maxComponentLength;
DWORD fileSystemFlags;

if (GetVolumeInformation(
driveLetter,
volumeName,
MAX_PATH + 1,
&serialNumber,
&maxComponentLength,
&fileSystemFlags,
fileSystem,
MAX_PATH + 1))
{
result += _T("Volume Name: ") + CString(volumeName) + _T("\r\n");
result += _T("Serial Number: ") + CString(std::to_wstring(serialNumber).c_str()) +
_T("\r\n");
result += _T("File System: ") + CString(fileSystem) + _T("\r\n");
}

// GetDiskFreeSpaceEx
ULARGE_INTEGER freeBytesAvailable;
ULARGE_INTEGER totalNumberOfBytes;
ULARGE_INTEGER totalNumberOfFreeBytes;

if (GetDiskFreeSpaceEx(
driveLetter,
&freeBytesAvailable,
&totalNumberOfBytes,
&totalNumberOfFreeBytes))
{
result += _T("Total Size: ") + CString(std::to_wstring(totalNumberOfBytes.QuadPart / (1024
* 1024)).c_str()) + _T(" MB\r\n");
result += _T("Free Space: ") + CString(std::to_wstring(totalNumberOfFreeBytes.QuadPart /
(1024 * 1024)).c_str()) + _T(" MB\r\n");
}

// GetDiskGeometry
HANDLE hDevice = CreateFile(
driveLetter,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

if (hDevice != INVALID_HANDLE_VALUE)
{
GET_LENGTH_INFORMATION lengthInfo;
DWORD bytesReturned;
if (DeviceIoControl(
hDevice,
IOCTL_DISK_GET_LENGTH_INFO,
NULL,
0,
&lengthInfo,
sizeof(lengthInfo),
&bytesReturned,
NULL))
{
result += _T("Total Sectors: ") + CString(std::to_wstring(lengthInfo.Length.QuadPart /
512).c_str()) + _T("\r\n");
}
else
{
result += _T("Failed to get disk length information.\r\n");
}

CloseHandle(hDevice);
}

result += _T("\r\n");
}

drivesMask >>= 1;
}

MessageBox(result, _T("Disk Information"), MB_OK | MB_ICONINFORMATION);


}
void CDiskInfoApp1Dlg::OnEnChangeEdit1()
{
// TODO: Если это элемент управления RICHEDIT, то элемент управления не будет
// send this notification unless you override the CDialogEx::OnInitDialog()
// функция и вызов CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.

// TODO: Добавьте код элемента управления


}

Рисунок – 3.1

Рисунок – 3.2

4. Контрольні запитання:

1. Пояснення відміни в роботі функцій GetDiskFreeSpace і GetDiskFreeSpaceEx:


Обидві функції призначені для отримання інформації про вільне місце на
диску, але вони використовують різні підходи та повертають різний обсяг
інформації.
 GetDiskFreeSpace:
 Використовується для дисків обсягом менше 2 ГБ.
 Повертає основні параметри, такі як кількість секторів на кластер,
розмір кластера в байтах, кількість вільних та загальну кількість
кластерів.
 GetDiskFreeSpaceEx:
 Рекомендується для дисків великого обсягу (понад 2 ГБ).
 Повертає більш деталізовану інформацію, включаючи 64-бітні
значення вільного простору, загального простору та вільного
простору.
2. Пояснення відміни в роботі функцій GetLogicalDrives і GetLogicalDrivesStrings:
 GetLogicalDrives:
 Повертає 32-бітне ціле число, в якому кожен біт представляє один
логічний диск.
 Зручний для визначення наявності та кількості дисків, але не надає
імен та іншої детальної інформації.
 GetLogicalDrivesStrings:
 Використовується для отримання імен та інших атрибутів дисків у
вигляді рядка.
 Надає докладну інформацію про всі логічні диски, включаючи їх
імена та типи.
3. Інформація, яку можна отримати за допомогою функції GetVolumeInformation:
Функція GetVolumeInformation дозволяє отримати інформацію про том
(диск), таку як мітка (назва), серійний номер, системний файловий тип
(FAT, NTFS), максимальну довжину імен файлів та інші параметри тома.
4. Пояснення структури фізичного диску, розділеного на томи:
Фізичний диск може бути розділений на томи (partitions), що є логічними
частинами диску. Кожен том може бути форматований з використанням
певної файлової системи (наприклад, FAT, NTFS). Крім того, один фізичний
диск може містити декілька розділів, кожен із яких виглядає як окремий
логічний диск.
5. Пояснення призначення та зміст FAT:
FAT (File Allocation Table) - це файлова система, яка використовує таблицю
розподілу файлів для відстеження розташування блоків даних файлів на
диску. FAT була використана в старших версіях операційних систем
Microsoft, таких як MS-DOS та Windows 9x.
6. Пояснення призначення, структури та зміст Master Boot:
Master Boot Record (MBR) - це сектор на початку фізичного диску, який
містить інформацію про розділи на диску та завантажувальний код для
виконання процесу завантаження операційної системи.
7. Пояснення призначення, структури та зміст Boot:
Boot Sector - це перший сектор кожного розділу або тома на диску. Він
містить інформацію, необхідну для завантаження операційної системи з
відповідного тому.
8. Пояснення призначення, структури та зміст Root:
Root Directory - це головний каталог (переведений як кореневий) в файловій
системі. В ньому зберігається інформація про файли та підкаталоги, які
знаходяться безпосередньо на даному рівні.
9. Принципи побудови графічного інтерфейсу користувача в середовищі
Windows:
Проектування графічного інтерфейсу в середовищі Windows зазвичай
використовує бібліотеки, такі як MFC або .NET Framework, або інші
інструменти розробки, такі як WPF або WinForms. Загальні принципи
включають створення вікон, елементів керування, їх розміщення на формі,
обробку подій та взаємодію з користувачем. Дизайнерські рішення можуть
бути здійснені через графічні інструменти розробки або кодування,
використовуючи певний набір елементів і властивостей для досягнення
бажаного вигляду та поведінки програми.

You might also like