//===============================
// QTransformTracker.cpp
//===============================
// Version 1.03, August 31, 2005:
// Resolved MS KB 208856 issue (cursors disappearing under static link)
//
// Version 1.02, August 14, 2005:
// Resolved ambiguous call to atan2, to make it compile with VC++ 7.1
//
// Version 1.01, August 30, 2003:
// Added check for Windows version at pen creation (PS_ALTERNATE only on Win2000 and later)
//
// Version 1.0, August 20, 2003:
// (c) Sjaak Priester, Amsterdam
// www.sjaakpriester.nl
#include "StdAfx.h"
#include "QTransformTracker.h"
#include <math.h>
#include <conio.h>
/*#define _winmajor 5*/
namespace
{
const double pi = 4.0 * atan(1.0);
// Note: Do _not_ use const REAL pi... etc.
// For some reason beyond my comprehension, VC++ 7.1 then makes pi = 0.0000f!
enum Handle
{
HandleTopLeft = 0,
HandleTop = 1,
HandleTopRight = 2,
HandleRight = 3,
HandleBottomRight = 4,
HandleBottom = 5,
HandleBottomLeft = 6,
HandleLeft = 7,
HandleCenter = 8,
HandleBody = 9,
HandleNothing = -1
};
}
HCURSOR QTransformTracker::g_hCursor[10] = { 0 };
QTransformTracker::QTransformTracker(CWnd * pWnd)
: QTracker(pWnd)
, m_Options(OptionDefault)
, m_Mode(TransformNone)
, m_Handle(HandleNothing)
, m_bLoaded(false)
, m_bSpace(false)
, m_bMapFlip(false)
, m_bAlt(false)
, m_colorMark(RGB(192, 192, 192))
, m_colorHandles(RGB(0, 0, 0))
, m_colorCenter(RGB(0, 0, 0))
, m_colorTrack(RGB(0, 0, 0))
, m_colorPath(RGB(0, 0, 0))
, m_HandleSize(4)
, m_InnerMargin(4)
, m_OuterMargin(2)
, m_FixedSrc(0)
, m_FixedDest(0)
, m_StartPhi(0.0f)
, m_pGraphicsPath(NULL)
, m_pPathPoints(NULL)
, m_pPathTypes(NULL)
, m_IndicatorString(_T(""))
{
if (g_hCursor[0] == NULL)
{
// Load static default cursors
// Note: if linking to a static MFC-library,
// do not define _AFX_NO_TRACKER_RESOURCES in the resource file.
// Bug in Visual Studio. See: KB-article 208856 on MSDN.
HINSTANCE hInst = ::AfxFindResourceHandle(
MAKEINTRESOURCE(AFX_IDC_TRACKNWSE), RT_GROUP_CURSOR);
UINT DefaultCursorIDs[] =
{
AFX_IDC_TRACKNWSE, AFX_IDC_TRACKNESW, AFX_IDC_TRACKNS, AFX_IDC_TRACKWE,
AFX_IDC_TRACK4WAY,
AFX_IDC_MOVE4WAY, AFX_IDC_MOVE4WAY,
AFX_IDC_TRACK4WAY, AFX_IDC_TRACK4WAY, AFX_IDC_TRACK4WAY
};
for (int i = 0; i < sizeof(DefaultCursorIDs)/sizeof(UINT); i++)
{
if (g_hCursor[i] != NULL) continue; // already loaded by user
LoadCursor(i, DefaultCursorIDs[i], hInst);
ASSERT(g_hCursor[i]);
// If you get an assert here, there's probably something wrong
// with your resources.
}
}
}
QTransformTracker::~QTransformTracker(void)
{
delete m_pGraphicsPath;
delete[] m_pPathPoints;
delete[] m_pPathTypes;
}
int QTransformTracker::OnBeginTrack(UINT nFlags, CPoint point)
{
m_Transform.Reset();
if (! m_bLoaded) return TrackFailed;
m_Handle = HandleTest(point);
if (m_Handle == HandleNothing) return TrackFailed;
else if (m_Handle == HandleCenter) m_Mode = TransformCenter;
else if (m_Handle == HandleBody) m_Mode = TransformMove;
else
{
m_Mode = TransformScale;
if (nFlags & MK_CONTROL)
{
if ((m_Handle & 1) && (m_Options & OptionShear)) m_Mode = TransformShear;
if (! (m_Handle & 1) && (m_Options & OptionRotate)) m_Mode = TransformRotate;
}
m_bAlt = false;
if (m_Options & OptionCenter) m_bAlt = ::GetKeyState(VK_MENU) < 0;
if (m_Mode == TransformRotate && (m_Options & OptionRotateReverseAlt)) m_bAlt ^= true;
SetFixedPoints(m_bAlt);
}
SetCursor(m_Handle);
return TrackContinue;
}
int QTransformTracker::OnEndTrack(int trackResult)
{
if (m_Mode == TransformCenter && trackResult == TrackCopy) trackResult = TrackSucceeded;
if (trackResult < 0)
{
m_Transform.Reset();
::CopyMemory(m_PointDest, m_PointSrc, 5 * sizeof(POINT));
}
m_Mode = TransformNone;
m_IndicatorString.Empty();
return trackResult;
}
int QTransformTracker::OnMouseMessage(UINT msg, UINT nFlags, CPoint point)
{
bool bPrevAlt = m_bAlt;
m_bAlt = false;
if (m_Options & OptionCenter) m_bAlt = ::GetKeyState(VK_MENU) < 0;
if (m_Mode == TransformRotate && (m_Options & OptionRotateReverseAlt)) m_bAlt ^= true;
// Alt key changed; change fixed points
if (m_bAlt != bPrevAlt) SetFixedPoints(m_bAlt);
if (::GetKeyState(VK_SPACE) < 0)
{
// Space bar pressed, accumulate move in m_Transform
CSize sz = point - m_PreviousPoint;
m_Transform.Translate((REAL) sz.cx, (REAL) sz.cy, MatrixOrderAppend);
SetIndicatorString(TransformMove, (REAL) point.x, (REAL) point.y);
m_bSpace = true;
return QTracker::OnMouseMessage(msg, nFlags, point);
}
if (m_bSpace) // Space bar released
{
SetFixedPoints(m_bAlt);
m_bSpace = false;
}
switch (m_Mode)
{
case TransformMove:
{
if (nFlags & MK_SHIFT) point = RestrictPoint(point, m_StartPoint);
CSize sz = point - m_StartPoint;
m_Transform.Reset();
m_Transform.Translate((REAL) sz.cx, (REAL) sz.cy);
SetIndicatorString(TransformMove, (REAL) point.x, (REAL) point.y);
}
break;
case TransformCenter:
{
if (nFlags & MK_SHIFT) point = RestrictPoint(point, m_StartPoint);
m_PointSrc[4] = m_PointDest[4] = point;
// Center point is in m_PointSrc[4], no transformation, so Dest == Src
SetIndicatorString(TransformCenter, (REAL) point.x, (REAL) point.y);
}
break;
case TransformScale:
{
CSize sz = point - m_FixedDest;
CSize szSrc = m_StartPoint - m_FixedSrc;
REAL scaleX = 1.0f;
REAL scaleY = 1.0f;
if ((m_Handle & 1) == 0) // corner, scale both
{
if (szSrc.cx != 0) scaleX = (REAL) sz.cx / (REAL) szSrc.cx;
if (! (m_Options & OptionAllowMirror) && scaleX < 0.0f) scaleX = 0.0f;
if (szSrc.cy != 0) scaleY = (REAL) sz.cy / (REAL) szSrc.cy;
if (! (m_Options & OptionAllowMirror) && scaleY < 0.0f) scaleY = 0.0f;
if (nFlags & MK_SHIFT) // maintain proportions
{
REAL scaleXabs = fabsf(scaleX);
REAL scaleYabs = fabsf(scaleY);
if (scaleXabs > scaleYabs) scaleX = (scaleX < 0) ? - scaleYabs : scaleYabs;
else scaleY = (scaleY < 0) ? - scaleXabs : scaleXabs;
}
// Set cursor; might be changed after flipping
int curs = (m_Handle & 2) / 2; // 0 or 1
if (m_bMapFlip) curs ^= 1;
curs ^= scaleX < 0;
curs ^= scaleY < 0;
HCURSOR h = g_hCursor[curs];
if (h) ::SetCursor(h);
}
else if ((m_Handle & 3) == 1) // horizontal edge, scale vertical
{
if (szSrc.cy != 0) scaleY = (REAL) sz.cy / (REAL) szSrc.cy;
if (! (m_Options & OptionAllowMirror) && scaleY < 0.0f) scaleY = 0.0f;
if (nFlags & MK_SHIFT) scaleX = scaleY;
}
else if ((m_Handle & 3) == 3) // vertical edge, scale horizontal
{
if (szSrc.cx != 0) scaleX = (REAL) sz.cx / (REAL) szSrc.cx;
if (! (m_Options & OptionAllowMirror) && scaleX < 0.0f) scaleX = 0.0f;
if (nFlags & MK_SHIFT) scaleY = scaleX;
}
m_Transform.Reset();
// Translate the fixed point to the origin.
m_Transform.Translate((REAL) - m_FixedSrc.x, (REAL) - m_FixedSrc.y, MatrixOrderAppend);
// Scale the object.
m_Transform.Scale(scaleX, scaleY, MatrixOrderAppend);
// Translate back to fixed point (which may be different).
m_Transform.Translate((REAL) m_FixedDest.x, (REAL) m_FixedDest.y, MatrixOrderAppend);
SetIndicatorString(TransformScale, (REAL) m_StartRect.Width() * scaleX,
(REAL) m_StartRect.Height() * scaleY);
}
break;
case TransformRotate:
{
CSize sz = point - m_FixedDest;
REAL phi = 180.0f * atan2((REAL) sz.cy, (REAL) sz.cx) / (REAL) pi - m_StartPhi;
while (phi <= -180.0f) phi += 360.0f; // (-180, 180]
if (nFlags & MK_SHIFT)
{
int a = 15 * (int)((phi + 367.5f) / 15.0f); // multiple of 15 degrees
while (a > 180) a -= 360; // (-180, 180]
phi = (REAL) a;
}
m_Tran
没有合适的资源?快使用搜索试试~ 我知道了~
MFC的CRectTracker类 重新实现及扩展
![preview](https://csdnimg.cn/release/downloadcmsfe/public/img/white-bg.ca8570fa.png)
共80个文件
tlog:12个
h:11个
cpp:9个
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
![star](https://csdnimg.cn/release/downloadcmsfe/public/img/star.98a08eaa.png)
温馨提示
我们都知道并喜欢MFC的CRectTracker类,它实现了矩形的橡皮筋。 使用CRectTracker,用户可以以多种方式交互式地移动和缩放矩形屏幕对象。 但是,CRectTracker可以使用的唯一方向不仅仅是横向和纵向。 所以,这是QTransformTracker。 与CRectTracker一样,它可以让您移动和缩放屏幕对象。 但是,它还允许您将对象旋转到任意角度,或剪切对象。 最重要的是,它有更多的选择和操作模式。 QTransformTracker可能是矢量绘图编辑器或类似应用程序的核心。
资源推荐
资源详情
资源评论
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
收起资源包目录
![package](https://csdnimg.cn/release/downloadcmsfe/public/img/package.f3fc750b.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/EXE.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/EXE.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
共 80 条
- 1
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
- luhonghui_acm2019-08-18挺好用的,实现了矩形橡皮筋功能。可以旋转,但是旋转不完善。
![avatar](https://profile-avatar.csdnimg.cn/2f7fcc4d8f5b4f5088271da278f07a18_wo080410125.jpg!1)
踏雪飞鸿_Python
- 粉丝: 18
- 资源: 11
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)