具体的代码如下:void CTest10Dlg::OnPaint()
{
CPaintDC dc(this);
//加载皮肤界面
CRect rect;
GetClientRect(&rect);//得到窗体的大小
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BITMAPBACKGROUND);//加载背景图片
BITMAP bitMap;
bmpBackground.GetBitmap(&bitMap);
CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(rect.TopLeft().x, rect.TopLeft().y,rect.Width(), rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);//画窗体
//显示采集的视频图象
m_CaptureBmp.GetBitmap(&bm);
dcMem.DeleteDC();
dcMem.CreateCompatibleDC(&dc);
dcMem.SelectObject(&m_CaptureBmp);
TransparentBlt(dc.m_hDC,0,0,bm.bmWidth,bm.bmHeight,
dcMem.m_hDC,0,0,bm.bmWidth,bm.bmHeight,RGB(255,255,255));
}
{
CPaintDC dc(this);
//加载皮肤界面
CRect rect;
GetClientRect(&rect);//得到窗体的大小
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BITMAPBACKGROUND);//加载背景图片
BITMAP bitMap;
bmpBackground.GetBitmap(&bitMap);
CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(rect.TopLeft().x, rect.TopLeft().y,rect.Width(), rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);//画窗体
//显示采集的视频图象
m_CaptureBmp.GetBitmap(&bm);
dcMem.DeleteDC();
dcMem.CreateCompatibleDC(&dc);
dcMem.SelectObject(&m_CaptureBmp);
TransparentBlt(dc.m_hDC,0,0,bm.bmWidth,bm.bmHeight,
dcMem.m_hDC,0,0,bm.bmWidth,bm.bmHeight,RGB(255,255,255));
}
双缓冲的意思是先在内存绘图,然后再拷贝到屏幕,从而实现动态绘图而不闪烁。所以不管几个bitblt操作都是一样的。