2015-10-21 115 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