1.************************************************************************
// 文件名:dibapi.cpp
//
// DIB(Independent Bitmap) API函数库:
//
//
PaintDIB()
- 绘制DIB对象
// CreateDIBPalette() -
创建DIB对象调色板
//
FindDIBBits()
- 返回DIB图像象素起始位置
//
DIBWidth()
- 返回DIB宽度
// DIBHeight()
- 返回DIB高度
// PaletteSize()
- 返回DIB调色板大小
//
DIBNumColors()
- 计算DIB调色板颜色数目
//
CopyHandle()
- 拷贝内存块
//
//
SaveDIB()
- 将DIB保存到指定文件中
//
ReadDIBFile()
- 重指定文件中读取DIB对象
//
//
DIBToPCX256() -
将指定的256色DIB对象保存为256色PCX文件
//
ReadPCX256() - 读取256色PCX文件
//
//
************************************************************************
#include "stdafx.h"
#include "dibapi.h"
#include
#include
#include
#include
#define DIB_HEADER_MARKER
((WORD) ('M' << 8) | 'B')
BOOL
WINAPI
PaintDIB(HDC
hDC,
LPRECT
lpDCRect,
HDIB
hDIB,
LPRECT
lpDIBRect,
CPalette*
pPal)
{
LPSTR
lpDIBHdr;
// BITMAPINFOHEADER指针
LPSTR
lpDIBBits;
// DIB象素指针
BOOL
bSuccess=FALSE;
// 成功标志
HPALETTE
hPal=NULL;
// DIB调色板
HPALETTE
hOldPal=NULL;
// 以前的调色板
// 判断DIB对象是否为空
if (hDIB == NULL)
{
// 返回
return FALSE;
}
// 锁定DIB
lpDIBHdr = (LPSTR)
::GlobalLock((HGLOBAL) hDIB);
// 找到DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIBHdr);
// 获取DIB调色板,并选中它
if (pPal != NULL)
{
hPal = (HPALETTE)
pPal->m_hObject;
// 选中调色板
hOldPal = ::SelectPalette(hDC,
hPal, TRUE);
}
// 设置显示模式
::SetStretchBltMode(hDC, COLORONCOLOR);
//
判断是调用StretchDIBits()还是SetDIBitsToDevice()来绘制DIB对象
if ((RECTWIDTH(lpDCRect) ==
RECTWIDTH(lpDIBRect)) &&
(RECTHEIGHT(lpDCRect) == RECTHEIGHT(lpDIBRect)))
{
// 原始大小,不用拉伸。
bSuccess =
::SetDIBitsToDevice(hDC,
// hDC
lpDCRect->left,
// DestX
lpDCRect->top,
// DestY
RECTWIDTH(lpDCRect),
// nDestWidth
RECTHEIGHT(lpDCRect),
// nDestHeight
lpDIBRect->left,
// SrcX
(int)DIBHeight(lpDIBHdr)
-
lpDIBRect->top -
RECTHEIGHT(lpDIBRect), //
SrcY
0,
// nStartScan
(WORD)DIBHeight(lpDIBHdr),
// nNumScans
lpDIBBits,
// lpBits
(LPBITMAPINFO)lpDIBHdr,
// lpBitsInfo