代码之家  ›  专栏  ›  技术社区  ›  StackedCrooked

Windows 7中的WS-ClipChildren和InvalidatRect的行为

  •  3
  • StackedCrooked  · 技术社区  · 15 年前

    为了减少闪烁,我使用WS-ClipChildren标志创建父窗口,并在wm-Size事件期间调用invalidRect。这种方法在WindowsXP中运行得很好。不过,我最近开始在Windows7上编程,现在在调整窗口大小时遇到了渲染问题。当调整窗口的大小时,它的内容不会刷新,除非我执行一些强制重绘的操作,例如最小化和恢复窗口。

    我尝试用updateWindow调用来跟踪invalidrect,但没有任何效果。

    有人知道怎么正确地做吗?

    更新
    我找到了一个解决办法:打电话 InvalidateRect(childHWND, NULL, FALSE) 在所有子窗口上 InvalidateRect(parentHWND, NULL, TRUE) 在父窗口上修复了渲染问题,但没有引入明显的闪烁。

    其他建议仍然欢迎!

    更新2
    我试过了 RedrawWindow(hwnd, 0, 0, RDW_INVALIDATE | RDW_ALLCHILDREN) 但这导致了一些渲染问题(遗留像素)。

    更新3
    当后面跟着一个 InvalidateRect(hwnd, NULL, TRUE) . 谢谢@interjay!

    3 回复  |  直到 8 年前
        1
  •  2
  •   interjay    15 年前

    你可以试着打电话 RedrawWindow 传递旗帜 RDW_INVALIDATE RDW_ALLCHILDREN .

    编辑 :

    要重新绘制背景,可以添加RDW U擦除。如果要在父级而不是子级上重新绘制背景,请同时调用 重绘窗口 InvalidateRect(...,TRUE) .

        2
  •  2
  •   Robert    12 年前

    我也遇到过类似的问题。 我研究了这个解决方案,但最后我得出了以下结论:

    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);
        }
    }
    

    我真的希望这有帮助。…

        3
  •  0
  •   Mordachai    15 年前

    我最近在浏览其他内容时发现了这个片段,它表明通过删除 CSV重画 重画 WND级 对于您的窗口,它将减少调整窗口大小时创建的工件。

    我使用以下代码片段来实现这一点,尽管我不能说我实际上注意到它有多大的实际影响:

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