📄 cdib.h
字号:
// cdib.h 对CDib类中数据和函数进行进行声明
#ifndef _INSIDE_VISUAL_CPP_CDIB
#define _INSIDE_VISUAL_CPP_CDIB
// DIB句柄
DECLARE_HANDLE(HDIB);
// DIB常量
#define PALVERSION 0x300
/* DIB宏 */
// 判断是否是Win 3.0的DIB
#define IS_WIN30_DIB(lpbi) ((*(LPDWORD)(lpbi)) == sizeof(BITMAPINFOHEADER))
// 计算矩形区域的宽度
#define RECTWIDTH(lpRect) ((lpRect)->right - (lpRect)->left)
// 计算矩形区域的高度
#define RECTHEIGHT(lpRect) ((lpRect)->bottom - (lpRect)->top)
// 在计算图像大小时,采用公式:biSizeImage = biWidth' × biHeight。
// 是biWidth',而不是biWidth,这里的biWidth'必须是4的整倍数,表示
// 大于或等于biWidth的,离4最近的整倍数。WIDTHBYTES就是用来计算
// biWidth'
#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)
class CDib : public CObject
{
public:
enum Alloc {noAlloc, crtAlloc, heapAlloc}; // 枚举类型,表示内存分配的状况
DECLARE_SERIAL(CDib)
public:
LPVOID m_lpvColorTable; // 调色板指针
HDIB m_hDib; // DIB对象的指针(即出BITMAPFILEHEADER外的内容)
HBITMAP m_hBitmap; // BITMAP结构指针(即DIB信息头和调色板的内容)
LPSTR m_lpDib; // DIB对象指针
LPBITMAPINFOHEADER m_lpBMIH; // DIB信息头指针
LPBYTE m_lpImage; // DIB位图数据块地址
HGLOBAL m_hGlobal; // 全局的句柄,用于内存映射文件中
Alloc m_nBmihAlloc; // 表示信息头内存分配的状况
Alloc m_nImageAlloc; // 表示位图数据分配的状况
DWORD m_dwSizeImage; // DIB位图中的字节数(信息头和调色板数据除外)
int m_nColorTableEntries; // 调色板表项数
HANDLE m_hFile; // 文件句柄
HANDLE m_hMap; // 内存映射文件句柄
LPVOID m_lpvFile; // 文件句柄
HPALETTE m_hPalette; // 调色板句柄
public:
// 构造函数
CDib();
// 根据指定的位图尺寸和象素位数来构造CDib实例
CDib(CSize size, int nBitCount);
// 析构函数
~CDib();
// 获取象素真实的颜色值
RGBQUAD GetPixel(int x, int y);
// 获取象素在图象数据块中的位置
LONG GetPixelOffset(int x, int y);
// 获取DIB位图数据块的存储尺寸
CSize GetDibSaveDim();
// 判断DIB是否为空
BOOL IsEmpty();
// 计算调色板的表项数
WORD PaletteSize();
// 获取DIB位图中数据的字节数
int GetSizeImage()
{return m_dwSizeImage;}
// 获取信息头和调色板的尺寸
int GetSizeHeader()
{return sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableEntries;}
// 获取以象素表示的DIB的宽度和高度
CSize GetDimensions();
// 以读模式打开内存映射文件,并将其与CDib对象进行关联]
BOOL AttachMapFile(const char* strPathname, BOOL bShare = FALSE);
//创建一个新的内存映射文件,并进行数据的复制
BOOL CopyToMapFile(const char* strPathname);
// 用内存中的DIB与已有的CDib对象关联
BOOL AttachMemory(LPVOID lpvMem, BOOL bMustDelete = FALSE, HGLOBAL hGlobal = NULL);
// 将CDib对象按照指定的尺寸输出到显示器(或者打印机)
// until we implemnt CreateDibSection
BOOL Draw(CDC* pDC, CPoint origin, CSize size);
// 创建一个DIB短,图象内存将不被初始化
HBITMAP CreateSection(CDC* pDC = NULL);
// 将CDib对象的逻辑调色板选入设备上下文,然后实现该调色板
UINT UsePalette(CDC* pDC, BOOL bBackground = FALSE);
// 如果调色板存在的话,读取调色板,并创建一个Windows调色板
BOOL MakePalette();
// 如果16bpp、24bpp或32bppDIB不举杯调色板,则该函数可以为CDib对象创建一个逻辑调色板,
// 它与由CreatehalftonePalette函数返回的调色板相匹配。如果程序在256色调色板显示器上
// 运行,而你又没有调用SetSystemPalette,那么,你将不具有任何调色板,只有20中标准的
// Windows颜色出现在DIB中
BOOL SetSystemPalette(CDC* pDC);
// 将DIB重新生成为压缩的或者不压缩的DIB。
BOOL Compress(CDC* pDC, BOOL bCompress = TRUE);
// 从以后的DIB中创建DDB位图,实现DIB到DDB的转换
HBITMAP CreateBitmap(CDC* pDC);
// 从DDB中创建DIB,实现DDB到DIB的转换
BOOL ConvertFromDDB(HBITMAP hBitmap, HPALETTE hPal);
// 从文件中读取数据,并填充文件头、信息头、调色板和位图数据
BOOL Read(CFile* pFile);
// 从BMP文件中读取信息头,调用CreateDIBSection来分配位图数据内存,然后将位图从该文件读入刚才分配的内存
BOOL ReadSection(CFile* pFile, CDC* pDC = NULL);
// 将DIB从CDib对象写入文件
BOOL Write(CFile* pFile);
// 串行化过程
void Serialize(CArchive& ar);
// 清空DIB,释放已经分配的内存,并且关闭映射文件
void Empty();
// 计算调色板的尺寸
void ComputePaletteSize(int nBitCount);
// 将源BITMAP类pDibSrc中的数据拷贝到pDibDst中,并对相应的数据成员赋值
BOOL ConvertDDBToDIB(HBITMAP hBitmap, CDib* pDibDest, HPALETTE hPal);
// 将源CDib类pDibSrc中的数据拷贝到pDibDst中,并对相应的数据成员赋值
BOOL CopyDIB(CDib* pDibSrc, CDib* pDibDst);
// 将指定矩形位置内的屏幕内容拷贝到DIB中源CDib类pDibSrc中的数据拷贝到pDibDst中
BOOL CopyScreenToDIB(LPRECT lpRect, CDib* pDibDest);
// 获得当前正在使用的系统调色板的句柄
HPALETTE GetSystemPalette() ;
// 将创建一个新的调色板,并从指定的调色板拷贝调色板内容
HPALETTE CopyPalette(HPALETTE hPalSrc);
// 将指定文件中的DIB文件载入
BOOL ReadDIB(CFile* pFile, LPBITMAPINFOHEADER* pLpBMIH, LPBYTE* pLpImage);
HPALETTE MakeDIBPalette(LPVOID lpvColorTable, LPBITMAPINFOHEADER lpBMIH);
// 将DIB图象进行显示
BOOL PaintDIB(CDC* pDC, LPBITMAPINFOHEADER lpBMIH, LPBYTE lpImage, CPoint origin, CSize size, HPALETTE hPalette);
HGLOBAL CopyHandle (HGLOBAL h);
HDIB ReadDIBFile(CFile& file);
DWORD DIBHeight(LPSTR lpDIB);
DWORD DIBWidth(LPSTR lpDIB);
BOOL CreateDIBPalette(HDIB hDIB, CPalette* pPal);
WORD DIBNumColors(LPSTR lpbi);
private:
// 断开映射文件的关联
void DetachMapFile();
// 计算调色板和位图尺寸
void ComputeMetrics();
};
#endif // _INSIDE_VISUAL_CPP_CDIB
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -