1.StretchDIBits函数实现
完成功能:
对话框程序,添加一个按钮,点击按钮后显示图片
(1)设置BYTE*m_pBmpData为类的成员变量,我们要把图片的RGB数据装进去。
(2)按钮的后台代码
void Cbmp_readDlg::OnBnClickedShowbmp()
{
CFile file; //定义一个文件对象
file.Open(CString("C:\\Users\\jian\\Desktop\\z.bmp"), CFile::modeRead);//打开文件
DWORD dwLen = file.GetLength(); //获取文件长度
file.Seek(14, CFile::begin); //略过位图文件头
if (m_pBmpData != NULL)
{
delete[] m_pBmpData;
m_pBmpData = NULL;
}
m_pBmpData = new BYTE[dwLen - 14]; //为缓冲区分配空间
file.Read(m_pBmpData, dwLen - 14); //读取文件数据到缓冲区
file.Close(); //关闭文件
OnPaint();
}
void Cbmp_readDlg::OnPaint()
{
/*******************分隔线之间的代码自动生成的,不用管************************/
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
/*******************分隔线之间的代码自动生成的,不用管。下面是添加的代码************************/
else
{
if (m_pBmpData != NULL)
{
BYTE *pHeader = m_pBmpData; //定义一个临时缓冲区
BITMAPINFO BitInfo; //定义位图信息对象
memset(&BitInfo, 0, sizeof(BITMAPINFO)); //初始化位图信息对象
memcpy(&BitInfo, pHeader, sizeof(BITMAPINFO)); //为位图信息对象赋值
int nWidth = BitInfo.bmiHeader.biWidth; //获取位图宽度
int nHeight = BitInfo.bmiHeader.biHeight; //获取位图高度
pHeader += 40; //指向位图数据
//输出位图信息,这里完成显示
StretchDIBits(GetDC()->m_hDC, 10, 40, nWidth, nHeight, 0, 0, nWidth, nHeight,
pHeader, &BitInfo, DIB_RGB_COLORS, SRCCOPY);
}
CDialogEx::OnPaint();
}
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u014568921/article/details/46876789