我想利用双缓冲实现绘图,但有个问题。
我的绘图先载入一张比窗口小的图片,再在图片以外的区域画图之类的,我应该如何操作呢?
GetObject(hBitmap, sizeof(BITMAP), &bitmap) ;//得到要载入的图片
hMemDC = CreateCompatibleDC(dc) ;//创建memdc
SelectObject( hMemDC, hBitmap );//这里怎么办?memdc的大小好像已经固定了,其他地方没法画了。
我想先不把图片选进memdc,而是为它创建一个更大的hbitmap,但以后该怎么载入图片呢?

解决方案 »

  1.   

    CDC *pDC = pView->GetDC(); 
    CDC MemDC ;
    MemDC.CreateCompatibleDC(pDC);
    CRect rect; 
    pView->GetClientRect(&rect);//获取窗口矩形
        CBitmap bmp; //内存中承载临时图象的位图 
    // bmp.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());//创建兼容位图 
    bmp.CreateCompatibleBitmap(pDC,pView->tPt.x-pView->sPt.x,pView->tPt.y-pView->sPt.y);//创建兼容位图 
    CBitmap *pOldBitmap=MemDC.SelectObject(&bmp); //将位图选择进内存DC 
    可以参考下,然后再修改
      

  2.   

    你用的是GDI而不是GDI+吧?一个窗口一个DC 而DC可以进行不同的操作 提个方法 你可以先画大背景 后面某个地方要贴什么图 继续用DC画在你指定的区域 
     给你一个双缓冲的例子 是用GDI+做的
              CRect  rtAllWindow;
     GetClientRect(rtAllWindow);
     CPaintDC dc(this);
     Bitmap bmp(rtAllWindow.Width(),rtAllWindow.Height());
     Graphics memDC(&bmp);
             memDC.DrawImage(贴张全屏的图)
              memDC.DrawImage(在指定区域贴你的图片)
              .
             .
             .
             .
    想画多少个都行 图片的画可以先都加载进来
      

  3.   

    双缓冲DC创建backDC应该是和显示dc一样大小的吧
    GetClientRect(&rect);
    backDC = new CDC;
    backDC->CreateCompatibleDC(dc);
    backBitmap = new CBitmap;
    backBitmap->CreateCompatibleBitmap(dc, rect.cx, rect.cy);
    backDC->SelectObject(backBitmap);
    画bitmap应该再创建一个memdc
    CDC memDC = new CDC;
    memDC->CreateCompatibleDC(dc);
    GetObject(hBitmap, sizeof(BITMAP), &bitmap);
    SelectObject( memDC, hBitmap );
    backDC->bitblt(memDC, .....);
    backDC上还可以画其他的内容
    最后将backDC直接显示出来,或是dc->bitblt(backDC,.....);