if(!file.Open(strFileName, CFile::modeRead))
return;
BITMAPFILEHEADER bmfHeader;
nFileLen = file.GetLength();
dwDibSize = nFileLen - sizeof(BITMAPFILEHEADER); //dwDibSize为BMP总大小减去BMP文件头的长度
if (m_pDib != NULL)
{
delete[] m_pDib;
m_pDib = NULL;
}
m_pDib = new unsigned char[dwDibSize]; // 为DIB位图分配内存
if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader)) //读文件头
return;
if (bmfHeader.bfType != ((WORD)('M' <<8) | 'B')) //判断是否是BMP位图
return ;
if (file.Read(m_pDib, dwDibSize) != dwDibSize) //读文件头以后的数据
return ;
m_bmpInfoHeader = (BITMAPINFOHEADER*)m_pDib;
lHeight = m_bmpInfoHeader->biHeight; //图像长
lWidth = m_bmpInfoHeader->biWidth; //图像宽
lBitCount = m_bmpInfoHeader->biBitCount; //图像位数
switch(lBitCount)
{
case 1:
NumColor = 2;
break;
case 4:
NumColor = 16;
break;
case 8:
NumColor = 256;
break;
case 24:
NumColor = 0;
break;
default:
NumColor = 0;
break;
return;
}
m_pDibBits = m_pDib + sizeof(BITMAPINFOHEADER) + NumColor * sizeof (RGBQUAD);m_pDib和m_pDibBits都是BYTE数组指针
然后
CDC *pDC;
CRect rect;
CWnd *pWnd = GetDlgItem(IDC_STATIC_SHOW);
pWnd->GetClientRect(&rect);
pDC = pWnd->GetDC();
SetStretchBltMode(pDC->m_hDC,HALFTONE);//防止自适应窗口图像显示失真
StretchDIBits(pDC->m_hDC,rect.left, rect.top, rect.right, rect.bottom, 0, 0,
lWidth, lHeight, m_pDibBits, (BITMAPINFO*)m_bmpInfoHeader, BI_RGB, SRCCOPY);在OnPaint里面重载这段代码就行了
1001

被折叠的 条评论
为什么被折叠?



