各位大虾好,小弟碰到一个很烦人的问题,新手初学MFC。
所做的程序主要是为了实现一个视图中图像放大缩小的问题,最主要的是固定ViewPortExt的大小,调整WindowExt的大小来实现。
在Doc类中设置了五个变量m_nWindowExtOrgX,m_nWindowExtOrgY,m_nWindowExtX,m_nWindowExtY,m_dRatio。 m_nWindowExtOrgX,m_nWindowExtOrgY用来保存窗口大小的初始值,m_nWindowExtX,m_nWindowExtY放大和缩小之后的值。视图大小 ViewPortExt中设置的值始终为m_nWindowExtOrgX,m_nWindowExtOrgY。m_dRatio是缩放比例。
菜单中提供两个功能,ZoomIn和ZoomOut,代码如下: C/C++ code
void CMainFrame::Zoom(double dRatio)
{
CScrollTestDoc* pDoc=(CScrollTestDoc*)GetActiveDocument();
CScrollTestView* pView=(CScrollTestView*)GetActiveView();
pDoc->m_nWindowExtX=(int)(pDoc->m_nWindowExtOrgX*dRatio);
pDoc->m_nWindowExtY=(int)(pDoc->m_nWindowExtOrgY*dRatio);
//每缩放一次就调整一次滚动条的大小,因为不知道如何去智能判断图像区域是否已经超出当前视图显示范围
//这是个没办法的办法,如果谁知道如何判断当前图形是否超出视图显示范围,还请告诉我,谢谢.
CSize sz;
sz.cx=(int)(pDoc->m_nWindowExtOrgX/dRatio);
sz.cy=(int)(pDoc->m_nWindowExtOrgY/dRatio);
pView->SetScrollSizes(MM_TEXT,sz);
Invalidate();
UpdateWindow();
}void CMainFrame::OnZoomZoomin()
{
// TODO: Add your command handler code here
CScrollTestDoc* pDoc=(CScrollTestDoc*)GetActiveDocument();
double dRatio=pDoc->m_dRatio;
//调整缩放比例
dRatio/=1.1;
pDoc->m_dRatio=dRatio;
Zoom(dRatio);
}void CMainFrame::OnZoomZoomout()
{
// TODO: Add your command handler code here
CScrollTestDoc* pDoc=(CScrollTestDoc*)GetActiveDocument();
double dRatio=pDoc->m_dRatio;
dRatio*=1.1;
pDoc->m_dRatio=dRatio;
Zoom(dRatio);
}
视图类中OnDraw函数的内容: C/C++ code
void CScrollTestView::OnDraw(CDC* pDC)
{
CScrollTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetBkMode(TRANSPARENT);
pDC->SelectStockObject(NULL_BRUSH);
pDC->SetViewportExt(pDoc->m_nWindowExtOrgX,pDoc->m_nWindowExtOrgY);
pDC->SetWindowExt(pDoc->m_nWindowExtX,pDoc->m_nWindowExtY); CPen redPen;
CPen* pOldPen=NULL;
redPen.CreatePen(PS_SOLID,0,RGB(255,0,0));
pOldPen=pDC->SelectObject(&redPen); CPoint topLeft;
CPoint bottomRight;
topLeft.x=ptCenter.x-200;
topLeft.y=ptCenter.y-200;
bottomRight.x=ptCenter.x+200;
bottomRight.y=ptCenter.y+200;
CRect rect=CRect(topLeft,bottomRight);
pDC->Ellipse(rect); pDC->SelectObject(pOldPen);
}可是运行的时候问题出现了,当我一直放大图像到图像超出了当前视图的显示范围的时候又拖动进度条发现超出视图显示的那部分不能正常显示,见图 放大的图像 拖动滚动条后的图像
请问各位如何拖动滚动条让图像能够正常的显示呢?谢谢各位了(如果可以给出代码的话更好:) )
所做的程序主要是为了实现一个视图中图像放大缩小的问题,最主要的是固定ViewPortExt的大小,调整WindowExt的大小来实现。
在Doc类中设置了五个变量m_nWindowExtOrgX,m_nWindowExtOrgY,m_nWindowExtX,m_nWindowExtY,m_dRatio。 m_nWindowExtOrgX,m_nWindowExtOrgY用来保存窗口大小的初始值,m_nWindowExtX,m_nWindowExtY放大和缩小之后的值。视图大小 ViewPortExt中设置的值始终为m_nWindowExtOrgX,m_nWindowExtOrgY。m_dRatio是缩放比例。
菜单中提供两个功能,ZoomIn和ZoomOut,代码如下: C/C++ code
void CMainFrame::Zoom(double dRatio)
{
CScrollTestDoc* pDoc=(CScrollTestDoc*)GetActiveDocument();
CScrollTestView* pView=(CScrollTestView*)GetActiveView();
pDoc->m_nWindowExtX=(int)(pDoc->m_nWindowExtOrgX*dRatio);
pDoc->m_nWindowExtY=(int)(pDoc->m_nWindowExtOrgY*dRatio);
//每缩放一次就调整一次滚动条的大小,因为不知道如何去智能判断图像区域是否已经超出当前视图显示范围
//这是个没办法的办法,如果谁知道如何判断当前图形是否超出视图显示范围,还请告诉我,谢谢.
CSize sz;
sz.cx=(int)(pDoc->m_nWindowExtOrgX/dRatio);
sz.cy=(int)(pDoc->m_nWindowExtOrgY/dRatio);
pView->SetScrollSizes(MM_TEXT,sz);
Invalidate();
UpdateWindow();
}void CMainFrame::OnZoomZoomin()
{
// TODO: Add your command handler code here
CScrollTestDoc* pDoc=(CScrollTestDoc*)GetActiveDocument();
double dRatio=pDoc->m_dRatio;
//调整缩放比例
dRatio/=1.1;
pDoc->m_dRatio=dRatio;
Zoom(dRatio);
}void CMainFrame::OnZoomZoomout()
{
// TODO: Add your command handler code here
CScrollTestDoc* pDoc=(CScrollTestDoc*)GetActiveDocument();
double dRatio=pDoc->m_dRatio;
dRatio*=1.1;
pDoc->m_dRatio=dRatio;
Zoom(dRatio);
}
视图类中OnDraw函数的内容: C/C++ code
void CScrollTestView::OnDraw(CDC* pDC)
{
CScrollTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetBkMode(TRANSPARENT);
pDC->SelectStockObject(NULL_BRUSH);
pDC->SetViewportExt(pDoc->m_nWindowExtOrgX,pDoc->m_nWindowExtOrgY);
pDC->SetWindowExt(pDoc->m_nWindowExtX,pDoc->m_nWindowExtY); CPen redPen;
CPen* pOldPen=NULL;
redPen.CreatePen(PS_SOLID,0,RGB(255,0,0));
pOldPen=pDC->SelectObject(&redPen); CPoint topLeft;
CPoint bottomRight;
topLeft.x=ptCenter.x-200;
topLeft.y=ptCenter.y-200;
bottomRight.x=ptCenter.x+200;
bottomRight.y=ptCenter.y+200;
CRect rect=CRect(topLeft,bottomRight);
pDC->Ellipse(rect); pDC->SelectObject(pOldPen);
}可是运行的时候问题出现了,当我一直放大图像到图像超出了当前视图的显示范围的时候又拖动进度条发现超出视图显示的那部分不能正常显示,见图 放大的图像 拖动滚动条后的图像
请问各位如何拖动滚动条让图像能够正常的显示呢?谢谢各位了(如果可以给出代码的话更好:) )
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货