CRectTracker(橡皮筋)类的使用

                                                           CRectTracker(橡皮筋)类的使用

CRectTracker(俗称橡皮筋类)是一个非常有意思的类。你在Windows中,在桌面上用鼠标拖拽,便可以看到一个虚线的矩形框,它便是橡皮筋.它可以用做显示边界,你也可以扽它的八个角用来放大缩小,做框选使用。如何通过编程来实现这种功能呢?这就是CRectTracker类的作用;

介绍橡皮筋类前,先介绍其他两个类:

1 Cpoint Point类,cpoint.x   cpoint.y,作为屏幕上的坐标上的xy 轴的坐标。

2 CRect,既矩形类。

crect.left   crect.bottom   crect.top   crect.right

Crect::setrect(crect.left, crect.top, crect.right,crect.bottom);

CrectTracker 类成员:

数据成员:(摘自msdn 2000,省略了一些)

1. m_rect

当前橡皮筋矩形的矩形框的位置

2. m_sizeMin

决定橡皮筋矩形的最新的长和宽

3.m_nStyle

橡皮筋矩形的形式 如:

CRectTracker::solidLine    用实线标记矩形框

CRectTracker::dottedLine 虚线

CRectTracker::hatchedBorder 影阴线

CRectTracker::resizeInside   改变大小的句柄在橡皮筋矩形框内部(点在橡皮筋矩形框

里面来改变大小)

CRectTracker::resizeOutside 改变大小的句柄在橡皮筋矩形框外部

CRectTracker::hatchInside 影阴线布满总个矩形框

成员函数:

1.void Draw( CDC* pDC ) const;

这个函数用来划矩形框的边框和内部区域。

2.void GetTrueRect( LPRECT lpTrueRect ) const;

这个函数用来换回矩形框的 矩形坐标,参数为CRECT类型,返回矩形

3.int HitTest( CPoint point ) const;

当你鼠标被按下的时候,你可以调用这个函数,它将返回鼠标点在了矩形框的什么位置:可以看出,返回值如果大于等于零则在四边形区域之内。如果小于则说明不在区域范围之内。

      CRectTracker::hitNothing  –1:         没有点击任何地方
     CRectTracker::hitTopLeft  0
           点击调整标记的左上角
     CRectTracker::hitTopRight  1
        点击调整标记的右上角
     CRectTracker::hitBottomRight  2
     点击调整标记的右下角
     CRectTracker:hitBottomLeft  3
    点击调整标记的左下角
     CRectTracker:hitTop  4
:     点击调整标记的上方
     CRectTracker:hitRight  5
:      点击调整标记的右方
     CRectTracker:hitBottom  6
:    点击调整标记的下方
     CRectTracker:hitLeft  7
:      点击调整标记的左方
     CRectTracker:hitMiddle  8
:      点击调整标记的中央


4.BOOL SetCursor( CWnd* pWnd, UINT nHitTest ) const;

调用这个函数用来 当鼠标放在矩形框时,显示各种鼠标形象

5.BOOL Track( CWnd* pWnd, CPoint point, BOOL bAllowInvert = FALSE, CWnd* pWndClipTo = NULL );

这个函数用来显示当人们用鼠标改变矩形框大小 拖拽矩形框时显示矩形框动作

一般由WM_LBUTTONDOWN 消息来触发这个函数, 不需要编写MouseMove函数,矩形框它就自动的变大小了呢?这就是Track()函数的功劳,从调用它到抬起鼠标键为止,它时刻的改变四边形的大小。

6.BOOL TrackRubberBand( CWnd* pWnd, CPoint point, BOOL bAllowInvert = TRUE );

当鼠标在空区域拖拽时显示橡皮筋矩形框(即HitTest-1),让鼠标画一个橡皮筋区域,第一个参数,画橡皮筋的窗体的指针,当然是this ,第二个参数,画橡皮筋的起始点。 让我们注意第三个参数,它非常有意思。当你使用 FALSE时(TRUE 值是缺省的),你的橡皮筋只能从左上到右下的画,不允许反向。编译运行一下FALSE这个值。

特别值得注意的是:TrackRubberBand的过程中是以右键的抬起为结束的,这其间并没有CViewMouseMove发生。这一点一定要记住!这时鼠标画过的区域已经记录在CrectTracker 类数据成员 m_rect里面了,既CrectTracker:: m_rect.

注:Track用于鼠标落在橡皮区内部,这时通过跟踪鼠标可以判断橡皮区的形状

TrackRubberBand用于鼠标落在橡皮区外部,这是跟踪的是鼠标拖动时画出的那个虚框框

下面是工程应用中的代码

void Cmfc02Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{

//当鼠标左键按下时
CRectTracker temp;
temp.TrackRubberBand(this,point,TRUE);
temp.m_rect.NormalizeRect(); //
标题化矩形

//获取选取的矩形
RECT rc;
temp.GetTrueRect(&rc);

//在选取的整个过程,CRectTracker.TrackRubberBand()是阻塞的,直到鼠标左键弹起才返回,并且接管了WM_LBUTTONUP消息
SendMessage(WM_LBUTTONUP);

CDialog::OnLButtonDown(nFlags, point);
}

如果要自己实现的话,可以这样做

BOOL bDown = FALSE;
CPoint posLast, posDown;

void Cmfc02Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
bDown = TRUE;
posLast = point;
posDown = point;

CDialog::OnLButtonDown(nFlags, point);
}

void Cmfc02Dlg::OnLButtonUp(UINT nFlags, CPoint point)
{
if (bDown)
{
   bDown = FALSE;

   CClientDC   dc(this);  
   CRect   rect(posDown.x,   posDown.y,   posLast.x,   posLast.y);  
   rect.NormalizeRect();  
  dc.DrawFocusRect(rect);   //
异或前面画过的矩形
}

CDialog::OnLButtonUp(nFlags, point);
}

void Cmfc02Dlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO:
在此添加消息处理程序代码和/或调用默认值
if (bDown)
{
   CClientDC dc(this);

  if (posLast.x != posDown.x && posLast.y != posDown.y)
   {
    CRect   rect(posDown.x,   posDown.y,   posLast.x,   posLast.y);  
    rect.NormalizeRect();
    dc.DrawFocusRect(rect);
   }
   CRect rect(posDown.x,   posDown.y,   point.x,   point.y);  
   rect.NormalizeRect();  
   dc.DrawFocusRect(rect);  
     
  posLast   =   point;  
}

CDialog::OnMouseMove(nFlags, point);
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值