橡皮筋CRectTracker使用心得

CRectTracker被称作“橡皮筋”,是我们再窗口编辑中,选中对象,进一步操作的基础。橡皮筋有两种方法:一、手写橡皮筋,这个在程序中控制也比较好,二、使用CRectTracker系统类。在这我介绍使用CRectTracker。CRectTracker具体的参数和使用大家可以参考CSDN。我主要介绍基本的自己的程序中使用到情况。

首先在XXXView类中新建一个成员变量:

  1. CRectTracker m_tracker;  
CRectTracker m_tracker;

其次在XXXView类的构造函数设置橡皮筋的属性

  1. m_tracker.m_nStyle =CRectTracker::resizeInside|CRectTracker::dottedLine;    
  2. m_tracker.m_rect = CRect(-1, -1, -1, -1);  
	m_tracker.m_nStyle =CRectTracker::resizeInside|CRectTracker::dottedLine;  
	m_tracker.m_rect = CRect(-1, -1, -1, -1);

m_nStyle是设置橡皮筋的类型,具体类型有:

CRectTracker::solidLine   Use a solid line for the rectangle border.

CRectTracker::dottedLine   Use a dotted line for the rectangle border.

CRectTracker::hatchedBorder   Use a hatched pattern for the rectangle border.

CRectTracker::resizeInside   Resize handles located inside the rectangle.

CRectTracker::resizeOutside   Resize handles located outside the rectangle.

CRectTracker::hatchInside   Hatched pattern covers the entire rectangle.

m_rect则设置初始橡皮筋的大小(矩形),由于我在程序中要求根据鼠标点击选中对象,故初始为(-1, -1, -1, -1)即不可见。

昨晚初始工作后,要在程序中得到橡皮筋,仅仅需要响应鼠标左击事件OnLButtonDown(UINT nFlags, CPoint point)。如下面所示代码:

  1. //此代码参考某一高手修改所写    
  2.            int nIn = m_tracker.HitTest(point); //看看点到了哪了   
  3.     if(nIn<0)  //不在四边形区域内;   
  4.     {  
  5.         m_tracker.m_rect.SetRectEmpty();  
  6.         Invalidate();   
  7.     }  
  8.     else         //在四边形区域内:   
  9.     {  
  10.         CClientDC dc(this);  
  11.         m_tracker.Draw(&dc);  
  12.         m_tracker.Track(this,point,TRUE);  
  13.         // Track()是CRectTracker中最富魅力的函数。它时时的改变调用者的m_rect;          
  14.         OnPrepareDC(&dc);  
  15.   
  16.         CPoint pt_end;//以下代码是考虑SCRollView,记录坐标的逻辑位置   
  17.         GetCursorPos(&pt_end);  
  18.         rect.right=pt_end.x;  
  19.         rect.bottom=pt_end.y;  
  20.         ScreenToClient(&rect);  
  21.         pt_end.x=rect.right;  
  22.         pt_end.y=rect.bottom;  
  23.         if(pt_end!=m_pt) // 手动调用LBUTTONUP;其实也可以不调用也完成了橡皮筋的移动。但我程序需要继续处理   
  24.             SendMessage(WM_LBUTTONUP);  
  25.         Invalidate();  
  26.     }  
//此代码参考某一高手修改所写	
           int nIn = m_tracker.HitTest(point); //看看点到了哪了
	if(nIn<0)  //不在四边形区域内;
	{
		m_tracker.m_rect.SetRectEmpty();
		Invalidate(); 
	}
	else         //在四边形区域内:
	{
		CClientDC dc(this);
		m_tracker.Draw(&dc);
		m_tracker.Track(this,point,TRUE);
		// Track()是CRectTracker中最富魅力的函数。它时时的改变调用者的m_rect;		
		OnPrepareDC(&dc);

		CPoint pt_end;//以下代码是考虑SCRollView,记录坐标的逻辑位置
		GetCursorPos(&pt_end);
		rect.right=pt_end.x;
		rect.bottom=pt_end.y;
		ScreenToClient(&rect);
		pt_end.x=rect.right;
		pt_end.y=rect.bottom;
		if(pt_end!=m_pt) // 手动调用LBUTTONUP;其实也可以不调用也完成了橡皮筋的移动。但我程序需要继续处理
			SendMessage(WM_LBUTTONUP);
		Invalidate();
	}

在响应WM_LBUTTONUP鼠标放开事件,可以加自己想处理的代码。这样就能很完整的使用CRectTracker类。

 

 

在这也推荐一个更加详细,具体使用的好例子

http://www.vckbase.com/vckbase/vckbase10/vc/nonctrls/misc_21/1021002.htm

 

原文 http://blog.csdn.net/fjchenjinqi/article/details/6748041

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值