![]() |
#2
我菜1192013-11-03 00:31
|
此外,在采用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
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
只有本站会员才能查看附件,请 登录
程序代码:
只有本站会员才能查看附件,请 登录