首先呢,既然是自己的类,当然给它起个in点的名字啦,CDib/CBmp/CImage/CxImage等都是通俗易懂兼且好记不过就滥了,MyBmp怎么样呢,哦,干脆来个IBmp好了,哈哈。
有了名字后,要确定能够实现什么功能:起码要能够打开BMP、保存(另存)BMP、当然还要能够显示才合格,那么:
class IBmp {
public: // 装载BMP
LPBYTE Load( LPCTSTR lpszFileName ); // 保存BMP
BOOL Save( LPCTSTR lpszFileName, LPBYTE lpDib ); // 显示BMP
void Display( HDC hDC, LPBYTE lpDib );
};
恩?似乎有点简单过头了,呵呵,最好还能在BMP上面写写画画什么的,那还差不多,甚至在一幅空白的BMP上作图......
ok,就是那样,那么修改后的头文件:
// IBmp.h
#ifndef __H_IBMP_INCLUDE__
#define __H_IBMP_INCLUDE__
// 添加后
class IBmp {
public:
// 装载BMP
BOOL Load( LPCTSTR lpszFileName );
// 保存BMP
BOOL Save( LPCTSTR lpszFileName );
// 显示BMP
void Display( HDC hDC );
// 构造函数
IBmp();
// 析构函数
virtual ~IBmp();
// 顾名思义,就是create bmp咯.
// 有这3个DD,create空白的行,create指定的也行,create from bmp buffer一样行.
BOOL CreateBmp( long lWidth, long lHeight );
BOOL CreateBmp( long lWidth, long lHeight, WORD wBPP, DWORD dwCompression = BI_RGB, LPRGBQUAD lpRGB = NULL );
BOOL CreateBmp( LPBYTE lpDib, DWORD dwBitsOffset );
// 用来鉴定位图句柄是否为空,空的就不能显示、作图等.
BOOL IsEmpty() { return ( BOOL )( hBitmap == NULL ); }
// 初始化
void StartUp();
// 清空占用资源
void CleanUp();
// 计算发色数
DWORD NumColorsEntry( LPBITMAPINFOHEADER lpBmih );
// 开始gdi作图
HDC BeginDraw();
// 结束gdi作图
void EndDraw();
// 建调色板
BOOL CreatePal();
public:
// 用来GDI画图&显示的位图句柄
HBITMAP hBitmap;
// BMP信息部分
LPBITMAPINFO lpBminfo;
// BMP的位数据指针
LPBYTE lpBits;
// 调色板句柄
HPALETTE hPalette;
private:
// 用来作图的内存DC
HDC hMemDC;
// 用来保存临时句柄防止GDI资源泄漏
HBITMAP hTempBmp;
// 用来保存临时句柄防止GDI资源泄漏
HPALETTE hTempPal;
};
#endif // #ifndef __H_IBMP_INCLUDE__
看来已经初具规模了耶,剩下的就要象堆积木般地把它堆出来。
这个“坑”挖大了,什么时候才填上这个“坑”呢?下次继续。
BY Lambochan 2009/11/14