我想在指定的客户区rcDst(例如rect大小为(0,0,100,100))缩放显示位图rcSrc(例如rect大小为(0,0,50,50)),结果显示出现了问题:向上滚动窗口图像却向下滚动,但没有上下颠倒。而且如果进行缩小显示的时候,不能显示。
部分代码如下:
BOOL CDibImage::ImShow(CDC *pDC, const CRect *rcDst, const CRect *rcSrc)
{
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CBitmap bitmap;
bitmap.Attach(m_hBitmap);
CBitmap* pOldBmp = MemDC.SelectObject(&bitmap);

    CPalette pal;
pal.Attach(m_Pal);
CPalette* pOldPal = pDC->SelectPalette(m_pPalette, TRUE);
    pDC->RealizePalette(); CBrush brush(GetSysColor(COLOR_WINDOW));
CBrush* oldbrush = pDC->SelectObject(&brush);
CPen pen(PS_SOLID,1,GetSysColor(COLOR_WINDOW));
    CPen* oldpen = pDC->SelectObject(&pen);
BOOL bSuccess;/* if ((RECTWIDTH(rcDst)  == RECTWIDTH(rcSrc)) &&(RECTHEIGHT(rcDst) == RECTHEIGHT(rcSrc)))
bSuccess = pDC->BitBlt(rcDst->left,rcDst->top,rcDst->Width(),rcDst->Height(),&MemDC,rcSrc->left,rcSrc->top,SRCCOPY);
else
*/ bSuccess = pDC->StretchBlt(rcDst->left,rcDst->top,rcDst->Width(),rcDst->Height(), &MemDC,rcSrc->left,rcSrc->top,rcSrc->Width(),rcSrc->Height(),SRCCOPY);

MemDC.SetMapMode(pDC->GetMapMode());
MemDC.SetWindowExt(pDC->GetWindowExt());
MemDC.SetViewportExt(pDC->GetViewportExt());
MemDC.SetWindowOrg(rcDst->left, rcDst->top);

MemDC.SelectObject(pOldBmp);
pDC->SelectPalette(pOldPal, TRUE);
bitmap.Detach();
pal.Detach();
return bSuccess;
}偶是菜鸟啦,第一次接触内存DC绘图,还望高手来挣分啦!!

解决方案 »

  1.   

    我也想挣啊,,
    MemDC.SetMapMode(pDC->GetMapMode());
    MemDC.SetWindowExt(pDC->GetWindowExt());
    MemDC.SetViewportExt(pDC->GetViewportExt());
    MemDC.SetWindowOrg(rcDst->left, rcDst->top);把这些去掉试试,,为什么要用这个?
    你把坐标都给改了,我估计是这个问题!有些时候确实需要这么做,但是只显示个图片用不着!
      

  2.   

    To 飞蛾扑火,不是那个毛病,我试过了,去掉也不行。那几句话好像也没什么用。我在想是不是与Bitmap的坐标原点在左下角有关系了?但是StretchBlt函数的坐标都是逻辑坐标啊
      

  3.   

    我的本意是这样的:对于一些比较大(3000*2000)的图像,放大10倍以上的时候,重绘整个ScrollView会很长时间,所以我想根据客户区的大小和ScrollView的位置,计算出应该显示图像的哪个部分,再进行放大显示。不知哪位高手有更好的想法或源码。在此谢过各位,分数不够可以再加!!
      

  4.   

    1.单看你上面的代码是没什么问题,可能是你传入CDibImage::ImShow的rcDest和rcSrc在计算上出了问题。2.这几行代码确实没什么用。
    MemDC.SetMapMode(pDC->GetMapMode());
    MemDC.SetWindowExt(pDC->GetWindowExt());
    MemDC.SetViewportExt(pDC->GetViewportExt());
    MemDC.SetWindowOrg(rcDst->left, rcDst->top);3.
    "对于一些比较大(3000*2000)的图像,放大10倍以上的时候,重绘整个ScrollView会很长时间,所以我想根据客户区的大小和ScrollView的位置,计算出应该显示图像的哪个部分,再进行放大显示。"这个想法没什么问题,你的问题可能出现在1中。
      

  5.   

    To 牙医:谢谢!我也怀疑我的坐标出了问题,能否具体说一下应该怎样选取坐标?譬如说怎样把DIB的某一部分显示在指定区域?万分感激,分数致谢!
      

  6.   

    to 飞蛾扑火:我现在是不是就使用了双缓存?原来的是直接往显示DC写StretchDIBits。我想如果先在内存DC里写StretchBlt,然后再BitBlt到显示DC是不是更慢了?偶是菜鸟啦,帮帮忙!!