代码之家  ›  专栏  ›  技术社区  ›  Ismael Philip Pryde

使非客户区域无效

  •  4
  • Ismael Philip Pryde  · 技术社区  · 14 年前

    我有一个具有自定义边框/标题的窗口,以便处理wm ncpaint消息。我的标题有两种背景:一种是活动窗口的亮背景,另一种是背景窗口的暗背景。

    但在某些情况下,例如,当窗口失去/获得焦点时,标题不会更新,因此以错误的背景结束。

    到目前为止,我已经处理了wm-ncactivate,并发送了一个redrawwindow(hwnd,null,null,rdw-frame,rdw-invalidate),但这会导致整个窗口重新绘制。你对此有什么建议吗?

    2 回复  |  直到 9 年前
        1
  •  3
  •   Adrian McCarthy    14 年前

    覆盖非客户领域总是充满危险。窗口管理器似乎为优化做了很多假设。显然它 可以 完成,见办公室,但可能需要很多实验。

    只是一个想法。调用RedrawWindow两次,一次使非客户端区域无效,然后再次验证客户端区域。

    RedrawWindow(hwnd, NULL, NULL, RDW_FRAME | RDW_INVALIDATE);
    RedrawWidnow(hwnd, NULL, NULL, RDW_NOFRAME | RDW_VALIDATE);
    

    另一个想法是立即尝试仅绘制框架,而不使任何内容无效:

    RedrawWindow(hwnd, NULL, NULL, RDW_FRAME | RDW_UPDATENOW | RDW_NOCHILDREN);
    

    另一个想法是在第二个或第三个参数中指定一个空的rect或hregion。这样做可能不会使客户机区域失效。

        2
  •  4
  •   thims    9 年前

    事实上,这就是诀窍:

    SetWindowPos(hwnd, 0, 0, 0, 0, 0,
        SWP_DRAWFRAME|SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOZORDER);