就是这么个东西,我需要那些函数的实现,根本无法下手,各位高手可否帮忙?
就是那些带//TODO标志的函数
我是超级菜鸟,积分才6分,各位牛人不要bs啊、
// DrawRect.cpp :void CDrawRect::ChangePoint(CSize offset)  // 更改点坐标值
{
if (m_RectPoint.GetSize()<2) return;
m_RectPoint[0] +=offset;
m_RectPoint[1] +=offset;
}BOOL CDrawRect::PtInRect(CPoint point, CRect & rect) // 判断点是否位于矩形框内
{
if (m_RectPoint.GetSize()<2) //数组下标检查
return FALSE;
rect = CRect( min(m_RectPoint[0].x,m_RectPoint[1].x), 
          min(m_RectPoint[0].y,m_RectPoint[1].y),
  max(m_RectPoint[0].x,m_RectPoint[1].x)+m_nPenWidth,
  max(m_RectPoint[0].y,m_RectPoint[1].y)+m_nPenWidth);
if (rect.PtInRect(point))
return TRUE;
return FALSE;
}
// ScbRectView类中增加
增加变量:  m_selectRect;  // 记录选中的矩形框位置参数;
m_bIsMove;   // 记录当前选择的状态(是否是移动) 
增加函数: void PreatDragRect(CPoint newPoint, CRect & LastRect);// 处理拖动
CDrawRect *GetSelect(CPoint point,CRect & rect);     // 得到选择的矩形框重要1:拖动的实现步骤
1.在OnLButtonDown中得到选择的矩形框( GetSelect(point,m_selectRect) )
2.在OnMouseMove中处理拖动(PreatDragRect(point, m_selectRect) )
3. 在OnLButtonUp中作结束处理(m_pRectCur =NULL)
注意 :用m_pRectCur 记录当前选中的文档数据(矩形框)、 m_selectRect记录矩形参数
重要2:如何实现拖动 (参void PreatDragRect(CPoint newPoint, CRect & LastRect) )
1.计算拖动的物体原来的区域LastRect ,(拖动后)新的区域newRect;
2.计算拖动前后的联合区域tempRect.UnionRect(LastRect,newRect);
3.计算联合区域在当前客户区部分:invalidRect.IntersectRect(tempRect,clientRect); 
4. 重绘部分区域:   InvalidateRect(invalidRect,TRUE); 
重要3:理解消息状态处理函数:OnUpdate??? (CCmdUI* pCmdUI)
重要4:理解如何更改文档数据:m_pRectCur->ChangePoint(offset); //运用指针
重要5:理解按地址的引用:BOOL CDrawRect::PtInRect(CPoint point, CRect & rect); 
CDrawRect *CScbRectView::GetSelect(CPoint point,CRect & rect);// 得到选择的矩形框
  void PreatDragRect(CPoint newPoint, CRect & LastRect);// 处理拖动
重要6:掌握如何添加菜单、工具条CScbRectView::CScbRectView()
{
// TODO: add construction code here
m_pRectCur = NULL;
m_selectRect = CRect(0,0,0,0);
m_bIsMove = FALSE;
}void CScbRectView::OnLButtonDown(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
SetCapture(); if (!m_bIsMove)
{
m_pRectCur = GetDocument()->NewRect(); //指向何处
m_pRectCur->m_RectPoint.Add(point);
}
else
{
m_pRectCur = GetSelect(point,m_selectRect);
}

CView::OnLButtonDown(nFlags, point);
}void CScbRectView::OnLButtonUp(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
if (GetCapture()!=this)
return;
else 
ReleaseCapture();
if (m_bIsMove)
{
m_pRectCur = NULL;
return;
} CScbRectDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (m_pRectCur!=NULL)
m_pRectCur->m_RectPoint.Add(point); Invalidate(); //通知系统绘图区无效(重绘屏幕) CView::OnLButtonUp(nFlags, point);
}void CScbRectView::OnMouseMove(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
if (m_bIsMove)
{
if ( m_pRectCur != NULL ) // 如果有选中
PreatDragRect(point, m_selectRect);
}

CView::OnMouseMove(nFlags, point);
}
void CScbRectView::PreatDragRect(CPoint newPoint, CRect & LastRect)
{
// TODO: Add your message handler code here and/or call default
CSize offset;
CRect tempRect,newRect,invalidRect,clientRect;
GetClientRect(clientRect); //获取窗口客户区
if(!clientRect.PtInRect(newPoint))
return;

offset = CSize(newPoint-LastRect.TopLeft()); // 计算移动偏移量 m_pRectCur->ChangePoint(offset);  //改变文档数据 newRect = LastRect+(CPoint(0,0)+offset);
tempRect.UnionRect(LastRect,newRect);
invalidRect.IntersectRect(tempRect,clientRect); 
InvalidateRect(invalidRect,TRUE); //窗口部分区域无效(重绘) LastRect = newRect;  //保留新的区域
}void CScbRectView::OnMoveObject() //消息处理函数
{
// TODO: Add your command handler code here
m_bIsMove = !m_bIsMove;
if (m_bIsMove)
m_pRectCur = NULL; // 保证未选择时不乱动
}void CScbRectView::OnUpdateMoveObject(CCmdUI* pCmdUI)  //消息状态处理函数
{
// TODO: Add your command update UI handler code here
// pCmdUI->Enable ( FALSE ); //是否可选择
pCmdUI->SetCheck( m_bIsMove ); //是否已选择
}

CDrawRect *CScbRectView::GetSelect(CPoint point,CRect & rect)
{
CScbRectDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc); POSITION pos=pDoc->m_RectList.GetHeadPosition();
while (pos!=NULL)
{
CDrawRect *pRect=pDoc->m_RectList.GetNext(pos);
if (pRect->PtInRect(point,rect))
return pRect;
}
return NULL;
}