1.由程序向导创建一个单文档程序
2.添加GDI+支持(见前文)
3.在视图类中添加如下成员
protected:
bool recover;
int d;
int s;
int oldy;
int oldx;
Bitmap* m_iBk1;//放大图
Bitmap* m_iBk2;//原始图
RectF rc;//绘图区域
4.添加WM_MOUSEMOVE消息映射
添加WM_SIZE 消息映射
添加WM_TIMER消息映射
添加WM_ERASEBKGND消息映射
5.在视图类中初始化类成员
recover=false;
oldx=0;
oldy=0;
s=30;
d=45;
HBITMAP hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), _T("res/图片名"),IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
m_iBk1 = Bitmap::FromHBITMAP(hBitmap, NULL);
m_iBk2 = Bitmap::FromHBITMAP(hBitmap, NULL);
6.在OnDraw()消息中添加
HDC hdc = ::GetDC(GetSafeHwnd());
CDC* pDC = CClientDC::FromHandle(hdc);//获取窗口DC
CDC m_dcMemory;//缓冲DC
CBitmap bmp;//缓冲位图
bmp.CreateCompatibleBitmap(pDC, rc.Width, rc.Height);//创建位图
m_dcMemory.CreateCompatibleDC(pDC);//缓冲DC初始化
CBitmap* pOldBitmap = m_dcMemory.SelectObject(&bmp);//将位图和缓存DC关联
//gdi+绘图
Graphics gh(m_dcMemory.GetSafeHdc());
//绘图代码
{
gh.DrawImage(m_iBk, rc);
}
pDC->BitBlt( 0, 0, rc.Width, rc.Height, &m_dcMemory, 0, 0, SRCCOPY);//将缓存DC的内容复制到屏幕
ReleaseDC(pDC);//只有自己创建的DC才可用DeleteDC,比如m_dcMemory
m_dcMemory.SelectObject(pOldBitmap);
m_dcMemory.DeleteDC();
DeleteObject(bmp);
7.在OnMouseMove()中添加如下代码
int dd;
CRect srect, drect, mrect;
srect.left = point.x - s;
srect.top = point.y - s;
srect.right = point.x + s;
srect.bottom = point.y + s;
drect.left = point.x - d;
drect.top = point.y - d;
drect.right = point.x + d;
drect.bottom = point.y + d;
mrect.left = oldx - d;
mrect.top = oldy - d;
mrect.right = oldx + d;
mrect.bottom = oldy + d;
Graphics gh(m_iBk);
dd = 2 * d;
if (recover)
{
gh.DrawImage(m_iBk2, RectF(mrect.left, mrect.top, dd, dd), mrect.left, mrect.top, mrect.Width(), mrect.Height(), UnitPixel);//复原
}
gh.DrawImage(m_iBk, RectF(drect.left, drect.top, drect.Width(), drect.Height()), srect.left, srect.top, srect.Width(), srect.Height(),UnitPixel);//放大
oldx = point.x;
oldy = point.y;
recover = true;
8.在OnSize()中添加如下
SetTimer(1, 10, NULL);设置计时器
RECT rect;
GetClientRect(&rect);
rc.X = rect.left;
rc.Y = rect.top;
rc.Width = rect.right - rect.left;
rc.Height = rect.bottom - rect.top;//使图像占满客户区
9.在OnTimer中添加如下
Invalidate();//刷新窗口
10,调试发现,屏幕是不是出现白屏,这是由于背景刷新造成的
我们只需将OnEraseBkgnd()消息直接返回true就可以了