我要把一副图从一个矩形区域拷贝到另一个矩形区域,不用StretchBlt()函数(因为用了它会导致我的图片闪烁),请问有什么好的办法?

解决方案 »

  1.   

    采用双缓冲:类似关键代码如下: RECT displayRect;
    GetDlgItem(IDC_STATIC)->GetWindowRect(&displayRect); CDC *pDC=CDC::FromHandle(::GetDC(GetDlgItem(IDC_STATIC)->GetSafeHwnd()));
    CDC   MemDC;   //首先定义一个显示设备对象   
    CBitmap   MemBitmap;//定义一个位图对象   
    //随后建立与屏幕显示兼容的内存显示设备   
    MemDC.CreateCompatibleDC(NULL);   
    //这时还不能绘图,因为没有地方画   ^_^   
    //下面建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小   
    MemBitmap.CreateCompatibleBitmap(pDC,displayRect.right-displayRect.left, displayRect.bottom-displayRect.top);   
    //将位图选入到内存显示设备中   
    //只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上   
    CBitmap   *pOldBit=MemDC.SelectObject(&MemBitmap);   
    //先用背景色将位图清除干净,这里我用的是白色作为背景   
    //你也可以用自己应该用的颜色   
    MemDC.FillSolidRect(0,0,displayRect.right-displayRect.left, displayRect.bottom-displayRect.top,RGB(255,255,255));   


    //绘图
    RECT tmpRect;
                    // 。 MemDC.Rectangle(&tmpRect); //
    tmpStr = _T("jjj");
    MemDC.TextOut(400, 310, tmpStr);       
    //将内存中的图拷贝到屏幕上进行显示   
    pDC->BitBlt(0,0,displayRect.right-displayRect.left, displayRect.bottom-displayRect.top,&MemDC,0,0,SRCCOPY);   
    //绘图完成后的清理   
    MemBitmap.DeleteObject();   
    MemDC.DeleteDC();   
    ReleaseDC(pDC);   CDialog::OnPaint();