269 lines
8 KiB
C++
269 lines
8 KiB
C++
|
// BMPInfoDlg.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "BMPInfo.h"
|
||
|
#include "BMPInfoDlg.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CBMPInfoDlg dialog
|
||
|
|
||
|
CBMPInfoDlg::CBMPInfoDlg(CWnd* pParent /*=NULL*/)
|
||
|
: CDialog(CBMPInfoDlg::IDD, pParent)
|
||
|
{
|
||
|
//{{AFX_DATA_INIT(CBMPInfoDlg)
|
||
|
m_FileType = 0;
|
||
|
m_FileSize = 0;
|
||
|
m_Reserved1 = 0;
|
||
|
m_Reserved2 = 0;
|
||
|
m_OffBits = 0;
|
||
|
m_BitmapHeaderSize = 0;
|
||
|
m_BitmapWidth = 0;
|
||
|
m_BitmapHeight = 0;
|
||
|
m_BitmapPlanes = 0;
|
||
|
m_BitmapBitCount = 0;
|
||
|
m_BitmapCompression = 0;
|
||
|
m_BitmapImageSize = 0;
|
||
|
m_BitmapXPelsPerMeter = 0;
|
||
|
m_BitmapYPelsPerMeter = 0;
|
||
|
m_BitmapClrUsed = 0;
|
||
|
m_BitmapClrImportant = 0;
|
||
|
m_bManipulateImage = FALSE;
|
||
|
//}}AFX_DATA_INIT
|
||
|
|
||
|
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
|
||
|
}
|
||
|
|
||
|
void CBMPInfoDlg::DoDataExchange(CDataExchange* pDX)
|
||
|
{
|
||
|
CDialog::DoDataExchange(pDX);
|
||
|
//{{AFX_DATA_MAP(CBMPInfoDlg)
|
||
|
DDX_Text(pDX, IDC_FILE_TYPE, m_FileType);
|
||
|
DDX_Text(pDX, IDC_FILE_SIZE, m_FileSize);
|
||
|
DDX_Text(pDX, IDC_FILE_RESERVED1, m_Reserved1);
|
||
|
DDX_Text(pDX, IDC_FILE_RESERVED2, m_Reserved2);
|
||
|
DDX_Text(pDX, IDC_FILE_OFFBITS, m_OffBits);
|
||
|
DDX_Text(pDX, IDC_BITMAP_HEADERSIZE, m_BitmapHeaderSize);
|
||
|
DDX_Text(pDX, IDC_BITMAP_WIDTH, m_BitmapWidth);
|
||
|
DDX_Text(pDX, IDC_BITMAP_HEIGHT, m_BitmapHeight);
|
||
|
DDX_Text(pDX, IDC_BITMAP_PLANES, m_BitmapPlanes);
|
||
|
DDX_Text(pDX, IDC_BITMAP_BITCOUNT, m_BitmapBitCount);
|
||
|
DDX_Text(pDX, IDC_BITMAP_COMPRESSION, m_BitmapCompression);
|
||
|
DDX_Text(pDX, IDC_BITMAP_IMAGESIZE, m_BitmapImageSize);
|
||
|
DDX_Text(pDX, IDC_BITMAP_XPELSPERMETER, m_BitmapXPelsPerMeter);
|
||
|
DDX_Text(pDX, IDC_BITMAP_YPELSPERMETER, m_BitmapYPelsPerMeter);
|
||
|
DDX_Text(pDX, IDC_BITMAP_CLRUSED, m_BitmapClrUsed);
|
||
|
DDX_Text(pDX, IDC_BITMAP_CLRIMPORTANT, m_BitmapClrImportant);
|
||
|
DDX_Check(pDX, IDC_IMAGE_MANIPULATION_CHECKBOX, m_bManipulateImage);
|
||
|
//}}AFX_DATA_MAP
|
||
|
}
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CBMPInfoDlg, CDialog)
|
||
|
//{{AFX_MSG_MAP(CBMPInfoDlg)
|
||
|
ON_WM_PAINT()
|
||
|
ON_WM_QUERYDRAGICON()
|
||
|
ON_BN_CLICKED(IDC_IMAGE_MANIPULATION_CHECKBOX, OnImageManipulationCheckbox)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CBMPInfoDlg message handlers
|
||
|
|
||
|
BOOL CBMPInfoDlg::OnInitDialog()
|
||
|
{
|
||
|
CDialog::OnInitDialog();
|
||
|
SetIcon(m_hIcon, TRUE); // Set big icon
|
||
|
SetIcon(m_hIcon, FALSE); // Set small icon
|
||
|
return TRUE; // return TRUE unless you set the focus to a control
|
||
|
}
|
||
|
|
||
|
void CBMPInfoDlg::OnPaint()
|
||
|
{
|
||
|
if (IsIconic())
|
||
|
{
|
||
|
CPaintDC dc(this); // device context for painting
|
||
|
|
||
|
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
|
||
|
|
||
|
// Center icon in client rectangle
|
||
|
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;
|
||
|
|
||
|
// Draw the icon
|
||
|
dc.DrawIcon(x, y, m_hIcon);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CDialog::OnPaint();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
HCURSOR CBMPInfoDlg::OnQueryDragIcon()
|
||
|
{
|
||
|
return (HCURSOR) m_hIcon;
|
||
|
}
|
||
|
|
||
|
LRESULT CBMPInfoDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
if (message == WM_DROPFILES) {
|
||
|
//
|
||
|
// process the dropped file request
|
||
|
//
|
||
|
|
||
|
UINT result = 0; // error result
|
||
|
UINT cch = 0; // size of the characters in buffer
|
||
|
LPTSTR lpszFile = NULL; // buffer
|
||
|
UINT iFile = 0;
|
||
|
|
||
|
//
|
||
|
// call once to get information on the DROP
|
||
|
//
|
||
|
|
||
|
result = DragQueryFile((HDROP) wParam,iFile, NULL, cch);
|
||
|
|
||
|
//
|
||
|
// alloc the needed mem for the operation
|
||
|
//
|
||
|
|
||
|
if (result > 0) {
|
||
|
lpszFile = (LPTSTR)GlobalAlloc(GPTR,result + 1);
|
||
|
|
||
|
if (lpszFile) {
|
||
|
|
||
|
//
|
||
|
// call again to fill the file information
|
||
|
//
|
||
|
|
||
|
cch = (result + 1); // assign the character count here
|
||
|
result = DragQueryFile((HDROP) wParam,iFile,lpszFile,cch);
|
||
|
m_BitmapFileName = lpszFile;
|
||
|
GlobalUnlock(lpszFile);
|
||
|
GlobalFree(lpszFile);
|
||
|
UpdateFileInformation();
|
||
|
}
|
||
|
} else {
|
||
|
AfxMessageBox("Could not allocate enough Memory for Bitmap File Name");
|
||
|
}
|
||
|
}
|
||
|
return CDialog::WindowProc(message, wParam, lParam);
|
||
|
}
|
||
|
|
||
|
void CBMPInfoDlg::UpdateFileInformation()
|
||
|
{
|
||
|
BITMAPFILEHEADER bmfh;
|
||
|
ZeroMemory(&bmfh, sizeof(BITMAPFILEHEADER));
|
||
|
BITMAPINFOHEADER bmih;
|
||
|
ZeroMemory(&bmih, sizeof(BITMAPINFOHEADER));
|
||
|
|
||
|
CFile ImageFile;
|
||
|
CFileException Exception;
|
||
|
|
||
|
//
|
||
|
// attempt to open the image file
|
||
|
//
|
||
|
|
||
|
if (!ImageFile.Open(m_BitmapFileName,CFile::modeRead,&Exception))
|
||
|
AfxThrowFileException(Exception.m_cause);
|
||
|
else {
|
||
|
|
||
|
//
|
||
|
// read the image file header and check if it's valid.
|
||
|
//
|
||
|
|
||
|
if (ImageFile.Read((LPSTR)&bmfh, sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER))
|
||
|
AfxMessageBox("Error reading BITMAPFILEHEADER");
|
||
|
else {
|
||
|
|
||
|
//
|
||
|
// read the image info header and check if it's valid.
|
||
|
//
|
||
|
|
||
|
if (ImageFile.Read((LPSTR)&bmih, sizeof(BITMAPINFOHEADER)) != sizeof(BITMAPINFOHEADER))
|
||
|
AfxMessageBox("Error reading BITMAPINFOHEADER");
|
||
|
else {
|
||
|
|
||
|
//
|
||
|
// update file header members here
|
||
|
//
|
||
|
|
||
|
if (bmfh.bfType != BMP_HEADER_MARKER)
|
||
|
AfxMessageBox("invalid BMP file format detected");
|
||
|
else {
|
||
|
m_FileType = bmfh.bfType;
|
||
|
m_FileSize = bmfh.bfSize;
|
||
|
m_Reserved1 = bmfh.bfReserved1;
|
||
|
m_Reserved2 = bmfh.bfReserved2;
|
||
|
m_OffBits = bmfh.bfOffBits;
|
||
|
|
||
|
//
|
||
|
// update image info header members here
|
||
|
//
|
||
|
|
||
|
m_BitmapHeaderSize = bmih.biSize;
|
||
|
m_BitmapWidth = bmih.biWidth;
|
||
|
m_BitmapHeight = bmih.biHeight;
|
||
|
m_BitmapPlanes = bmih.biPlanes;
|
||
|
m_BitmapBitCount = bmih.biBitCount;
|
||
|
m_BitmapCompression = bmih.biCompression;
|
||
|
m_BitmapImageSize = bmih.biSizeImage;
|
||
|
m_BitmapXPelsPerMeter = bmih.biXPelsPerMeter;
|
||
|
m_BitmapYPelsPerMeter = bmih.biYPelsPerMeter;
|
||
|
m_BitmapClrUsed = bmih.biClrUsed;
|
||
|
m_BitmapClrImportant = bmih.biClrImportant;
|
||
|
|
||
|
//
|
||
|
// display the current filename in the window header
|
||
|
//
|
||
|
|
||
|
SetWindowText(RipFileName());
|
||
|
}
|
||
|
if (m_bManipulateImage) {
|
||
|
ManipulateImage(&ImageFile);
|
||
|
}
|
||
|
UpdateData(FALSE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// close the image file
|
||
|
//
|
||
|
|
||
|
ImageFile.Close();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CString CBMPInfoDlg::RipFileName()
|
||
|
{
|
||
|
int index = 0;
|
||
|
CString RippedFile = "";
|
||
|
index = m_BitmapFileName.ReverseFind('\\');
|
||
|
index ++;
|
||
|
while (index <= (m_BitmapFileName.GetLength()-1)) {
|
||
|
RippedFile = RippedFile + m_BitmapFileName[index];
|
||
|
index++;
|
||
|
}
|
||
|
return (RippedFile);
|
||
|
}
|
||
|
|
||
|
void CBMPInfoDlg::OnImageManipulationCheckbox()
|
||
|
{
|
||
|
if(m_bManipulateImage)
|
||
|
m_bManipulateImage = FALSE;
|
||
|
else
|
||
|
m_bManipulateImage = TRUE;
|
||
|
}
|
||
|
|
||
|
void CBMPInfoDlg::ManipulateImage(CFile *pImageFile)
|
||
|
{
|
||
|
AfxMessageBox("There are no image manipulation routines written yet... sorry. :) ");
|
||
|
}
|