书籍:《Visual C++ 2017从入门到精通》的4.2 按钮控件
环境:visual studio 2022
内容:[例 4.4]实现一个三角按钮
说明:以上内容大部分来自腾讯元宝。
功能概述
CPoint::Offset()
是 MFC(Microsoft Foundation Classes)中 CPoint
类的成员函数,用于对二维点进行偏移操作。它通过指定的水平(Δx)和垂直(Δy)偏移量,调整点的位置,返回一个新的 CPoint
对象。
函数原型
CPoint CPoint::Offset(int dx, int dy);
- 参数:
dx
:水平方向的偏移量(整数)。正值向右移动,负值向左移动。dy
:垂直方向的偏移量(整数)。正值向下移动,负值向上移动(注意坐标系方向)。
- 返回值:一个新的
CPoint
对象,表示偏移后的坐标。
核心功能与用途
-
坐标平移
将点沿x轴和y轴移动指定距离,常用于图形绘制、几何变换等场景。CPoint pt(10, 20); CPoint newPt = pt.Offset(5, 3); // newPt = (15, 23)
-
动态调整位置
在绘图应用中,结合鼠标事件或动画逻辑,实时更新点的位置。void CMyView::OnMouseMove(UINT nFlags, CPoint point) { m_currentPt = m_initialPt.Offset(point.x - m_lastPt.x, point.y - m_lastPt.y); Invalidate(); // 触发重绘 }
-
几何计算
用于计算相对位置关系,如两点间距离、向量运算等。CPoint center(100, 100); CPoint offsetPt = center.Offset(50, 50); // 偏移后的点用于绘制半径
关键细节与注意事项
-
坐标系方向
- MFC 默认坐标系:原点 (0,0) 在窗口左上角,x轴向右,y轴向下。
dy
参数的正值会导致点向下移动(与数学坐标系y轴方向相反)。
-
不可变性
Offset()
不会修改原对象,而是返回新对象。需将结果赋值给新变量:CPoint original(0, 0); CPoint moved = original.Offset(10, 20); // original仍为(0,0)
-
边界处理
若偏移后超出容器(如窗口、画布)边界,需在调用处额外处理(如限制范围):CPoint newPt = pt.Offset(dx, dy); if (newPt.x < 0) newPt.x = 0; // 限制x不小于0
-
性能优化
频繁调用Offset()
可能产生临时对象,建议在循环或高频逻辑中复用变量:CPoint temp; for (int i = 0; i < 100; ++i) { temp = original.Offset(i, i*2); // 复用temp对象 // 使用temp进行绘制... }
代码示例
1. 基本偏移操作
CPoint pt(50, 80);
CPoint newPt = pt.Offset(30, -20); // 向右30,向上20
TRACE(_T("New Point: (%d, %d)\n"), newPt.x, newPt.y); // 输出 (80, 60)
2. 结合绘图使用
void CMyView::OnPaint() {
CPaintDC dc(this);
CPoint center(100, 100);
CPoint radiusPt = center.Offset(50, 50); // 计算圆半径端点
// 绘制圆
CBrush brush(RGB(255, 0, 0));
dc.SelectObject(&brush);
dc.Ellipse(center.x - 50, center.y - 50,
center.x + 50, center.y + 50);
}
3. 处理鼠标拖拽
void CMyView::OnLButtonDown(UINT nFlags, CPoint point) {
m_dragStart = point; // 记录起始点
CView::OnLButtonDown(nFlags, point);
}
void CMyView::OnMouseMove(UINT nFlags, CPoint point) {
if (nFlags & MK_LBUTTON) {
// 计算偏移量并移动点
CPoint offset = point.Offset(-m_dragStart.x, -m_dragStart.y);
m_draggedPt = m_originalPt.Offset(offset.x, offset.y);
Invalidate(); // 更新视图
}
CView::OnMouseMove(nFlags, point);
}
相关函数
-
CPoint::operator+=
直接修改当前对象,实现类似偏移效果:CPoint pt(10, 20); pt += CSize(5, 3); // pt变为(15, 23)
-
CPoint::Offset(const CSize& size)
重载版本,接受CSize
对象作为参数:CPoint pt(0, 0); CSize offset(10, 20); CPoint newPt = pt.Offset(offset); // (10, 20)
总结
- 核心功能:
CPoint::Offset()
用于对点进行平移操作,返回新坐标点。 - 适用场景:图形绘制、几何计算、动态界面交互(如拖拽)。
- 最佳实践:
- 结合
CSize
重载版本提高代码可读性。 - 注意坐标系方向(y轴向下)。
- 在需要修改原对象时,使用
operator+=
替代。
- 结合