小弟想用Cximage类加载png图片做双缓冲遇到些麻烦,读入图片没有问题,显示在屏幕上也没有问题,但是一做成双缓冲就有问题了。想法:小弟的想法是用CxImage a.load(...)读入图片-->OnPaint函数里用a.draw()画到-->HDC mem_hDC上-->BitBlt函数画到m_hDC上。OnPaint代码如下:
                
                HBITMAP hbmpPaint, oldBmp;
hbmpPaint = CreateCompatibleBitmap(m_hDC, SCREEN_WIDTH, SCREEN_HEIGHT);
oldBmp = (HBITMAP)SelectObject(mem_hDC, hbmpPaint); mem_hDC = CreateCompatibleDC(mem_hDC);
a.Draw(mem_hDC,0,0,480,720,0);
BitBlt(m_hDC, 0, 0, 480, 720, mem_hDC, 0, 0, SRCCOPY);

解决方案 »

  1.   

    我以前看过一篇GDI+实现双缓冲的文章,同样是在OnPaint函数中实现的,你可以找来参考下。
      

  2.   

    mem_hDC = CreateCompatibleDC(mem_hDC);
    ??
      

  3.   

    小弟实在搞不懂双缓冲啊。。那句注释掉了之后还是一样的效果,没有改变请问各位高手告诉我该怎么做啊?我想用cximage自己带的draw函数画图函数第一个参数为HDC意思是:画在指定的HDC上,请问各位高手有没有什么办法实现啊?
      

  4.   

    BOOL CDrawEditDlg::OnEraseBkgnd(CDC* pDC
    {
    // TODO: Add your message handler code here and/or call default
    CDC dcMem;
    dcMem.CreateCompatibleDC(pDC);//DeleteDC needed
    //
    CreateCompatibleDC '产生兼容DC',和谁兼容?和()内的pDC兼容。
    所以:
    mem_hDC = CreateCompatibleDC(mem_hDC);//产生和自己兼容的DC ??
    是错的,你必须找到源dc。
    又如:
    HBITMAP CopyScreenToBitmap(CRect &Rect,HWND hwnd) 
    {  
    HDC      hScrDC, hMemDC;      
    HBITMAP  hOldBitmap,hBitmap;  
    int      xScrn, yScrn;        
    // to screen coordinates. 
    MapWindowPoints(hwnd,NULL,(POINT *)&Rect,2);
    hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);  hMemDC = CreateCompatibleDC(hScrDC); 
      

  5.   

    谢谢楼上这位大哥的提醒实在太感谢你了,现在小弟把问题具体一点,小弟事先定义了两个全局的HDC:
    m_hDC和hdcPaint;现在小弟想用cximage自带的draw函数,把图片画到hdcPaint里面,再用
    BitBlt(m_hDC, 0, 0, 480, 720, mem_hDC, 0, 0, SRCCOPY);函数将图片显示到屏幕上,请问是否可行?
      

  6.   

    一般绘图的API都会给你一个pDC,没有必要定义两个全局的HDC:m_hDC和hdcPaint,而且这2个dc的初始化也是问题。
      

  7.   

    用cximage自带的draw函数,把图片画到hdcPaint里面,这个hdcPaint应该是一个mem_dc。
      

  8.   

    请问这个hdcPaint该如何初始化呢?定义在哪里呢?现在大脑快奔溃了都搞了一天多了。
      

  9.   

    CDC hdcPaint;
    hdcPaint.CreateCompatibleDC(pDC);//DeleteDC needed
    //pDC 函数入口参数
      

  10.   

    问题解决了。。谢谢你们!
    OnPiant正确代码如下:
    /*创建缓存DC和兼容位图*/
    HDC hdcPaint = CreateCompatibleDC(m_hDC);
    HBITMAP  hbmpPaint = CreateCompatibleBitmap(m_hDC, SCREEN_WIDTH, SCREEN_HEIGHT);
    SelectObject(hdcPaint, hbmpPaint);
            a.Draw();
            BitBlt(m_hDC, 0, 0, 480, 720, hdcPaint, 0, 0, SRCCOPY);//双缓冲机制