|
|
// 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. :) "); }
|