BOOL CTestView :: PaintDIB(HDC hDC,RECT des,RECT src, MYBITMAP myb){
BITMAPINFOHEADER* lpDIBHdr; // BITMAPINFOHEADER指针
BOOL bSuccess=FALSE; // 成功标志
HPALETTE hPal=NULL; // DIB调色板
HPALETTE hOldPal=NULL; // 以前的调色板
lpDIBHdr = myb.lpbmp;
// 找到DIB图像象素起始位置
int lw=WIDTHBYTES(myb.lpbmp->biWidth*8);
// 获取DIB调色板,并选中它
if (m_palDIB != NULL)
{
hPal = (HPALETTE) m_palDIB->m_hObject;
// 选中调色板
hOldPal = ::SelectPalette(hDC, hPal, TRUE);
}
// 设置显示模式
::SetStretchBltMode(hDC, COLORONCOLOR);
int bw =myb.lpbmp->biWidth;
int bh = myb.lpbmp->biHeight;
// 判断是调用StretchDIBits()还是SetDIBitsToDevice()来绘制DIB对象
if(des.right-des.left>=(src.right-src.left)&&
(des.bottom-des.top)>=(src.bottom-src.top)
)
{
// 原始大小,不用拉伸。
bSuccess = ::SetDIBitsToDevice(hDC, // hDC
0 , // DestX
0 , // DestY
bw , // nDestWidth
bh, // nDestHeight
0, // SrcX
0, // SrcY
0, // nStartScan
bh, // nNumScans
myb.data, // lpBits
(LPBITMAPINFO)lpDIBHdr, // lpBitsInfo
DIB_RGB_COLORS
); // wUsage
}
else
{
// 非原始大小,拉伸。
bSuccess = StretchDIBits(hDC, // hDC
des.left , // DestX
des.top , // DestY
des.right , // nDestWidth
des.bottom, // nDestHeight
src.left, // SrcX
src.top, // SrcY
src.right, // nStartScan
src.bottom, // nNumScans
myb.data, // lpBits
(LPBITMAPINFO)lpDIBHdr, // lpBitsInfo
DIB_RGB_COLORS,
SRCCOPY
); // wUsage
}
// 解除锁定
// 恢复以前的调色板
if (hOldPal != NULL)
{
::SelectPalette(hDC, hOldPal, TRUE);
}
// 返回
return bSuccess;
注意它们的第8个参数一个是uStartScan,为0,一个是nSrcWidth,不为0