为视图窗口添加滚动条



修改继承基类

1.首先要确定Document的大小,比如400×450.可以将其大小存储在Document类中,也可以直接去设置

 

2.在代码中把public:C××View:CView中的CView改为CScrollView,以及消息映射中的CView都改掉。如果你怕出错可以将C××View.cpp和C××View.h中的CView都用查找替换为CScrollView。

 

3.这是最重要的一步,一定要给改过之后的C××View类中加入OnInitialUpdate()函数,而且得在函数中用SetScrollSizes函数去设定默认文档的大小,如SetScrollSizes(MM_TEXT, GetDocument()->GetDocSize());否则将会出现如下在Viewscrl.cpp中的134行的错误 TRACE0( "Error: must call SetScrollSizes() or SetScaleToFitSize() "); TRACE0( "/tbefore painting scroll view./n ");

 

4.至此就完成了更改基类CView到CScrollView的步骤

原文地址: http://blog.csdn.net/auto_ptr/article/details/6284572


最简单的方法是新建项目,在最后生成的类那里把CXXview的基类修改为CScrollView。

这时编译运行不会看到滚动条,为什么呢?我们不是继承了CScrollView类么?

别急,看不到滚动条是因为我们滚动视图的总大小设置太小了,而产生的视图太大,不用滚动条就能看完,要想看到滚动条你可以改变产生的视图大小,用鼠标在视图边框拖动改变大小,当足够小的时候你会发现滚动条出现了!


打开view类中的OnitialUpdata函数,vs2010里默认的视图大小是100,100像素。

SetScrollSizes用来调整滚动特性,具体可以百度百科。

修改OnitialUpdata函数,这里用到CSize。

类CSize是对Windows结构SIZE的封装,凡是能用SIZE结构的地方都可以用CSize代替。结构SIZE表示一个矩形的长度和宽度。

我们删掉函数里原有的其他语句,只留下CScrollView::OnInitialUpdate();

  1. void CtestView::OnInitialUpdate()  
  2. {  
  3.     CScrollView::OnInitialUpdate();  
  4.   
  5.     CSize sizeTotal(1000,1600);  
  6.     SetScrollSizes(MM_TEXT, sizeTotal);  
  7. }  
void CtestView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();

	CSize sizeTotal(1000,1600);
	SetScrollSizes(MM_TEXT, sizeTotal);
}

编译运行一下,滚动条在默认窗口大小下就会出现了。

这是因为SetScrollSizes方法,修改了滚动视图的总大小。也就是他的第二个参数。第一个参数是映射方法,我们默认使用MM_TEXT,关于映射大家可以自行百度,这里不多做解释。

SetScrollSizes的第三个参数是控制鼠标单击滚动条轴中的每个方向滚动的水平和垂直距离。第四个参数指定每个响应鼠标单击滚动箭头的方向滚动的水平和垂直距离。

  1. void CtestView::OnInitialUpdate()  
  2. {  
  3.     CScrollView::OnInitialUpdate();  
  4.   
  5.     CSize sizeTotal(1000,1600);  
  6.     CSize sizePage(1,1);  
  7.     CSize sizeLine(100,100);  
  8.     SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine);  
  9. }  
void CtestView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();

	CSize sizeTotal(1000,1600);
	CSize sizePage(1,1);
	CSize sizeLine(100,100);
	SetScrollSizes(MM_TEXT, sizeTotal,sizePage,sizeLine);
}


现在还是只能用鼠标来移动滚动条,我们想让键盘也能控制,就得添加消息响应,当按下任意按键时就会响应WM_KEYDOWN消息,通过类向导为view类添加此消息响应。

  1. void CtestView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)  
  2. {  
  3.     // TODO: 在此添加消息处理程序代码和/或调用默认值  
  4.     switch (nChar)  
  5.     {  
  6.     case VK_HOME:  
  7.         OnVScroll(SB_TOP,0,NULL);  
  8.         OnHScroll(SB_LEFT,0,NULL);  
  9.         break;  
  10.     case VK_END:  
  11.         OnVScroll(SB_BOTTOM,0,NULL);  
  12.         OnHScroll(SB_RIGHT,0,NULL);  
  13.         break;  
  14.     }  
  15.     CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);  
  16. }  
void CtestView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	switch (nChar)
	{
	case VK_HOME:
		OnVScroll(SB_TOP,0,NULL);
		OnHScroll(SB_LEFT,0,NULL);
		break;
	case VK_END:
		OnVScroll(SB_BOTTOM,0,NULL);
		OnHScroll(SB_RIGHT,0,NULL);
		break;
	}
	CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);
}

添加如上代码,编译运行,这是按键盘上的Home键就会执行VK_HOME中的代码,OnVscroll函数第一个参数用于指定一个指示用户的滚动请求的滚动条代码。SB_TOP是指示滚动条到顶部,第二个参数只有当第一个参数被设置为SB_THUMBPOSITION或SB_THUMBTRACK时这个参数被用来指定滚动框的位置,否者不使用此参数,我们设置为0,第三个参数设置为NULL,默认为当前窗口滚动条。

关于OnVscroll函数参见:http://www.feiesoft.com/vc/_mfc_cwnd.3a3a.onvscroll.htm

OnHscroll跟OnVScroll类似,一个管理横向一个管理纵向。


接下来我们来画一个图形试试滚动条吧。

按vc学习(一)中方法添加两个变量m_rectEllipse,m_nColor并初始化。

  1. void CtestView::OnDraw(CDC* pDC)  
  2. {  
  3.     pDC->SelectStockObject(m_nColor);  
  4.     pDC->Ellipse(m_rectEllipse);  
  5. }  
void CtestView::OnDraw(CDC* pDC)
{
	pDC->SelectStockObject(m_nColor);
	pDC->Ellipse(m_rectEllipse);
}

编译运行,Ok能用鼠标和键盘控制滚动条看到圆的不同地方了。


添加鼠标点击变色,按VC一中方法响应WM_LBUTTONDOWN消息。

  1. void CtestView::OnLButtonDown(UINT nFlags, CPoint point)  
  2. {  
  3.     // TODO: 在此添加消息处理程序代码和/或调用默认值  
  4.     CClientDC dc(this);  
  5.     CRect rectDevice = m_rectEllipse;  
  6.     if (rectDevice.PtInRect(point)) {  
  7.         if (m_nColor==GRAY_BRUSH) {  
  8.             m_nColor=BLACK_BRUSH;  
  9.         } else {  
  10.             m_nColor=GRAY_BRUSH;  
  11.         }  
  12.         InvalidateRect(rectDevice);  
  13.     }  
  14.     CScrollView::OnLButtonDown(nFlags, point);  
  15. }  
void CtestView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CClientDC dc(this);
	CRect rectDevice = m_rectEllipse;
	if (rectDevice.PtInRect(point)) {
		if (m_nColor==GRAY_BRUSH) {
			m_nColor=BLACK_BRUSH;
		} else {
			m_nColor=GRAY_BRUSH;
		}
		InvalidateRect(rectDevice);
	}
	CScrollView::OnLButtonDown(nFlags, point);
}
类CClientDC派生于CDC,在构造时调用了Windows函数GetDC,在析构时调用了ReleaseDC。这意味着和CClientDC对象相关的设备上下文 是窗口的客户区。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值