Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

269 lines
8.0 KiB

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