2009-12-16 51 views
3

为了减少闪烁,我使用WS_CLIPCHILDREN标志创建了我的父窗口,并在WM_SIZE事件期间调用了InvalidateRect。这种方法在Windows XP中运行良好。不过,我最近开始在Windows 7上编程,并且在调整窗口大小时我现在遇到渲染问题。调整窗口大小时,其内容不会刷新,直到我执行强制重绘的操作,例如最小化和恢复窗口。Windows 7中WS_CLIPCHILDREN和InvalidateRect的行为

我试着用UpdateWindow调用跟进InvalidateRect,但没有任何效果。

有谁知道如何正确地做到这一点?

更新
我找到了一个解决办法:在调用InvalidateRect(childHWND, NULL, FALSE) 上的所有子窗口,然后父窗口上一个InvalidateRect(parentHWND, NULL, TRUE)修复,而不会引入明显的闪烁渲染问题。

其他建议仍然欢迎!

更新2
我试过RedrawWindow(hwnd, 0, 0, RDW_INVALIDATE | RDW_ALLCHILDREN)但导致一些渲染问题(左超过像素)。随后当被InvalidateRect(hwnd, NULL, TRUE)

更新3
的RedrawWindow工作。谢谢@interjay!

+2

我希望有人在微软发布一个清晰,简洁,如何与任何版本的操作系统兼容的W/O闪烁调整大小! – Mordachai 2009-12-16 14:40:06

+0

我修复了我的答案。如果您再次回复我,请在我的回答下添加评论,否则我可能看不到它。 – interjay 2009-12-16 15:27:57

回答

1

您可以尝试致电RedrawWindow,传递标记RDW_INVALIDATERDW_ALLCHILDREN

编辑

重绘的背景下,您可以添加RDW_ERASE。如果您想在父级但不是子级上重绘背景,请同时拨打RedrawWindowInvalidateRect(...,TRUE)

+0

谢谢,那也可以。 – StackedCrooked 2009-12-16 15:43:16

0

我发现这个片段最近的地方浏览别的东西的时候 - 这表明,从WNDCLASS去除CS_VREDRAWCS_HREDRAW为你的窗口,它会降低调整窗口大小时产生的假象。

我用下面的代码片段来实现这一点,虽然我不能说我有多大的实际影响实际上注意到了这一点有:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT & cs) 
{ 
    // do standard thing 
    if (!CMFCToolboxMDIFrameWnd::PreCreateWindow(cs)) 
     return FALSE; 

    // ensure a thinner border 
    cs.dwExStyle &= ~WS_EX_CLIENTEDGE; 

    // avoid repainting when resized by changing the class style 
    WNDCLASS wc; 
    VERIFY(GetClassInfo(AfxGetInstanceHandle(), cs.lpszClass, &wc)); 
    cs.lpszClass = AfxRegisterWndClass(0, wc.hCursor, wc.hbrBackground, wc.hIcon); 

    return TRUE; 
} 
2

我也有过类似的问题。 我看着这个解决方案,但最后我想出了以下内容:

void WindowClass::Invalidate(BOOL bErase) 
{ 
    base::Invalidate(bErase); 

    // traverse along all the child windows. 
    for (CWnd* pChild = GetWindow(GW_CHILD); pChild != NULL; pChild = pChild->GetWindow(GW_HWNDNEXT)) 
    { 
     // Let them do the invalidate also. 
     pChild->Invalidate(bErase); 
    } 
} 

我希望这会有所帮助。 。 。