现在好多截图工具都有放大的功能如图
,这个功能的原理是取当前鼠标位置点(也就是图中十字线相交的点位置)周围多少像素(这里取宽32pix,高40pix),把这区域的图片贴到如图的矩形区域内。
#define MAGNIFIERSIZE 30 //矩形大小
#define MAGNIFYINGMULTIPLE 4 //放大倍数
#define OFFSETWIDE 16 //偏离光标热点(宽)
#define OFFSETHIGH 20 //偏离光标热点(高)
void CScreenShotDlg::DrawMagnifier(CDC *pMemDC)
{
CPoint pt(0,0);
GetCursorPos(&pt);//鼠标当前的屏幕位置实现放大器跟随鼠标移动
ScreenToClient(&pt);
CPoint ptLeftTop(pt.x + OFFSETWIDE, pt.y + OFFSETHIGH);
ptLeftTop = rt.TopLeft();
CDC dcTemp;
dcTemp.CreateCompatibleDC(pMemDC);
CBitmap* pOldBitmap = dcTemp.SelectObject(m_pBitmap);//m_pBitmap保存的当前桌面的位图没有进行阿尔法合成的可以看第一章里有如何获取的或者也可以改成你想要的位图
pMemDC->StretchBlt(ptLeftTop.x, ptLeftTop.y, MAGNIFIERSIZE * MAGNIFYINGMULTIPLE, MAGNIFIERSIZE * MAGNIFYINGMULTIPLE, &dcTemp,
(pt.x - MAGNIFIERSIZE / 2), (pt.y - MAGNIFIERSIZE / 2),
MAGNIFIERSIZE,MAGNIFIERSIZE, SRCCOPY);//拉伸图片达到放大的效果
int nWidth = MAGNIFIERSIZE * MAGNIFYINGMULTIPLE;
//画中间的十字Begin
CPen pen;
pen.CreatePen(PS_SOLID, 3, RGB(0,0,255));
CPen *pOldPen = pMemDC->SelectObject(&pen);
pMemDC->MoveTo(ptLeftTop.x, ptLeftTop.y + nWidth / 2);
pMemDC->LineTo(ptLeftTop.x + nWidth, ptLeftTop.y + nWidth / 2);
pMemDC->MoveTo(ptLeftTop.x + nWidth / 2, ptLeftTop.y);
pMemDC->LineTo(ptLeftTop.x + nWidth / 2, ptLeftTop.y + nWidth);
pMemDC->SelectObject(pOldPen);
//画中间的十字End
//画边框Begin
pMemDC->SelectStockObject(NULL_BRUSH);
pMemDC->Rectangle(ptLeftTop.x, ptLeftTop.y, ptLeftTop.x + nWidth, ptLeftTop.y + nWidth);
//画边框End
dcTemp.SelectObject(pOldBitmap);
dcTemp.DeleteDC();
}
代码就是这样其实还是很简单,稍微改下就可以成为你的图片放大器。