Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
моя записка.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
681.98 Кб
Скачать

3.2 Проектирование структуры Dll

Спроектированная структура библиотеки имеет вид, показанный на рисунке 3.1.

Рисунок 3.1 – Общая структура динамической библиотеки

Динамическая библиотека будет иметь 3 функции: StructBmp(HWND), InfoBmp(HWND), SaveBmp(HWND).

3.3 Макет интерфейса

Интерфейс формы помещенной в DLL объединяет множество элементов управления, каждый из которых связан с соответствующим его назначению обработчиком событий. На рисунке 3.2 представлен макет интерфейса главного окна программы.

1 2

3

5 4

6

Рисунок 3.2 – Макет интерфейса главного окна программы

1 – элемент, отображающий структуру файла формата bmp;

2 – элемент, отображающий дамп файла формата bmp;

3 – элемент, отображающий расшифровку дампа файла формата bmp;

4 – кнопка выхода из приложения;

5 – кнопка, при нажатии на которую открывается диалоговое окно, позволяющее открыть файл формата bmp;

6 – кнопка, при нажатии на которую открывается диалоговое окно, позволяющее сохранить полученные данные в файл формата txt;

3.4 Проектирование алгоритмов

Функция StructBmp(HWND) принимает дескриптор окна и возвращает информацию о структуре и дампе файла формата bmp. Схема алгоритма работы этой функции приводится на рисунке 3.3.

Рисунок 3.3 – Алгоритм отображения структуры bmp-файла

Функция SaveBmp(HWND) сохраняет в файл полученные данные о bmp-файле. Схема алгоритма работы этой функции приводится на рисунке 3.4.

Рисунок 3.4 – Алгоритм сохранения данных в файл

4 РЕАЛИЗАЦИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

4.1 Физическая структура проекта

Разработанный проект состоит из динамической библиотеки «BmpDll.dll» и заголовочного файла «DllBmp.h». Данная библиотека подключается к приложению-тестеру, которое демонстрирует все возможности разработанной DLL.

4.2 Разработанный интерфейс приложения

Графический интерфейс приложения имеет вид, представленный на рисунках 4.1, 4.2.

Рисунок 4.1 – Вид главного окна

Рисунок 4.2 – Вид окна «Открыть»

4.3 Реализация алгоритма отображения структуры bmp-файла

OPENFILENAME fn; //инициализация структуры OPENFILENAME

DWORD dwCount;

TCHAR szFile[256]; // переменная для хранения имени выбранного файла

BYTE bytes[10000];

//инициализация структур bmp-файла

tagBITMAPFILEHEADER tbFH;

tagBITMAPINFOHEADER tbIH;

tagRGBQUAD tR;

ZeroMemory(&tbFH, sizeof(tagBITMAPFILEHEADER));

ZeroMemory(&tbIH, sizeof(tagBITMAPINFOHEADER));

ZeroMemory(&tR, sizeof(tagRGBQUAD));

TCHAR buffer[10000];

// инициализация полей струтктуры OPENFILENAME

ZeroMemory(&fn, sizeof(fn));

fn.lStructSize = sizeof(fn);

fn.hwndOwner = hdlg;

fn.lpstrFile = szFile;

fn.lpstrFile[0] = '\0';

fn.nMaxFile = sizeof(szFile);

fn.lpstrFilter = L"All\0*.*\0BMPt\0*.BMP\0";

fn.nFilterIndex = 1;

fn.lpstrFileTitle = NULL;

fn.nMaxFileTitle = 0;

fn.lpstrInitialDir = NULL;

fn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

//проверка на создан ли диалог открытия файла

if (GetOpenFileName(&fn)==TRUE)

{

//инициализация файла открытого при помощи стандартного диалога открытия

HANDLE hFile = CreateFile(fn.lpstrFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);

// чтение структуры заголовка файла

ReadFile(hFile, &tbFH, sizeof(tagBITMAPFILEHEADER), &dwCount, NULL);

// чтение структуры заголовка изображения

ReadFile(hFile, &tbIH, sizeof(tagBITMAPINFOHEADER), &dwCount, NULL);

// чтение структуры палитры изображения

ReadFile(hFile, &tR, sizeof(tagRGBQUAD), &dwCount, NULL);

// запись значений полей структуры в буфер

int i = wsprintf(buffer, _T(" Заголовок BMP файла. \r\n\r\n"));

i += wsprintf(buffer + i, _T("Тип файла 0x%4d\r\n"), tbFH.bfType);

i += wsprintf(buffer + i, _T("Длина файла в Байта %4d\r\n"), tbFH.bfSize);

i += wsprintf(buffer + i, _T("Cмещение до битов изображения %d\r\n\r\n"), tbFH.bfOffBits);

i += wsprintf(buffer + i, _T("Ширина изображения в пикселах %d\r\n"), tbIH.biWidth);

i += wsprintf(buffer + i, _T("Высота изображения в пикселах %d\r\n"), tbIH.biHeight);

i += wsprintf(buffer + i, _T("Количество бит на пиксел %d\r\n"), tbIH.biBitCount);

i += wsprintf(buffer + i, _T("Тип сжатия для сжатых изображений %s\r\n"), tbIH.biCompression ? L"BI_RLE8\0" : L"BI_RGB\0");

i += wsprintf(buffer + i, _T("Размер изображения %d\r\n"), tbIH.biSizeImage);

i += wsprintf(buffer + i, _T("Число плоскостей для целевого устройства %d\r\n"), tbIH.biPlanes);

i += wsprintf(buffer + i, _T("Горизонтальное разрешение в DPI %d\r\n"), tbIH.biXPelsPerMeter);

i += wsprintf(buffer + i, _T("Вертикальное разрешение в DPI %d\r\n"), tbIH.biYPelsPerMeter);

i += wsprintf(buffer + i, _T("Количество цветов в политре %d\r\n"), tbIH.biClrUsed);

i += wsprintf(buffer + i, _T("Колличество важных цветов RGB_QUAD %d\r\n"), tbIH.biClrImportant);

i += wsprintf(buffer + i, _T(" Палитра BMP файла. \r\n\r\n"));

i += wsprintf(buffer + i, _T("Синий: %d\r\n"), tR.rgbBlue);

i += wsprintf(buffer + i, _T("Зеленый: %d\r\n"), tR.rgbGreen);

i += wsprintf(buffer + i, _T("Красный: %d\r\n"), tR.rgbRed);

i += wsprintf(buffer + i, _T("Резервный: %d\r\n"), tR.rgbReserved);

//вывод данных из буфера в элемент IDC_EDIT_BMP

SetDlgItemText(hdlg, IDC_EDIT_BMP, buffer);