2015-10-21 80 views
0

嘗試向上和向下滑動窗口。 但試圖讓它在同一時間調整大小,使底部保持在同一個地方。 問題是,當窗口向上滑動時,底部閃爍5像素左右。 窗戶滑落沒有問題。向上/向下滑動窗口在底部閃爍

這裏是代碼 的一部分即時通訊作爲一個資源對話框。

int w  = 500; 
int h  = 150; 
int Speed = 10; 

bool StartSlide() 
{ 
    m_pDlg->GetWindowRect(&m_MyPos); 

    for (int i = 0; i <= h; i += 5) 
    { 
     Sleep(Speed); 
     SetWindowPos(m_pDlg, m_MyPos.left, m_MyPos.top - i, w, i, SWP_SHOWWINDOW | SWP_NOOWNERZORDER | SWP_NOACTIVATE); 
    } 

    return true; 
} 

bool Close() 
{ 
    RECT thisWindow; 
    GetWindowRect(&thisWindow); 

    for (int i = 0; i <= h; i += 5) 
    { 
     Sleep(Speed); 
     SetWindowPos(m_pDlg, thisWindow.left, thisWindow.top + i, w, h - i, SWP_SHOWWINDOW | SWP_NOOWNERZORDER | SWP_NOACTIVATE | SWP_NOREPOSITION); 
    } 

    return true; 
} 
+0

當窗口變大5個像素時,新的區域必須被繪製。這是一個調整大小的問題,如果您手動調整大小,則會出現同樣的問題。嘗試'WM_CLIPCHILDREN',嘗試覆蓋'WM_ERASEBKGND'等。 –

+0

已經嘗試過所有似乎還在做它 – mutotu

+0

當窗口正在經歷這個階段時,只需禁用繪畫/更新。當窗口準備就緒時,啓用繪畫和後臺更新。否則,你應該開始一個不同的問題,看看你是否可以通過閃爍縮小問題範圍。順便說一句,「睡眠」的使用存在問題,但並不準確。 –

回答

0

這個問題實際上是基於處理能力,與您的程序無關。閃爍正在發生的原因是您正在執行兩項操作;你會看到發生了一個事件(移動窗口或調整窗口大小 - 以先到者爲準 - 約5px),然後在窗口移動/改變第一次改變大小時調整另一個窗口至少一幀。試着玩int Speed變量,看看你是否可以讓動畫更流暢。

如果這不起作用,可能是一種優化代碼的方法,可以讓代碼更快地運行 - 但我會把這個討論留給那些在該領域更有經驗的人。

編輯:This questionthis question可能有助於你解決困境。

+0

但即時通訊在電腦上運行,所以處理能力不應該成爲問題。窗口移動/調整大小功能也是相同的。爲什麼當它滑下我的窗戶時它工作得很好?我已經嘗試了與我的睡眠和這樣的東西不要改變太多,我可以改變閃光燈的大小,這取決於我每次移動窗口的時間是多少 – mutotu

+0

嗯..每當我遇到了這樣的事情一直在使用Windows窗體(.NET),所以也許是與你的問題不同的原因 –

+0

它必須是簡單的東西,我想也許這是我的數學,當它滑動,但不能肯定。它似乎只發生在im調整大小和移動時,如果我只是滑動窗口而不調整窗口大小,它不會使底部閃爍。它就像窗口的底部向上移動5px,然後在同一個循環中向下移動5px – mutotu