11.4.3 CRectTracker类的应用实例(2)
【代码解析】
第3、4行获取当前鼠标与橡皮筋区域的坐标关系。当鼠标在橡皮筋区域以外,则在第6~11行绘制一个临时的橡皮筋区域。如果鼠标在橡皮筋区域内或橡皮筋区域的边框上,则在第15行绘制橡皮筋区域,并在第17行让橡皮筋区域捕获鼠标。此时可以将鼠标移到橡皮筋区域内按下鼠标左键,然后拖动橡皮筋区域,如图11.16所示。也可将鼠标移到橡皮筋边框上改变橡皮筋区域的大小,如图11.17所示。
图中虚线是当前的橡皮筋区域,实线框是移动或缩放后的橡皮筋区域。这个实线框会随着鼠标的移动而变化。
|
| 图11.16 移动 |
|
| 图11.17 缩放 |
(6)以上实现的橡皮筋类,可以移动并缩放橡皮筋框。但是什么时候移动橡皮筋框,什么时候缩放橡皮筋框,对用户来说并没有明显的标识。因此当鼠标移进橡皮筋框时,将鼠标光标变为十字形,如图11.18所示。而当鼠标移到橡皮筋边框上对橡皮筋进行缩放时,将鼠标变为双箭头,如图11.19所示。
|
| 图11.18 移动时的十字形光标 |
|
| 图11.19 缩放时的双箭头光标 |
这个功能的实现需要重载视图类的OnSetCursor()函数,实现如下:
- 01 BOOL CTestCRectTrackerView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT
- message)
- 02 {
- 03 CTestCRectTrackerDoc* pDoc = GetDocument();
- 04 ASSERT_VALID(pDoc);
- 05 if (pWnd == this && pDoc->m_rectTracker.SetCursor(this, nHitTest))
- 06 { //开始捕获键盘消息
- 07 return TRUE;
- 08 }
- 09 return CView::OnSetCursor(pWnd, nHitTest, message);
- 10 }
在该函数中调用m_rectTracker的SetCursor()函数来设置橡皮筋区域的光标。而其他区域的光标则调用CView的OnSetCursor()函数来设置。