详细介绍 CPoint::Offset()

书籍:《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 对象,表示偏移后的坐标。

​核心功能与用途​

  1. 坐标平移
    将点沿x轴和y轴移动指定距离,常用于图形绘制、几何变换等场景。

    CPoint pt(10, 20);
    CPoint newPt = pt.Offset(5, 3); // newPt = (15, 23)
  2. ​动态调整位置​
    在绘图应用中,结合鼠标事件或动画逻辑,实时更新点的位置。

    void CMyView::OnMouseMove(UINT nFlags, CPoint point) {
        m_currentPt = m_initialPt.Offset(point.x - m_lastPt.x, point.y - m_lastPt.y);
        Invalidate(); // 触发重绘
    }
  3. ​几何计算​
    用于计算相对位置关系,如两点间距离、向量运算等。

    CPoint center(100, 100);
    CPoint offsetPt = center.Offset(50, 50); // 偏移后的点用于绘制半径

​关键细节与注意事项​

  1. ​坐标系方向​

    • MFC 默认坐标系:原点 (0,0) 在窗口左上角,x轴向右,y轴向下。
    • dy 参数的正值会导致点向下移动(与数学坐标系y轴方向相反)。
  2. ​不可变性​
    Offset() ​​不会修改原对象​​,而是返回新对象。需将结果赋值给新变量:

    CPoint original(0, 0);
    CPoint moved = original.Offset(10, 20); // original仍为(0,0)
  3. ​边界处理​
    若偏移后超出容器(如窗口、画布)边界,需在调用处额外处理(如限制范围):

    CPoint newPt = pt.Offset(dx, dy);
    if (newPt.x < 0) newPt.x = 0; // 限制x不小于0
  4. ​性能优化​
    频繁调用 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);
}

​相关函数​

  1. CPoint::operator+=
    直接修改当前对象,实现类似偏移效果:

    CPoint pt(10, 20);
    pt += CSize(5, 3); // pt变为(15, 23)
  2. 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+= 替代。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值