MFC单文档绘图(三)——滚动条、鼠标指针
来源:互联网 发布:复旦大数据考研科目 编辑:程序博客网 时间:2024/05/12 20:47
由于之前建的项目的View类是继承CView基类的,所以如大多数文章描述的,把所有的CView替换成CScrollView,但是替换之后出现错误:viewscrl.cpp line:396 Debug Assertion Failed错误。经过调试定位后发现需要对滚动条初始化。在项目View类中添加的OnInitialUpdate函数和构造函数中添加初始化代码:
void CCADProjectView::OnInitialUpdate(){CScrollView::OnInitialUpdate();//初始化滚动条CSize sizeTotal;// TODO: 计算此视图的合计大小sizeTotal.cx = sizeTotal.cy = 10000;SetScrollSizes(MM_TEXT, sizeTotal);//设置初始位置CRect re;GetClientRect(&re);this->SetScrollPos(SB_HORZ, 5000 - re.Width() / 2);this->SetScrollPos(SB_VERT, 5000 - re.Height() / 2);}
CCADProjectView::CCADProjectView(){<span style="white-space:pre"></span>……//初始化滚动条CSize sizeTotal;// TODO: 计算此视图的合计大小sizeTotal.cx = sizeTotal.cy = 10000;SetScrollSizes(MM_TEXT, sizeTotal);}
添加完滚动条后你会发现,最容易想到的是获取当前滚动条所在位置,然后做对应的变换,根据鼠标取点来进行绘图。但是,在View中绘图会出现坐标错位的问题,而在OnDraw中重绘之后恢复正常。这个问题是由于逻辑坐标和设备坐标导致的,当滚动条在最顶端的时候,逻辑坐标和设备坐标是一致的(逻辑坐标和设备坐标之间的设置有关,默认情况下是一致的),绘图不会出现问题,而随着滚动条滚动,逻辑坐标和设备坐标之间的差别越来越大,导致出现错位。
而OnDraw不会出现的原因在于系统调用了OnPrepareDC函数进行了视窗调整,所以在调用GetScrollPosition获取滚动条位置之前需要调用OnPrepareDC进行调整,使获取到的滚动条的位置恰好是当前视图区域的左上角,从而根据鼠标消息进行绘图。
鼠标指针相对容易,主要是调用SetCursor函数进行设置,关键在于如何防止指针切换时闪烁的问题。
解决方法一:重载PreCreateWindow 函数,添加
if (cs.lpszClass == NULL) cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS);
在OnMouseMove中修改指针形状。
0 0
- MFC单文档绘图(三)——滚动条、鼠标指针
- MFC单文档绘图(一)——窗体分割
- MFC单文档绘图(二)——TabCtrl和CPropertySheet
- MFC单文档绘图(四)——进度条、禁止程序多开
- MFC单文档下OpenGL绘图(一)
- MFC单文档应用程序基础训练——文本输出、绘图等
- MFC单文档程序 双缓冲绘图
- MFC文档(SDI)应用:绘图程序(画圆、画线、鼠标事件)
- mfc 垂直滚动条添加,并响应鼠标滑轮消息
- MFC鼠标绘图
- MFC简单绘图(三)
- javascript鼠标指针拖动滚动条加载板块
- CSS样式——文本、链接、鼠标、滚动条、背景
- C# 在滚动窗口中绘图(滚动条原理)
- MFC让文档/视图结构程序支持滚动条
- MFC让文档/视图结构程序支持滚动条
- MFC让文档/视图结构程序支持滚动条
- MFC让文档/视图结构程序支持滚动条
- socket连接和http连接的区别
- C文件读写函数介绍
- 使用NFS作为根文件系统来启动
- 佛顶骨佛顶骨到付股份的股份的广泛地高丰东股份的
- 黑马程序员----面向对象基本概念以及三大特性
- MFC单文档绘图(三)——滚动条、鼠标指针
- 小团队的适应与磨合
- 大概的范甘迪发
- 快速排序的随机化版本
- poj 1861 Network(最小生成树)
- vc调用webservice
- hdu2276 矩阵构造
- 关于div的总结(新手~)
- 马云最新讲话,透露移动电商雄心