采用双缓冲技术显示来自串口接收到的灰度图像数据
我的任务是,串口发送采集的灰度图像数据,这些数据只有各像素点的像素值,因此不能采用MFC的CBitmap类直接显示,必须人工填充BITMAP的像素值部分。此外,在采用MFC自绘时,经常用到双缓冲技术来避免闪烁。于是有了下面的解决方案:
程序代码:
CRect rt; GetDlgItem(IDC_PIXAREA)->GetClientRect(&rt);//IDC_PIXAREA是用于显示图像的图片控件的ID HWND hPixArea=GetDlgItem(IDC_PIXAREA)->GetSafeHwnd(); HDC hDC=::GetDC(hPixArea);//获得显示区域的设备上下文 HDC hMemDC=CreateCompatibleDC(hDC);//创建与显示区域设备上下文兼容的内存DC HBITMAP hBitmap=CreateCompatibleBitmap(hDC,rt.Width(),rt.Height());//创建与显示区域设备上下文DC兼容的Bitmap HGDIOBJ hOldGdiObj=SelectObject(hMemDC,hBitmap);//将Bitmap选入内存DC for(int i=0;i<rt.Width();i++)//下面用从串口接到的像素值替换Bitmap的像素值区域 for(int j=0;j<rt.Height();j++) { SetPixel(hMemDC,i,j,RGB(j+m_BaseIndex,j+m_BaseIndex,j+m_BaseIndex)); } StretchBlt(hDC,0,0,rt.Width(),rt.Height(),hMemDC,0,0,rt.Width(),rt.Height(),SRCCOPY);//将在内存DC绘制好的Bitmap复制在显示区域,即完成双缓冲 CString s; s.Format("Width=%-3d Height=%-3d GrayValue=%-3d",rt.Width(),rt.Height(),m_BaseIndex); SetTextAlign(hDC,TA_CENTER|VTA_CENTER); TextOut(hDC,rt.Width()/2,rt.Height()/2,s,s.GetLength()); SelectObject(hMemDC,hOldGdiObj);//恢复原来的GDI对象 DeleteObject(hBitmap);//有资料显示,hBitmap应该会被自动删除 DeleteObject(hMemDC);//删除内存DC ::ReleaseDC(hPixArea,hDC);//释放显示区域的设备上下文DC
程序代码:
GrayPixView.rar
(25.59 KB)