CRectTracker类的使用

本文配套源码下载

CRectTracker(俗称“橡皮筋”类)是一个非常有意思的类。你在Windows中经常看到这样的情况:它可以用做显示边界,你也可以扽它的八个角用来放大缩小,或做框选使用。如何通过编程来实现这种功能呢?这就是CRectTracker类的作用;

(框选)             (显示边界并可以缩放)

你打开上面的那个工程文件,编译运行一下。你将看到CRectTracker的几种功能;

下面让我们来从头做一个新的工程文件,来慢慢掌握它的功能吧。

建立一个单文档的工程文件,将其命名为Rect。单击finish完成工程的建立;先编译一下,来第一次生成obj文件吧,在它生成的过程中,我们继续往下讲解;

第一步:

在CRectDoc类中生成一个公有的数据成员:m_rectTracker;之所以设成公有,因为要在View中调用它。接着我们来初始化它,在CRectDoc::CrectDoc构造函数中:

CRectDoc::CRectDoc()
{ // TODO: add one-time construction code here
    m_rectTracker.m_rect.SetRect(0,0,100,100);
    m_rectTracker.m_nStyle=CRectTracker::resizeInside|CRectTracker::dottedLine;
 }

其中: m_rect是CRectTracker中用来控制四边形的大小位置的数据成员, SetRect使用的是View的坐标; m_nStyle是CRectTracker的类型,其中:CRectTracker::resizeInside和CRectTracker::resizeOutside是说明在m_rect的内部还是外部画区域(它们是互异的),CrectTrakcer::dottedLine是用点划线来画四边形的区域边界。 其他的值还有: CRectTracker::solidLine:用来画实线边界;(和dottedLine是互异的) CRectTracker::hatchedBorder:边界带抛面线; CRectTracker::hatchInside:内部带抛面线; 你可以运行前面的例子,上述参数都有使用。你也可以在第二步中逐一使用它们来加深理解它们各自的含义;

第二步:

接着我门在视图中画一个蓝色的椭圆; 在CRectView的OnDraw中继续我们的工作:

void CRectView::OnDraw(CDC* pDC)
{
   CRectDoc* pDoc = GetDocument();
   ASSERT_VALID(pDoc);
   // TODO: add draw code for native data here
   CBrush brush(RGB(0,0,255));//生成蓝色的画刷;
   CBrush *oldBrush=pDC->SelectObject(&brush);//将画刷选进dc;
   CRect rect;
   //GetTrueRect(&rect)得到CRectTracker中的m_rect的大小,将其传递给rect;
   pDoc->m_rectTracker.GetTrueRect(&rect);
   pDC->Ellipse (rect);//画椭圆;
   //Draw tracking rectangle.
   pDoc->m_rectTracker.Draw(pDC);//这句画才真正的将这个四边形画出来;
   //Select blue brush out of device context.
   pDC->SelectObject (oldBrush);//恢复原来的画刷;
}

注释已经在程序里了,不用再多说,编译一下。一个椭圆外带四边形边界(点划线),且四边形的四周有八个黑点;这就是CRectTracker.,你现在可以改变一下m_nStyle试试看各参数的含义;

第三步:如何象例子中的那样随着鼠标的移动自动在椭圆的周围改变光标呢?很简单只要将下面的代码加入到CRectView::OnSetCursor()就可以了:它调用了CRectTracker中的SetCursor()函数:

BOOL CRectView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{ // TODO: Add your message handler code here and/or call default
   CRectDoc* pDoc = GetDocument();
   if (pWnd == this && pDoc->m_rectTracker.SetCursor(this, nHitTest))
     return TRUE;
   return CView::OnSetCursor(pWnd, nHitTest, message);
}

编译运行一下,鼠标变化了。 第四步:我们再做另一个用于鼠标的CRectTracker类。它的作用是在鼠标按下以后可以显示虚线的选择框: 先让我们看看效果:

在CRectView中的加入如下代码:

void CRectView::OnLButtonDown(UINT nFlags, CPoint point)
{
  CRectTracker temp;
  temp.TrackRubberBand(this,point,TRUE);
  temp.m_rect.NormalizeRect();//正规化;
  CView::OnLButtonDown(nFlags, point);
}

编译运行,当你按下鼠标并拖动,你将看到效果了。

我们如何让鼠标画一个“橡皮筋”区域呢? 在CRectTracker类中的成员函数就是:TrackRubberBand(this,point,TRUE); 注意其中的三个参数:

第一个参数,画“橡皮筋”的窗体的指针,当然是this

第二个参数,画“橡皮筋”的起始点。

让我们注意第三个参数,它非常有意思。当你使用FALSE时(TRUE 值是缺省的),你的“橡皮筋”只能从左上到右下的画,不允许反向。编译运行一下FALSE这个值。

特别值得注意的是:在TrackRubberBand的过程中是以右键的抬起为结束的,这其间并没有CView的MouseMove发生。这一点一定要记住!这时鼠标画过的区域已经记录在temp的m_rect 中了,你可以根据它进行后续的判断工作。至于下面的正规化语句函数的作用与CRect中的正规化函数的作用一致:使四边形的四个角的坐标符合右大于左,底大于顶的坐标值。它主要是为了防止你使用TrackRubberBand 的FALSE参数而引起的可能出现的错误。

时间: 2024-12-21 21:07:07

CRectTracker类的使用的相关文章

浅谈在应用CRectTracker类的程序中响应WM_LBUTTONUP消息

本文配套源码 CRectTracker类也有人称之为"橡皮筋"类.我们可以通过Windows自带的画图板来了解这个类的作用:用"选定"功能在画图区随意选中一块儿区域,此时会出现一个由虚线和八个调整标记点组成的矩形选框,我们可通过鼠标点中矩形选框的中心移动其位置,并且能利用调整标记 点来改变其大小--这个矩形选框其实就是一个"橡皮筋选框". CRectTracker类的使用并不是什么新鲜的话题,然而在应用这个类的过程中,我却发现了一个小问题:我创建

QQ静态截图完善实现之改造CRectTracker类

由于前次写的代码过于仓促(相关文章参见:"QQ 静态截图程序模拟实现"),还没仔细修改就投稿了,在这里向大家表示道歉,可能你觉得这种程序不值的一看,但我本着精益求精的态度,还是把它完善了一下,更重要的是深入了解CRectTracer类的内部机制,以能更灵活和使用该类 ,在此我把MFC的CRectTracker类源码,提取出来做了小小的改造,有兴趣的朋友还可能更深入的增加更 多的功能. 本文主要讲述三个问题: 程序中操作提示窗口文本更新闪烁问题: 程序在调整截取矩形大小和位置时,主窗口收

CRectTracker类的使用--橡皮筋窗口

CRectTracker(俗称"橡皮筋"类)是一个非常有意思的类.你在Windows中经常看到这样的情况:它可以用做显示边界,你也可以扽它的八个角用来放大缩小,或做框选使用.如何通过编程来实现这种功能呢?这就是CRectTracker类的作用:              (框选)                         (显示边界并可以缩放) 你打开上面的那个工程文件,编译运行一下.你将看到CRectTracker的几种功能: 下面让我们来从头做一个新的工程文件,来慢慢掌握它的

马士兵J2SE-第六章-常用类-基本数据类型包装类、Maths类、File类

基本数据类型包装类 public class test { public static void main(String[] args) { Integer i=new Integer(100); Double d=new Double("123.456"); int j=i.intValue()+d.intValue(); float f=i.floatValue()+d.floatValue(); System.out.println(j); System.out.println(

CRectTracker C#实现橡皮区矩形

本文要求读者熟悉 C# 开发环境: Visual Studio .NET 2003 Windows 2000 测试环境:Windows 2000 更新记录:2004.4.7 第一次更新 使用许可:代码是否免费使用 功能介绍: 在MFC中CRectTracker是一个很有用的类,可最近学习C#时,发现没有,于是就从MFC转换了一个供大家享用. 使用该类比较简单,几乎和 MFC中 的 CRectTracker 一样,在MDI中: public class CReportDoc { ... publi

那些意境情怀俱佳的咖啡类网页设计

  音乐可以穿越时光,而美食可以跨越国界,它们和好设计一样,都无需语言来赘述.在过去的几年中,那些设计优秀的餐馆.酒吧类网站开始抓住更多设计师的眼睛和吃货的胃,成了"唯有爱与美食不可辜负"的真实注脚. 新鲜精致的美食与优雅的环境无缝融合,搭配的字体和色彩让你的饥饿感止不住地翻涌起来,你的胃口和情绪会被这些精心设计的网站完全调动起来.优设曾经发过设计优异的美食和美酒类的网站,今天我们来看看这类网站的另外一个重要分支:咖啡类网页设计. 在美国,平均每个人每年会喝500~700杯咖啡,在中国

Delphi中TApplication类的用法

在Delphi中TApplication是一个有着十分重要作用的类.TApplication类是用于描述Delphi编制的应用程序的一个类.通过对这个类的灵活应用可以编制许多有特点的程序.. 1) 检测当前Windows程序是否被激活: TApplication类有一个属性--Active,这个属性就可以描述当前运行的程序是否被激活,成为Windows的焦点.检 测的代码如下: If Application.Active=False then ShowMessage('当前窗口没有被激活');

PHP 验证登陆类分享

 本文给大家介绍的是用php实现的用户登录与验证的一段代码,没有把登录和数据库查询分开,有需要的朋友,可以参考学习下     简单的登录类,没有把登录和数据库查询分开   代码如下: /* * 例子 * * $Auth=new Auth(); * $Auth->login("123@123.com","123"); * $Auth->logout(); * echo $r->init(); * **/   验证登陆类   代码如下: <?ph

php中关于抽象(abstract)类和抽象方法的问题分析

 这篇文章主要介绍了php中关于抽象(abstract)类和抽象方法的问题分析,有需要的朋友可以参考一下 在面向对象(OOP)语言中,一个类可以有一个或多个子类,而每个类都有至少一个公有方法作为外部代码访问的接口.而抽象方法就是为了方便继承而引入的,现在来看一下抽象类和抽象方法分别是如何定义以及他们的特点.   什么是抽象方法?我们在类里面定义的只有方法名没有方法体的方法就是抽象方法,所谓没有方法体就是在方法声明的时候没有大括号以及其中的内容,而是直接声明时在方法名后加上分号结束,另外在声明抽象