使用CRectTracker类进行对象动态定位(二)
来源:互联网 发布:天际网络网关登录器 编辑:程序博客网 时间:2024/06/14 21:07
步骤五:使用AppWizard为CExamTrackerView增加WM_LBUTTONDOWN处理消息,在函数中我们必须处理三种情况;鼠标选中矩形对象但是不处于矩形边界,这种情况仅仅是对矩形进行移动,第二种情况:鼠标处于矩形边界,这时候拖动鼠标将会调整矩形的大小.第三种情况时鼠标没有选中矩形的任何地方,这个时候将会产生橡皮条效果,橡皮条内的所有内容被选中.具体代码如下:
void CExamTrackerView::OnLButtonDown(UINT nFlags, CPoint point)
{
CExamTrackerDoc* pDoc = GetDocument();
CRect rectSave;
//获取图形区域矩形对象的大小
pDoc->m_tracker.GetTrueRect(rectSave);
//如果没有点中图形,这时候HitTest将返回-1.这时候产生橡皮条.
if (pDoc->m_tracker.HitTest(point) < 0)
{
CRectTracker tracker;
//画橡皮擦
if (tracker.TrackRubberBand(this, point, pDoc->m_bAllowInvert))
{
// 下面的工作将用来检查橡皮条的矩形是否与图形区域的矩形相交.
CRect rectT;
//对橡皮条的矩形进行校正.
tracker.m_rect.NormalizeRect(); // so intersect rect works
//橡皮条区域与图形区域的交叉区域不为空,则将图形区域的调整句柄进行相应
//的设置
if (rectT.IntersectRect(tracker.m_rect, pDoc->m_tracker.m_rect))
{
//如果调整句柄位于矩形内部(resizeInside)则将调整句柄设置在矩形的外
//部(resizeOutside)
if (pDoc->m_tracker.m_nStyle & CRectTracker::resizeInside)
{
//去除resizeInside 形式
pDoc->m_tracker.m_nStyle &= ~CRectTracker::resizeInside;
//设置resizeOutside形式
pDoc->m_tracker.m_nStyle |= CRectTracker::resizeOutside;
}
//否则如果调整句柄在外部就将调整句柄放在区域内部
else
{
// just use inside resize handles on first time
pDoc->m_tracker.m_nStyle &= ~CRectTracker::resizeOutside;