位图局部放大的闪烁问题——不要刷新“结果区域”
让我苦恼数日的,对图片局部放大会有闪烁的问题解决了,解决的指导思想就是:不刷新那块显示放大结果的区域。
源代码不是我写的,但是我改好的。直接贴过来:
/以下为局部放大功能代码
VC代码
///
// 以下为局部放大功能代码
else if ( 3 == m_drawType)
{
srect.left = point.x - s; // 原始区域,s(source)
srect.top = point.y - s;
srect.right = point.x + s;
srect.bottom = point.y + s;
drect.left = point.x - d; // 放大后的区域,d(destination)
drect.top = point.y - d;
drect.right = point.x + d;
drect.bottom = point.y + d;
mrect.left = oldx - d; // mrect我就不大清楚啥意思了
mrect.top = oldy - d;
mrect.right = oldx + d;
mrect.bottom = oldy + d;
dd = 2 * d; // 显示放大结果的正方形区域的边长
/ // 计算放大区域
CDC * pDC = GetDC();
// 放大图像
if (recover)
{
pmap = bitmap.FromHandle(hBitmap);
MemDC.SelectObject(pmap);
CRect rect;
GetClientRect( & rect);
pDC -> BitBlt( 0 , 0 ,point.x - d,rect.Height(), // 恢复原图左侧
& MemDC, 0 , 0 ,SRCCOPY);
pDC -> BitBlt(point.x + d, 0 ,rect.Width() - point.x - d,rect.Height(), // 恢复原图右侧
& MemDC,point.x + d, 0 ,SRCCOPY);
pDC -> BitBlt(point.x - d, 0 , 2 * d,point.y - d, // 恢复原图上侧
& MemDC,point.x - d, 0 ,mana);
pDC -> BitBlt(point.x - d,point.y + d, 2 * d,rect.Height() - point.y - d, // 恢复原图下侧
& MemDC,point.x - d,point.y + d,mana);
recover = FALSE;
}
pmap = bitmap.FromHandle(hBitmap); // 此处为其他变换函数出口,可在其他变换基础上局部放大
MemDC.SelectObject(pmap);
pDC -> StretchBlt(drect.left,drect.top, // 放大
drect.Width(),drect.Height(), & MemDC,srect.left,
srect.top,srect.Width(),srect.Height(),SRCCOPY);
oldx = point.x;
oldy = point.y;
ReleaseDC(pDC);
recover = TRUE;
}
else if ( 3 == m_drawType)
{
srect.left = point.x - s; // 原始区域,s(source)
srect.top = point.y - s;
srect.right = point.x + s;
srect.bottom = point.y + s;
drect.left = point.x - d; // 放大后的区域,d(destination)
drect.top = point.y - d;
drect.right = point.x + d;
drect.bottom = point.y + d;
mrect.left = oldx - d; // mrect我就不大清楚啥意思了
mrect.top = oldy - d;
mrect.right = oldx + d;
mrect.bottom = oldy + d;
dd = 2 * d; // 显示放大结果的正方形区域的边长
/ // 计算放大区域
CDC * pDC = GetDC();
// 放大图像
if (recover)
{
pmap = bitmap.FromHandle(hBitmap);
MemDC.SelectObject(pmap);
CRect rect;
GetClientRect( & rect);
pDC -> BitBlt( 0 , 0 ,point.x - d,rect.Height(), // 恢复原图左侧
& MemDC, 0 , 0 ,SRCCOPY);
pDC -> BitBlt(point.x + d, 0 ,rect.Width() - point.x - d,rect.Height(), // 恢复原图右侧
& MemDC,point.x + d, 0 ,SRCCOPY);
pDC -> BitBlt(point.x - d, 0 , 2 * d,point.y - d, // 恢复原图上侧
& MemDC,point.x - d, 0 ,mana);
pDC -> BitBlt(point.x - d,point.y + d, 2 * d,rect.Height() - point.y - d, // 恢复原图下侧
& MemDC,point.x - d,point.y + d,mana);
recover = FALSE;
}
pmap = bitmap.FromHandle(hBitmap); // 此处为其他变换函数出口,可在其他变换基础上局部放大
MemDC.SelectObject(pmap);
pDC -> StretchBlt(drect.left,drect.top, // 放大
drect.Width(),drect.Height(), & MemDC,srect.left,
srect.top,srect.Width(),srect.Height(),SRCCOPY);
oldx = point.x;
oldy = point.y;
ReleaseDC(pDC);
recover = TRUE;
}