最近使用继承与CView的视图框上显示画图,视图框内的画图宽度大于4000不能完全显示,通过修改继承类为CScrollView增加进度条,拖动进度条完整显示出了整个视图框内的画图。
首先贴上效果图:
上面两张图中,图1宽度在3000像素点左右,图2宽度在4000像素点左右,并且在进度条拉动时图像没发生变化,下面贴上具体做法:
1.继承的CView类修改为CScrollView:
//修改所有CView 为CScrollView
.h文件修改:
class TestView : public /*CView*/CScrollView
.cpp文件修改:
IMPLEMENT_DYNCREATE(CTestView, /*CView*/CScrollView)
BEGIN_MESSAGE_MAP(CTestView, /*CView*/CScrollView)
2.增加部分用到的虚函数:
VS2010中虚函数添加方式:
在视图类->自己用到的类(示例是CTestView)->属性->重写->找到下面指定虚函数并且添加
//OnDraw
virtual void OnDraw(CDC* pDC);
//OnInitialUpdate
virtual void OnInitialUpdate();
//OnPrepareDC
virtual void OnPrepareDC(CDC* pDC, CPrintInfo* pInfo = NULL);
3.添加代码达到目标效果:
⒈在构造函数内默认指定进度条的范围(防止调用这个类时弹出警告)
CTestView::CTestView()
{
CSize size;
size.cx = size.cy = 4000;
SetScrollSizes(MM_TEXT,size); //窗口大小初始化
// TODO: add construction code here
}
⒉在OnInitialUpdate函数中指定进度条的范围(或者OnDraw中指定也可以)
void TestView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal(6000, 1050);
SetScrollSizes(MM_TEXT, sizeTotal);
CFieldTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
}
⒊在OnPrepareDC函数中指定CView为基类(如果不指定CView为基类,图像显示不完整)
void CFieldTestView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: 在此添加专用代码和/或调用基类
CView::OnPrepareDC(pDC, pInfo);
}
⒋在OnDraw函数中指定刷新对话框大小
void CFieldTestView::OnDraw(CDC* pDC)
{
CFieldTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//获取当前的滚动窗口坐标
CPoint _point = GetScrollPosition();
//设置视图框的当前位置
pDC->OffsetViewportOrg(-_point.x,-_point.y);
}
特别说明:在OnDraw函数中指定刷新对话框大小(使用BCG库绘图的情况,如果没用到BCG库这一步不用操作)
void CFieldTestView::OnDraw(CDC* pDC)
{
CFieldTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
//获取当前的滚动窗口坐标
CPoint _point = GetScrollPosition();
//设置视图框的当前位置
pDC->OffsetViewportOrg(-_point.x,-_point.y);
//更新BCG库调用的视图框大小
CRect rectClient;
GetClientRect(&rectClient);
rectClient.right += _point.x;
rectClient.bottom += _point.y;
m_pGM->BindDC(pDC, rectClient);
if (!m_pGM->BeginDraw())
{
return;
}
m_pGM->Clear();
//在这里调用需要调整的视图函数
m_pGM->EndDraw();
}