MFC中CScrollView类的使用以及CScrollView的双缓冲绘图

<pre name="code" class="cpp">
 

前一段时间由于项目需要,研究使用了一下CScrollView类,并且利用CScrollView类的双缓冲进行绘图。下面把我的心得写出来

CScrollView这个类用于需要滚动条的场合。我们可以直接用向导生成,在选择视图类的基类时选择CScrollView即可。

这里把需要修改的地方,以及我遇到的困难及其解决方案写出来,给大家提供帮助,也便于自己查看:

如果我们的程序原来用的是CView类,此时想改成CScrollView类,需要做以下修改。

(1)把类声明中把基类CView改成CScrollView类

(2)利用ClassWizard,在CxxView中,添加成员函数:OnInitialUpdate( )

void CXXView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
 	CSize sizeTotal(1800, 1050);
    	CSize sizePage(sizeTotal.cx / 2, sizeTotal.cy / 2);
    	CSize sizeLine(sizeTotal.cx / 50, sizeTotal.cy / 50);
    	SetScrollSizes(MM_LOENGLISH, sizeTotal, sizePage, sizeLine);
}

(3)cpp中修改如下代码:
IMPLEMENT_DYNCREATE(CxxView, CScrollView)
BEGIN_MESSAGE_MAP(CxxView, CScrollView)

(4)如果在修改以上代码后,程序产生

其实这个错误只在视图最大化显示出错,原因是:原来是程序启动最大化时,视图ScrollViw出现了一个异常,需要设置SetScrollSizes() or SetScaleToFitSize() 。

解决方法:在类开时处即PreCreateWindow函数中增加SetScrollSizes(MM_TEXT, CSize(0,0))即可。


二、CScrollView的双缓冲绘图:

绘图是在OnPaint()或者OnDraw()这两个函数里面执行,当程序里面用到了OnPaint()时,OnDraw()函数将不会自动执行。

void CXXView::OnDraw(CDC* pDC)
{
	CTransitionDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CClientDC dc(this);

	CRect rc;
	GetClientRect(&rc);		//得到客户区的大小
	CPoint pt = GetScrollPosition();// 垂直滚动务

	int length = rc.bottom;
	CRect memRect;
	SetRect(&memRect,rc.left,rc.top,rc.right,length);
	
	CDC memDC;//声明缓冲CDC
	CBitmap bitmap,*pOldBitmap;
	memDC.CreateCompatibleDC(&dc);
	bitmap.CreateCompatibleBitmap(&dc,memRect.right,length);
	pOldBitmap = memDC.SelectObject(&bitmap);
	memDC.FillSolidRect(&memRect,RGB(255,255,255));
	
	//设置视图
	memDC.SetViewportOrg(-pt);
	
	//是否出现滚动条,如果绘图超出客户区,则出现滚动条,否则不出现滚动条
	CSize sizeTotal;
	sizeTotal.cx = gf_XLength*gf_ratioZoom*gf_ratio;
	sizeTotal.cy = gf_YLength*gf_ratioZoom*gf_ratio;
	SetScrollSizes(MM_TEXT, sizeTotal);

	G_ShowPltDesign(&memDC);//我自己的绘图函数,再使用双缓冲绘图之前这里是G_ShowPltDesign(pDc)
	memDC.SetViewportOrg(0,0);
	dc.BitBlt(0,0,rc.right,length,&memDC,0,0,SRCCOPY);
	memDC.SelectObject(pOldBitmap);
	memDC.DeleteDC();
	bitmap.DeleteObject();
}


 

 


  • 0
    点赞
  • 0
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值