2013-03-02 244 views
0

在我的课中,我编写了以下代码来处理窗口的灰色区域。我尝试不处理帧,因为帧有时会改变样式,并且会导致意想不到的大小调整行为。预期的行为是它返回窗口最上面的最左边的灰色像素。看似相同的代码不会给出相同的结果

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]; 

不幸的是,现在没有,我没有了解发生了什么,或者为什么上述两者完全不同。我已经多次在纸上读过它,我不明白为什么使用两个不同的rects并抵消它们与将帧偏移直接应用到原始rect有什么不同。

想法?

+1

与您的具体问题无关,但这两个示例都会调用[未定义行为](http://en.wikipedia.org/wiki/Undefined_behavior)... – ildjarn 2013-03-02 01:21:51

+1

当您在第二个代码中看不到任何偏移时返回rcPos,这可能是不同的。 – TravellingGeek 2013-03-02 01:24:22

+0

@ildjarn,'return'正在创建一个指向局部变量的指针,但是它同时对它进行了引用。那是你认为你看到的未定义的行为,还是还有其他的东西? – 2013-03-02 03:29:19

回答

0

你的迹象混淆了。第一个例子应该为rcFrame.leftrcFrame.top产生负数,但是你从这个位置减去它们,给出正的偏移量。第二个例子应该是正确的。

相关问题