
- •Введение
- •1 Аналитический обзор состояния вопроса
- •1.1 Краткие сведения о dll
- •1.2 Общие сведения о bmp - файлах
- •1.3 Dib и ddb файлы
- •1.4 Обзор структуры файла
- •1.4.3 Палитра
- •1.4.4 Данные изображения
- •1.5 Дамп памяти
- •2 Постановка задачи
- •3 Проектирование программного обеспечения
- •3.1 Выбор среды разработки динамической библиотеки
- •3.2 Проектирование структуры Dll
- •3.3 Макет интерфейса
- •3.4 Проектирование алгоритмов
- •4.4 Реализация алгоритма сохранения данных в файл
- •5 Тестирование программного обеспечения
- •5.1 Сравнение выводимых данных
- •5.2 Тест на корректность работы диалогов
- •Заключение
- •Список использованной литературы
- •Список листов графической части
- •Приложение а
- •Приложение б
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);