方法一:在OnDraw函数中修改
void Cimage2View::OnDraw(CDC* pDC)
{
Cimage2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
CRect rectClient;
this->GetClientRect(rectClient);
int nWidth = rectClient.Width();
int nHeight = rectClient.Height();
CDC memDC; //定义一个显示设备对象
CBitmap bmp; //定义一个位图对象
memDC.CreateCompatibleDC(pDC); //建立与屏幕显示兼容的内存显示设备
bmp.CreateCompatibleBitmap(pDC,nWidth,nHeight); //建立一个与屏幕显示兼容的位图
memDC.SelectObject(&bmp); //将位图选入到内存显示设备中
memDC.FillSolidRect(rectClient,RGB(255,255,255));
if(outImage.IsValid())
outImage.Draw(memDC,-m_nPosX,-m_nPosY,int(Width * m_Scale),int(Height * m_Scale));
else
{
if(image.IsValid())
image.Draw(memDC,-m_nPosX,-m_nPosY,int(Width * m_Scale),int(Height * m_Scale));
}
//将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0,0,nWidth,nHeight,&memDC,0,0,SRCCOPY);
//绘图完成后的清理
bmp.DeleteObject();
memDC.DeleteDC();
}
之后一定要重载OnEraseBkgnd(CDC* pDC)函数,不然图像刷新依然会闪。
BOOL Cimage2View::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
return TRUE;
// return CScrollView::OnEraseBkgnd(pDC);
}
然后在OnPaint()函数中将OnPrepareDC(&dc);语句去掉,不然图像滚动会出现错误。
之后重载OnVScroll,OnHScroll,OnMouseWheel三个函数。函数放在文章最后。
方法二:在OnPaint()函数中修改
void Cimage2View::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CScrollView::OnPaint()
RECT ClipBox;
dc.GetClipBox(&ClipBox);
HDC hDC = dc.GetSafeHdc();
HDC hMemDC = ::CreateCompatibleDC(hDC);//创造兼容HDC
HBITMAP Bitmap = ::CreateCompatibleBitmap(hDC, ClipBox.right - ClipBox.left, ClipBox.bottom - ClipBox.top);
HBITMAP OldBitmap = (HBITMAP)::SelectObject(hMemDC, Bitmap);
::SetWindowOrgEx(hMemDC, ClipBox.left, ClipBox.top, NULL);
CDC MemDC;
MemDC.Attach(hMemDC);
OnDraw(&MemDC);
::BitBlt(hDC, ClipBox.left, ClipBox.top, ClipBox.right - ClipBox.left,ClipBox.bottom - ClipBox.top, hMemDC, ClipBox.left, ClipBox.top, SRCCOPY);
::SelectObject(hMemDC, OldBitmap);
::DeleteObject(Bitmap);
::DeleteDC(hMemDC);
}
然后在OnDraw()函数中写画图的函数;
之后依然要重载OnEraseBkgnd(CDC* pDC)函数,不然图像刷新依然会闪。
BOOL Cimage2View::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
return TRUE;
// return CScrollView::OnEraseBkgnd(pDC);
}
之后重载OnVScroll,OnHScroll,OnMouseWheel三个函数。
样例:
void Cimage2View::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
BOOL bHasHorzBar,bHasVertBar;
CheckScrollBars(bHasHorzBar,bHasVertBar);
if(!bHasVertBar)
return;
//获取滚动条位置
m_nPosY = GetScrollPosition().y;
//刷新视图
Invalidate(TRUE);
CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}