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