本文受了https://blog.csdn.net/dennisfdu/article/details/8702471 的启发
实现灰度贴图,强调3个点:
1) CView定时刷新其显示,这在OnTimer里实现:
::SetStretchBltMode(m_dcMem.GetSafeHdc(), COLORONCOLOR);
StretchDIBits(m_dcMem.GetSafeHdc(), 0,0,m_iWidth, m_iHeight, 0,0, m_iWidth, m_iHeight,
(LPBYTE)m_pData, (BITMAPINFO *)m_pInfoBmp, DIB_RGB_COLORS, SRCCOPY);
而为了让DC明白你要画的是灰度图,而不是3色彩图的办法,是在StretchDIBits()函数里指定BITMAPINFO变量:
((BITMAPINFO *)m_pInfoBmp)->bmiHeader.biWidth = m_iWidth;
((BITMAPINFO *)m_pInfoBmp)->bmiHeader.biHeight = 0 - m_iHeight;
上面两行语句在OnSize里实现。之所以biHeight是负值,因为BITMAPINFO默认是把图片最底下一行,放到bmp文件的开头保存。所以,为了正常显示灰度图,而不是首尾倒置,要把biHeight设为负数。
2) m_bmpMem不能通过CreateCompatibleBmp实现,只能用下述办法:
HINSTANCE hInstnc = AfxFindResourceHandle(MAKEINTRESOURCE(IDB_BITMAP1), RT_BITMAP);
m_bmpMem = (HBITMAP)LoadImage(hInstnc, MAKEINTRESOURCE(IDB_BITMAP1),
IMAGE_BITMAP, m_iWidth, m_iHeight, LR_DEFAULTCOLOR | LR_CREATEDIBSECTION);
3) OnDraw()里面的如下代码必不可少:
void CGrayScaleView::OnDraw(CDC* pDC)
{
CGrayScaleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CDC tmpDC;
tmpDC.CreateCompatibleDC(pDC);
tmpDC.SelectObject(m_bmpMem);
// TODO: 在此处为本机数据添加绘制代码
pDC->BitBlt(0,0,m_iWidth, m_iHeight, &tmpDC, 0,0, SRCCOPY);
tmpDC.DeleteDC();
}
代码在我的资源中下载:https://download.csdn.net/download/liji_digital/10806703
效果: