看似相同的代码不会给出相同的结果

时间:2013-03-02 01:16:48

标签: c++ winapi

在我的班级中,我编写了以下代码来处理窗口的灰色区域。我尝试不处理框架,因为框架有时会改变样式,并且会导致意外的尺寸调整行为。预期的行为是它返回窗口最顶部的最左边灰色像素。

POINT Dialog::GetPosition ( void ) const
...
    RECT rcPos, rcFrame;
    SetRectEmpty(&rcFrame);
    AdjustWindowRectEx(&rcFrame, this->Style, FALSE, this->ExtendedStyle);
    GetWindowRect(this->Handle, &rcPos);
    OffsetRect(&rcPos, -rcFrame.left, -rcFrame.top);
    return reinterpret_cast<LPPOINT>(&rcPos)[0];

然后我优化了我的课程并将代码缩减为以下内容(我认为应该相同):

POINT Dialog::GetPosition ( void ) const
...
    RECT rcPos;
    GetWindowRect(this->Handle, &rcPos);
    AdjustWindowRectEx(&rcPos, this->Style, FALSE, this->ExtendedStyle);
    return reinterpret_cast<LPPOINT>(&rcPos)[0];

不幸的是,它没有,我不知道发生了什么,或者为什么上面两个完全不同。我已经多次在纸上完成它了,我不明白为什么使用两个不同的部分和偏移它们与将帧偏移直接应用到原始矩形有什么不同。

想法?

1 个答案:

答案 0 :(得分:0)

你的迹象好坏参半。第一个示例应该为rcFrame.leftrcFrame.top生成负数,但是您要从位置减去它们,给出正偏移量。第二个例子应该是正确的。