在MFC的图片控件中完整显示位图

  1. res\\123.bmp为位图的相对路径(也可写成绝对路径,不过硬编码移植性不好,不推荐);
  2. IDC_STATIC_PIC是对话框程序中图片控件(Picture Control)的ID;
  3. 如果对位图结构不理解,请参考我的另一篇博文——windows位图结构。

C++代码如下:

BITMAPFILEHEADER bmpFileHeader;
BITMAPINFOHEADER bmpInfoHeader;
CFile bmpFile;
if (!bmpFile.Open(_T("res\\123.bmp"), CFile::modeRead | CFile::typeBinary))
    AfxMessageBox(_T("open wrong!"));

//读取位图的文件头和信息头
if (bmpFile.Read(&bmpFileHeader, sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER))
    AfxMessageBox(_T("read1 wrong!"));
if (bmpFile.Read(&bmpInfoHeader, sizeof(BITMAPINFOHEADER)) != sizeof(BITMAPINFOHEADER))
    AfxMessageBox(_T("read2 wrong!"));
    
//为指针开辟空间,BITMAPINFO结构定义如下
//typedef struct tagBITMAPINFO {
// BITMAPINFOHEADER bmiHeader;
// RGBQUAD bmiColors[1];
//} BITMAPINFO;
BITMAPINFO * pBmpInfo;
pBmpInfo = (BITMAPINFO *)new char[sizeof(BITMAPINFO)];
memcpy(pBmpInfo, &bmpInfoHeader, sizeof(BITMAPINFOHEADER));

//实际图像数据,等于文件大小减去头部偏移量
DWORD dataBytes = bmpFileHeader.bfSize - bmpFileHeader.bfOffBits;
byte * pBmpData;
pBmpData = (byte *)new char[dataBytes];
bmpFile.Read(pBmpData, dataBytes);//读取实际的图像数据
bmpFile.Close();

//根据ID获取控件指针
CWnd * pWnd = GetDlgItem(IDC_STATIC_PIC);
CRect rect;
pWnd->GetClientRect(&rect);
//Retrieves a pointer to a common, class, or private device context for
//the client area depending on the class style specified for the CWnd.
CDC * pDC = pWnd->GetDC();

//设置位图的伸缩模式,COLORONCOLOR模式直接删除所有冗余的像素行
pDC->SetStretchBltMode(COLORONCOLOR);

//将图像像素拷贝到目的矩形中,首先取得设备上下文句柄
if (0 == StretchDIBits(pDC->GetSafeHdc(), 0, 0, rect.Width(), rect.Height(), 0, 0,
bmpInfoHeader.biWidth, bmpInfoHeader.biHeight, pBmpData, pBmpInfo, DIB_RGB_COLORS, SRCCOPY)){
    MessageBox(_T("调用错误StretchDIBits!"));
}

最后贴一张运行效果图:
1
春江水暖鸭先知~哈哈~~

猜你喜欢

转载自blog.csdn.net/u014261408/article/details/90109820