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