今天写了一个读取位图的类,体会到了一个类的分装性,当一个数据成员是protected类型时,我们在类中专门写了一个函数来访问这个变量,如同c#中的属性与方法。
////
这是位图类的头文件
Dib.h: interface for the CDib class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_DIB_H__ACDEA2B4_090A_4299_AB15_3970423DEC4C__INCLUDED_)
#define AFX_DIB_H__ACDEA2B4_090A_4299_AB15_3970423DEC4C__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CDib:public CObject
{
public:
CDib();
virtual ~CDib();
protected:
LPBITMAPFILEHEADER m_pBmFileHeader;
LPBITMAPINFO m_pBmInfo;
LPBITMAPINFOHEADER m_pBmInfoHeader;
RGBQUAD * m_pRGBTable;
BYTE* m_pDibBits;
UINT m_numColors;
public:
BYTE* GetDibBitsPtr();
LPBITMAPINFO GetDIbInfoPtr();
LPBITMAPINFOHEADER GetDibInfoHeaderPtr();
UINT GetDibHeight();
UINT GetDibWidth();
DWORD GetDibSizeImage();
CDib(const char *fileNmae);
protected:
void LoadBitmapFile(const char* fileName);
};
#endif // !defined(AFX_DIB_H__ACDEA2B4_090A_4299_AB15_3970423DEC4C__INCLUDED_)
这是cpp文件s
//// Dib.cpp: implementation of the CDib class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Open.h"
#include "Dib.h"
#include "windowsX.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDib::CDib()
{
m_pBmFileHeader=NULL;
m_pBmInfo=NULL;
m_pBmInfoHeader=NULL;
m_pRGBTable=0;
m_pDibBits=0;
}
CDib::CDib(const char * fileName)
{
LoadBitmapFile(fileName);
}
CDib::~CDib()
{
GlobalFree(m_pBmInfo);
}
void CDib::LoadBitmapFile(const char *fileName)
{
CFile file(fileName,CFile::modeRead);
BITMAPFILEHEADER bmFileHeader;
file.Read((void*)&bmFileHeader,sizeof(bmFileHeader));
if(bmFileHeader.bfType!=0x4d42)
{
AfxMessageBox("Not a bitmap file");
m_pBmFileHeader=0;
m_pBmInfo=0;
m_pBmInfoHeader=0;
m_pRGBTable=0;
m_pDibBits=0;
m_numColors=0;
}
else
{
DWORD fileLength=file.GetLength();
DWORD dibSize=fileLength-sizeof(bmFileHeader);
BYTE *pDib=(BYTE*)GlobalAllocPtr(GMEM_MOVEABLE,dibSize);
pDib=new BYTE[dibSize];
file.Read(pDib,dibSize);
file.Close();
m_pBmInfo=(LPBITMAPINFO)pDib;
m_pBmInfoHeader=(LPBITMAPINFOHEADER)pDib;
m_pBmInfoHeader->biSizeImage=GetDibSizeImage();
m_pDibBits=pDib+m_pBmInfoHeader->biSize;
}
}
DWORD CDib::GetDibSizeImage()
{
if(m_pBmInfoHeader->biSizeImage==0)
{
DWORD byteWidth=(DWORD)GetDibWidth();
DWORD height=(DWORD)GetDibHeight();
DWORD imageSize=byteWidth*height;
return imageSize;
}
else
return m_pBmInfoHeader->biSizeImage;
}
UINT CDib::GetDibWidth()
{
return (UINT)m_pBmInfoHeader->biWidth;
}
UINT CDib::GetDibHeight()
{
return (UINT)m_pBmInfoHeader->biHeight;
}
LPBITMAPINFOHEADER CDib::GetDibInfoHeaderPtr()
{
return m_pBmInfoHeader;
}
LPBITMAPINFO CDib::GetDIbInfoPtr()
{
return m_pBmInfo;
}
BYTE* CDib::GetDibBitsPtr()
{
return m_pDibBits;
}