MFC多文档框架 基于CVIEW视图类正常显示超出屏幕范围的部分(支持BCG库绘图)

  最近使用继承与CView的视图框上显示画图,视图框内的画图宽度大于4000不能完全显示,通过修改继承类为CScrollView增加进度条,拖动进度条完整显示出了整个视图框内的画图。

  首先贴上效果图
MFC多文档框架 基于CVIEW视图类正常显示超出屏幕范围的部分(支持BCG库绘图)_第1张图片

图1

MFC多文档框架 基于CVIEW视图类正常显示超出屏幕范围的部分(支持BCG库绘图)_第2张图片
图2

    上面两张图中,图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();
}

你可能感兴趣的:(MFC,CView类增加进度条,BCG绘图完整显示图像)