在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);//从原设备中复制位图到目标设备

解决方案 »

  1.   

    bmp 下断点会么?看bmp的值
      

  2.   

    是不是得设置picture控件的属性
      

  3.   

    其实你如果用picture控件的话,根本不用自己贴图,直接用SetBitmap就行了。
      

  4.   

    http://blog.csdn.net/zhoujielunzhimi/article/details/8480959
    看看双缓存
      

  5.   

    首先,我这个肯定是双缓冲,你没看见 画背景 和 画文字 都在memdc上吗
    其次,遇到你这种问题,我建议 
    继承CStatic,在OnPaint中去绘制。
      

  6.   

    首先,我这个肯定是双缓冲,你没看见 画背景 和 画文字 都在memdc上吗
    ===============
    它这个没有文字,只是贴图,普通的贴图也是这样写的。
      

  7.   

    我认为的双缓冲贴图是这样的:
    除了楼主自己定义的内存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);
      

  8.   

    wltg2001,其实我贴的代码,和你说的是一样的
      

  9.   

    不好意思,应该是你开了两个帖,我只认真看了其中一个,这个就没有仔细看了。
    代码是一样的,应该能成功,你确定bmp没有问题吗
      

  10.   

    wltg2001,你是说双缓冲技术就算图片显示出来了,还是会闪,那怎么样才能使实时显示不删啊
      

  11.   

    bmp是没有问题的,采集的图片我也做了实时存储
      

  12.   

    //在位图缓冲区上画图   BkDC.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);//从原设备中复制位图到目标设备
    =======================
    这一句你的代码中到底加没有加啊?应该是要加上去的。
    我试了一下代码,应该是没有问题的。
      

  13.   

    如果还是不行,我只能怀疑pDlg这个对话框指针有问题了
      

  14.   

    这个说法是我没有看清你的代码才说的。
    闪的主要原因应该是画背景造成的,如果再加一个BkDC的话,因为作图总是在BkDC上作的,背景是一样的,闪烁应该要好得多。
      

  15.   

    wltg2001,我能显示,但是总是黑乎乎的,看不到我要显示的图片,于是我就加了一句BkDC.FillSolidRect(rect,pDC->GetBkColor()); 
    然后再在上面作图
    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);//从原设备中复制位图到目标设备
    这样做了之后,黑色变成白色了,还是没看到显示出来的图
      

  16.   

    还有就是pDlg指针是我从主线程里面传过来的当前对话框的this指针,这个应该不会有错吧
      

  17.   

    BkDC.FillSolidRect(rect,pDC->GetBkColor()); 
    ===================
    这个是设背景色的,不加的话背景是默认的黑色,加上之后会成为白色。关系不大。
    下面是我试的代码,很正常。
    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);//从原设备中复制位图到目标设备
    应该说这是一段很标准的代码,不应该出问题的。
      

  18.   

    wltg2001,我自己重新新建一个工程,然后用这个代码显示,是能显示出图的,但是我把这些代码放在我的线程函数里面还是没有图显示出来
      

  19.   

    wltg2001,我自己重新新建一个工程,然后用这个代码显示,是能显示出图的,但是我把这些代码放在我的线程函数里面还是没有图显示出来
    ====================
    对话框指针应该有问题。