Доброго дня уважаемые кодеры. Собственно прошу помоч с задачей по переводу консольной программы в MFC приложение. Консольная программа выводит инфу об указанном BMP файле.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <tchar.h>
using namespace std;
class WorkToBMP {
public :
BITMAPFILEHEADER bmfHeader; //заголовок файла
BITMAPINFOHEADER bmiHeader; // структура файла
HANDLE FileHandle;//файл для записи BMP
DWORD bf,bf1;
void openfile(const wchar_t* filepath)
{
FileHandle=CreateFile(filepath,GENERIC_READ |
GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if(INVALID_HANDLE_VALUE == FileHandle){
cout <<" File "<<filepath<< " not find"; exit (1);}
}
void closefile()
{ CloseHandle(FileHandle);}
void scanfile()
{
// читаем заголовок файла
if (!(ReadFile(FileHandle,&bmfHeader,sizeof(bmfHeader),&bf,NULL) )) {
fputs( "Eror header reads",stderr );
cout << GetLastError();
exit(2) ;
}
// читаем структура файла
if (!(ReadFile(FileHandle,&bmiHeader,sizeof(bmiHeader),&bf1,NULL) )) {
fputs( "Error read info header",stderr );
cout << GetLastError();
exit(2) ;
}
printf( "Size = %d bytes\n", bmfHeader.bfSize ) ; // выводим размер
printf( "Width = %d\n", bmiHeader.biWidth ) ; //ширину
printf( "Height = %d\n", bmiHeader.biHeight ) ; //и высоту изображения
}
};
int _tmain(int argc, CHAR* argv[])
{
WorkToBMP myBMP;
myBMP.openfile(L"C:\\2.bmp");
myBMP.scanfile();
myBMP.closefile();
return 0;
}
Код рабочий.
Для решения создал программу имеющию такой интерфейс
Обработчик по щелчку кнопки обзор
Код:
void CMFC_BMP_READDlg::OnBnClickedButtonOpen()
{
UpdateData(TRUE); //Обновить переменные
CFileDialog fDialog(TRUE); // Открываем диалогове окно с выбором файла
fDialog.DoModal();
m_EDIT_FILE = fDialog.GetFileName(); //Заносим выбранное значение в переменную отвечающию за путь файла
UpdateData(FALSE);
}
Далее далее переношу из консольного вариант созданный мной класс
Код:
class WorkToBMP {
public :
BITMAPFILEHEADER bmfHeader; //заголовок файла
BITMAPINFOHEADER bmiHeader; // структура файла
HANDLE FileHandle;//файл для записи BMP
DWORD bf,bf1;
void openfile(const wchar_t* filepath)
{
FileHandle=CreateFile(filepath,GENERIC_READ |
GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if(INVALID_HANDLE_VALUE == FileHandle)
Error = "File not find "; //присваиваю глобальной переменной сообщение об ошибке
}
void closefile()
{ CloseHandle(FileHandle); }
void scanfile()
{
// читаем заголовок файла
if (!(ReadFile(FileHandle,&bmfHeader,sizeof(bmfHeader),&bf,NULL) ))
Error = "Eror header reads "+ GetLastError(); //присваиваю глобальной переменной сообщение об ошибке
// читаем структура файла
if (!(ReadFile(FileHandle,&bmiHeader,sizeof(bmiHeader),&bf1,NULL) ))
Error = "Eror info reads "+ GetLastError(); //присваиваю глобальной переменной сообщение об ошибке
/* Присваиваем глобальным значениям полученные данные
Size = bmfHeader.bfSize;
Width = bmiHeader.biWidth;
Height= bmiHeader.biHeight ;
*/
}
};
с изменениями в обработчике ошибок, а так же присваиваю глобальным переменным получинную инфу о файле. Данный отрезок я закоментил, так как не знаю как сделать корректное преобразование. Пробывал
itoa но не то. может нужно скорректировать типы данных, счас глобальные переменные Size,Width,Height имеют тип CString, а данные формата - DWORD bfSize;
LONG biWidth;
LONG biHeight
Ну и на последок в обработчике Кнопки Узнать следующий код
Код:
WorkToBMP MyBMP;
MyBMP.openfile(m_EDIT_FILE);
MyBMP.scanfile();
MyBMP.closefile();
UpdateData(TRUE); //Обновить переменные
// присвоим значение глобальных переменных
m_STATIC_SIZE = Size;
m_STATIC_Width = Width;
m_STATIC_Height = Height;
m_ERROR = Error;
UpdateData(FALSE); //закончим обновленние данных
Соответвенно из за закоментированного участка и возможно еще прочих ошибок, программа не выполняет должных функций.