在picture控件上利用双缓冲显示图片,以前没用过,求高手指教哪里写得有问题,为什么显示过程中,都是黑漆漆的一片
CBitmap* bmp = pDlg->IplImage2CBitmap(pDlg->dst);
CDC *pDC = pDlg->GetDlgItem(IDC_STATIC_PIC)->GetDC();//得到picture控件的dc
pDlg->GetDlgItem(IDC_STATIC_PIC)->GetClientRect(&rect);//获取可显示的矩形区域
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);//创建一个内存环境,以便在内存中保存位图,并与指定的窗口设备环境兼容
dcMem.SelectObject(&bmp);//将实际的位图点入到设备内存环境//创建于窗口一样大的兼容位图
CBitmap bmp1;
bmp1.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建一个内存环境,以便在内存中保存位图,并与指定的窗口设备环境兼容CDC BkDC;
BkDC.CreateCompatibleDC(pDC);//创建一个内存环境,以便在内存中保存位图,并与指定的窗口设备环境兼容
BkDC.SelectObject(bmp1);//将创建的位图调入到设备内存环境//在位图缓冲区上画图 BkDC.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);//从原设备中复制位图到目标设备 //把缓冲区中的图贴到控件上
pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&BkDC,0,0,SRCCOPY);//从原设备中复制位图到目标设备
CBitmap* bmp = pDlg->IplImage2CBitmap(pDlg->dst);
CDC *pDC = pDlg->GetDlgItem(IDC_STATIC_PIC)->GetDC();//得到picture控件的dc
pDlg->GetDlgItem(IDC_STATIC_PIC)->GetClientRect(&rect);//获取可显示的矩形区域
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);//创建一个内存环境,以便在内存中保存位图,并与指定的窗口设备环境兼容
dcMem.SelectObject(&bmp);//将实际的位图点入到设备内存环境//创建于窗口一样大的兼容位图
CBitmap bmp1;
bmp1.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建一个内存环境,以便在内存中保存位图,并与指定的窗口设备环境兼容CDC BkDC;
BkDC.CreateCompatibleDC(pDC);//创建一个内存环境,以便在内存中保存位图,并与指定的窗口设备环境兼容
BkDC.SelectObject(bmp1);//将创建的位图调入到设备内存环境//在位图缓冲区上画图 BkDC.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);//从原设备中复制位图到目标设备 //把缓冲区中的图贴到控件上
pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&BkDC,0,0,SRCCOPY);//从原设备中复制位图到目标设备
看看双缓存
其次,遇到你这种问题,我建议
继承CStatic,在OnPaint中去绘制。
===============
它这个没有文字,只是贴图,普通的贴图也是这样写的。
除了楼主自己定义的内存DC之外,应该还要定义一个内存DC:
CBitmap BkMap;
BkMap.CreateCompatibleBitmap(pDC,w,h);//w,h表示窗口的宽和高
CDC BkDC;
BkDC.CreateCompatibleDC(pDC);
BkDC.SelectObject(&BkMap);
然后再将 dcMem的内容贴到BkMap中去:BkDC.BitBlt(x,y,width,height,&memDC,0,0,SRCCOPY);
然后再将BkDC中的内容贴到实际设备中去。
我怀疑楼主的代码之所以不成功最大的可能是两个原因:一个bmp出问题了。二是没有BkMap.CreateCompatibleBitmap(pDC,w,h);
代码是一样的,应该能成功,你确定bmp没有问题吗
=======================
这一句你的代码中到底加没有加啊?应该是要加上去的。
我试了一下代码,应该是没有问题的。
闪的主要原因应该是画背景造成的,如果再加一个BkDC的话,因为作图总是在BkDC上作的,背景是一样的,闪烁应该要好得多。
然后再在上面作图
BkDC.BitBlt(0,0,BmpInfo.bmWidth,BmpInfo.bmHeight,&dcMem,0,0,SRCCOPY);//从原设备中复制位图到目标设备
最后使用
pDC->BitBlt(rect.left,rect.top + 50,BmpInfo.bmWidth,BmpInfo.bmHeight,&BkDC,0,0,SRCCOPY);//从原设备中复制位图到目标设备
这样做了之后,黑色变成白色了,还是没看到显示出来的图
===================
这个是设背景色的,不加的话背景是默认的黑色,加上之后会成为白色。关系不大。
下面是我试的代码,很正常。
CBitmap bmp;
CRect rect;
bmp.LoadBitmap(IDB_BITMAP1);
CDC *pDC=GetDlgItem(ID_STATIC_PIC)->GetDC();
GetDlgItem(ID_STATIC_PIC)->GetClientRect(&rect);//获取可显示的矩形区域
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);//创建一个内存环境,以便在内存中保存位图,并与指定的窗口设备环境兼容
dcMem.SelectObject(&bmp);//将实际的位图点入到设备内存环境//创建于窗口一样大的兼容位图
CDC BkDC;
BkDC.CreateCompatibleDC(pDC);
CBitmap bmp1;
bmp1.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建一个内存环境,以便在内存中保存位图,并与指定的窗口设备环境兼容
//创建一个内存环境,以便在内存中保存位图,并与指定的窗口设备环境兼容
BkDC.SelectObject(bmp1);//将创建的位图调入到设备内存环境
BkDC.FillSolidRect(rect,pDC->GetBkColor());
BkDC.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);//从原设备中复制位图到目标设备
pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&BkDC,0,0,SRCCOPY);//从原设备中复制位图到目标设备
应该说这是一段很标准的代码,不应该出问题的。
====================
对话框指针应该有问题。