2013-03-02 175 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產生負數,但是你從這個位置減去它們,給出正的偏移量。第二個例子應該是正確的。

相關問題