- •Введение
- •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 Тест на корректность работы диалогов
- •Заключение
- •Список использованной литературы
- •Список листов графической части
- •Приложение а
- •Приложение б
Список использованной литературы
Ганеев, Р.М. Проектирование интерфейса пользователя средствами WIN32 API. / Р.М. Ганеев – М.: Горячая линия - Телеком, 2002. — 338 с.
Дамп памяти [Электронный ресурс]. - 2012. - Режим доступа http://ru.wikipedia.org/wiki/Дамп_памяти - Загл. с экрана.
Джосьютис, Н. C++ Стандартная библиотека. Для профессионалов/ Н. Джосьютис – Санкт-Петербург: Питер, 2004 – 730 с.
Климов, А. Русский_проект: Функции Windows Api. / А. Климов – Санкт-Петербург: Питер, 1999-2000. – 552с.
Методические указания к выполнению дипломного проекта для студентов специальностей 1 40 01 01 «Программное обеспечение информационных технологий» и 1 40 01 02 «Информационные системы и технологии» / Сост. О.В. Бугай, И.А. Бухвалова, А.Т. Ковальков, Ю.Б. Попова, Н.А. Разорёнов, И.Н. Шунько. – БНТУ, 2008. – 29 с.
Рихтер, Дж. Windows для профессионалов: программирование для Windows 95 и Windows NT 4 на базе WIN32 API; / Дж. Рихтер – М.: Издательский отдел “Русская редакция” TOO “Channel Trading Ltd”, 1997. – 712 с.
Сорока, Т. Русский справочник по Win 32 API / Т. Сорока. – Санкт-Петербург: BHV, 2001-2002. – 345 с.
Что такое DLL и зачем они нужны? [Электронный ресурс]. - 2012. - Режим доступа http://www.inattack.ru/article/chto-takoe-dll-i-zachem-oni-nuzhnyi/13.html#.T7tXmFLVv - Загл. с экрана.
BMP [Электронный ресурс]. - 2012. - Режим доступа http://ru.wikipedia.org/wiki/BMP - Загл. с экрана.
Список листов графической части
Лист 1 – Схема алгоритма функции StructBmp(HWND).
Лист 2 – Схема алгоритма функции SaveBmp(HWND).
Лист 3 – Тестирование приложений
Лист 4 – Тестирование приложений
Приложение а
ЛИСТИНГ ПРОЕКТА
Код bmp.cpp(dll):
#include <windows.h>
#include <TCHAR.h>
#include <stdio.h>
#include "resource.h"
#include "DllBmp.h"
extern "C" _declspec(dllexport) void StructBmp(HWND hdlg)
{
OPENFILENAME fn;
DWORD dwCount;
TCHAR szFile[256]; // переменная для хранения имени выбранного файла
BYTE bytes[10000];
char temp[10] = "\0";
char damp[10000] = "\0";
tagBITMAPFILEHEADER tbFH;
tagBITMAPINFOHEADER tbIH;
tagRGBQUAD tR;
ZeroMemory(&tbFH, sizeof(tagBITMAPFILEHEADER));
ZeroMemory(&tbIH, sizeof(tagBITMAPINFOHEADER));
ZeroMemory(&tR, sizeof(tagRGBQUAD));
TCHAR buffer[10000];
// инициализация полей струтктуры OPENFILENAME
eroMemory(&fn, sizeof(fn));
fn.lStructSize = sizeof(fn);
fn.hwndOwner = hdlg;
fn.lpstrFile = szFile;
fn.lpstrFile[0] = '\0';
fn.nMaxFile = sizeof(szFile);
fn.lpstrFilter = L"AlZl\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);
SetDlgItemText(hdlg, IDC_EDIT_BMP, buffer);
ReadFile(hFile, bytes, 10000, &dwCount, NULL);
for(int i = 0; i < dwCount; i++)
{
_itoa(bytes[i], temp, 16);
strcat(damp, temp);
strcat(damp, " ");
}
SetDlgItemTextA(hdlg, IDC_EDIT_DAMP, damp);
MessageBox(hdlg,L"Файл успешно открыт!",L"Сообщение", MB_OK);
}
}
extern "C" _declspec(dllexport) void InfoBmp(HWND hdlg)
{
TCHAR bufer[10000];
int j = wsprintf(bufer, _T("№№ байтов | Описание \r\n"));
j += wsprintf(bufer + j, _T("---------------------------------------------------------- \r\n"));
j += wsprintf(bufer + j, _T("1-2 | Заголовок bmp-файла \r\n"));
j += wsprintf(bufer + j, _T("---------------------------------------------------------- \r\n"));
j += wsprintf(bufer + j, _T("3-6 | Размер файла на диске \r\n"));
j += wsprintf(bufer + j, _T("---------------------------------------------------------- \r\n"));
j += wsprintf(bufer + j, _T("7-10 | Зарезервировано \r\n"));
j += wsprintf(bufer + j, _T("---------------------------------------------------------- \r\n"));
j += wsprintf(bufer + j, _T("11-14 | Смещение от начала структуры \r\n | BITMAPFILEHEADER до битовой карты \r\n"));
j += wsprintf(bufer + j, _T("---------------------------------------------------------- \r\n"));
j += wsprintf(bufer + j, _T("15-18 | Число байт,и занимаемых структурой \r\n"));
j += wsprintf(bufer + j, _T("---------------------------------------------------------- \r\n"));
j += wsprintf(bufer + j, _T("19-22 | Ширина рисунка, в пикселах \r\n"));
j += wsprintf(bufer + j, _T("---------------------------------------------------------- \r\n"));
j += wsprintf(bufer + j, _T("23-26 | Высота рисунка, в пикселах \r\n"));
j += wsprintf(bufer + j, _T("---------------------------------------------------------- \r\n"));
j += wsprintf(bufer + j, _T("27-28 | Количество битовых плоскостей \r\n"));
j += wsprintf(bufer + j, _T("---------------------------------------------------------- \r\n"));
j += wsprintf(bufer + j, _T("29-30 | Число битов, характеризующих 1 пиксел \r\n"));
j += wsprintf(bufer + j, _T("---------------------------------------------------------- \r\n"));
j += wsprintf(bufer + j, _T("31-34 | Тип сжатия (BI_RGB, BI_RLE8, BI_RLE4,\r\n | BI_BITFIELDS, BI_JPEG) \r\n"));
j += wsprintf(bufer + j, _T("---------------------------------------------------------- \r\n"));
j += wsprintf(bufer + j, _T("35-38 | Размер рисунка (в байтах) \r\n"));
j += wsprintf(bufer + j, _T("---------------------------------------------------------- \r\n"));
j += wsprintf(bufer + j, _T("39-42 | biXPelsPerMeter \r\n"));
j += wsprintf(bufer + j, _T("---------------------------------------------------------- \r\n"));
j += wsprintf(bufer + j, _T("43-46 | biYPelsPerMeter \r\n"));
j += wsprintf(bufer + j, _T("---------------------------------------------------------- \r\n"));
j += wsprintf(bufer + j, _T("47-50 | Количество цветов в палитре,\r\n | котрые могут использоватся в рисунке. \r\n"));
j += wsprintf(bufer + j, _T("---------------------------------------------------------- \r\n"));
j += wsprintf(bufer + j, _T("51-54 | Количество цветов в палитре, \r\n |котрые действительно используются в рисунке. \r\n"));
j += wsprintf(bufer + j, _T("---------------------------------------------------------- \r\n"));
j += wsprintf(bufer + j, _T("55-118 | Палитра \r\n"));
j += wsprintf(bufer + j, _T("---------------------------------------------------------- \r\n"));
j += wsprintf(bufer + j, _T("119 и далее | Цветовая характеристика каждого пиксела по строкам \r\n"));
j += wsprintf(bufer + j, _T("---------------------------------------------------------- \r\n"));
SetDlgItemText(hdlg, IDC_BMP, bufer);
}
extern "C" _declspec(dllexport) void SaveBmp(HWND hdlg)
{
OPENFILENAME fn; // структура диалогового окна
TCHAR szFile[260]; // переменная для хранения имени выбранного файла
DWORD dwCount;
wchar_t text[10000] = _T("\0");
// инициализация полей струтктуры 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*.*\0txt\0*.TXT\0";
fn.nFilterIndex = 1;
fn.lpstrFileTitle = NULL;
fn.nMaxFileTitle = 0;
fn.lpstrInitialDir = NULL;
fn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if (GetSaveFileName(&fn)==TRUE)
{
wchar_t str[10000];
wchar_t rn[] = _T("\r\n");
GetDlgItemTextW(hdlg, IDC_EDIT_BMP, (LPWSTR)str, 2*SendDlgItemMessage(hdlg, IDC_EDIT_BMP, WM_GETTEXTLENGTH, 0, 0));
wcscat(text,str); wcscat(text,rn);
ZeroMemory(&str, sizeof(str));
GetDlgItemTextW(hdlg, IDC_EDIT_DAMP, (LPWSTR)str, 2*SendDlgItemMessage(hdlg, IDC_EDIT_DAMP, WM_GETTEXTLENGTH, 0, 0));
wcscat(text,str); wcscat(text,rn);
ZeroMemory(&str, sizeof(str));
GetDlgItemTextW(hdlg, IDC_BMP, (LPWSTR)str, 2*SendDlgItemMessage(hdlg, IDC_BMP, WM_GETTEXTLENGTH, 0, 0));
wcscat(text,str); wcscat(text,rn);
HANDLE hFile = CreateFile(fn.lpstrFile, GENERIC_READ | GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, 0, NULL);
WriteFile(hFile, text, sizeof(text), &dwCount, NULL);
CloseHandle(hFile);
MessageBox(hdlg,(_T(" %d"),fn.lpstrFile),L"Данные сохранены в:", MB_OK);
}
}
Код заголовочного файла “DllBmp.h”
#include <windows.h>
#include <stdio.h>
extern "C" _declspec(dllexport) void StructBmp(HWND);
extern "C" _declspec(dllexport) void InfoBmp(HWND);
extern "C" _declspec(dllexport) void SaveBmp(HWND);
