如何让CRectTracker的m_rect不超出一定的范围,比如screen或者某个document的范围

最近在尝试做一个QQ截图那样的工具,其中一个功能就是要做一个选择框,自然用到了CRectTracker

但是有一个很关键的东西就是,拖拽CRectTracker的时候,不能让CRectTracker“移出”屏幕,否则截图出来就有黑色的块

怎么办?搜了一下,也没搜到什么有用的资料(可能是我搜索技能太low)

去MSDN看着CRectTracker的文档,想一想应该是Override其中某个method就可以的。

后来琢磨了一下,搞定了,直接Override CRectTracker::OnChangedRect即可,代码直接贴下面:

CVSCRectTracker.h

 1 #pragma once
 2
 3 #include <afxext.h>
 4
 5 // Canvas CRectTracker
 6 class CVSCRectTracker :
 7     public CRectTracker
 8 {
 9 public:
10     CVSCRectTracker(LPCRECT lpSrcRect, UINT nStyle);
11     /******************************************************
12         In order to restrict the tracker‘s rectangle within
13         the range of the screen.
14
15         Override this method, when the rectangle‘s
16         device coordinates are beyond the range of
17         the device (the screen), refuse to make the change.
18     ******************************************************/
19     virtual void OnChangedRect(const CRect& rectOld);
20 };

CVSCRectTracker.cpp

 1 #include "CVSCRectTracker.h"
 2
 3 CVSCRectTracker::CVSCRectTracker(LPCRECT lpSrcRect, UINT nStyle) : CRectTracker(lpSrcRect, nStyle)
 4 {
 5 }
 6
 7 void CVSCRectTracker::OnChangedRect(const CRect& rectOld)
 8 {
 9     // get screen metrics
10     LONG cxScreen(::GetSystemMetrics(SM_CXSCREEN)), cyScreen(::GetSystemMetrics(SM_CYSCREEN));
11     // If coordinates are out of the screen, reset the rectangle to its last position
12     if (m_rect.left <= 0 || m_rect.right >= cxScreen)
13         m_rect.left = m_rectLast.left, m_rect.right = m_rectLast.right;
14     if (m_rect.top <= 0 || m_rect.bottom >= cyScreen)
15         m_rect.top = m_rectLast.top, m_rect.bottom = m_rectLast.bottom;
16     CRectTracker::OnChangedRect(m_rect);
17 }

Canvas.cpp

CRectTracker *tracker = new CVSCRectTracker(&rect, CRectTracker::resizeOutside | CRectTracker::dottedLine);

然后你该怎么用怎么用就可以了

时间: 2024-10-14 06:45:35

如何让CRectTracker的m_rect不超出一定的范围,比如screen或者某个document的范围的相关文章

多行文本超出显示省略号

多行文本超出显示为省略号的需求,仅仅用html和css很难满足需求了,可以借助js实现,看案例: <style> .text-overflow{ width:400px; line-height:20px; } </style> <div class="text-overflow" id="con"> 本文当中我们主要为大家演示如何实现文本超出显示为省略号,以及在网站开发时,什么时候应该考虑内容撑开宽高,还有合适考虑文本超出的问题

javascript小技巧-js小技巧收集(转)

本文转载自:http://blog.csdn.net/ocean20/article/details/2498699 每一项都是js中的小技巧,但十分的实用! 1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document) 5.得

classList详解,让你的js方便地操作DOM类

在此之前,jQuery的hasClass.addClass.removeClass我们已经再熟悉不过了,然而我们并不会在每一个项目中都会去使用 jQuery或者Zepto,譬如在移动端的网页中,考虑到传说中的性能和静态资源的请求量等因素,我们通常会选择采用原生js,而对于元素的class 操作.你首先想到的就是className,这位伙计完美地得到了包括ie6在内的所有古现代浏览器的支持,尽管它的功能简直弱爆,但是人们在相当长的一 段时间还是用得不亦乐乎,甚至一些基础库也只是通过classNam

懒人必备的移动端定宽网页适配方案

如今移动设备的分辨率纷繁复杂.以前仅仅是安卓机拥有各种各样的适配问题,如今 iPhone 也拥有了三种主流的分辨率,而未来的 iPhone 7 可能又会玩出什么新花样.如何以不变应万变,用简简单单的几行代码就能支持种类繁多的屏幕分辨率呢?今天就给大家介绍一种懒人必备的移动端定宽网页适配方法. 首先看看下面这行代码: <meta name="viewport" content="width=device-width, user-scalabel=no">

JavaScript技巧手册

js小技巧 每一项都是js中的小技巧,但十分的实用! 1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document) 5.得到表单中元素的名称和值:document.getElementById("表单中元素的ID号&q

h5的classList对象

H5新增属性classList h5中新增了一个classList,原生js可以通过它来判断获取dom节点有无某个class. classList是html元素对象的成员,它的使用非常简单,比如 console.log(document.body.classList); 目前已知classList API有length,item,add,remove,toggle,contains length 静态属性.可以获取元素类名的个数,使用方式: var len = document.body.cla

有关 Forth

今天晚上继续读 <Masterminds of Programming>,忍不住又翻译了半章关于 Forth 之父的访谈.我以前读过几篇更早时期关于他的访谈,部分了解他的观点.小时候还特别迷 Forth .这位神叨叨的老头很有意思. 没看过原来的译本,只是自己按自己的理解翻了第 4 章 Forth 的前一半.我也算对 Forth 很有爱的人吧,也还了解 Forth 里诸如 ITC (Indirected-threaded code) 这种术语到底指的什么,不过还是觉得翻译有点吃力. 对 For

10个js小案例

知识梳理: 1.DOM(document object model)文档对象模型:html(标签对象集合) 标签名获取对象:document.getElementsByTagName('标签名');//返回的是一个数组 类名获取对象:document.getElementsClassName('类名’);//返回的是一个数组 id获取(id唯一):document.getElementById(); 获取内容标签:innerText,innerHTML 区别:innerHTML可以把标签写进ht

javascript三大家族:offset属性 scroll属性 client属性

(1)offset属性:1.1 offsetWidth = width + border + padding1.2 offsetHeight = height + border + padding1.3 offsetTop = 元素相对于浏览器顶部的距离1.4 offsetLeft = 元素相对于浏览器左边的距离功能:只读(获取)不写(设置)1.5 子元素的offsetTop和offsetLeft:关键看父元素是否设置了定位,若有则相对于父元素的上边框和左边框的距离:若没有则相对于浏览器顶部和左