【问题标题】:How to force parent window to draw "under" children windows?如何强制父窗口在子窗口“下”绘制?
【发布时间】:2010-10-05 21:29:14
【问题描述】:

环境是 C/C++ 下的普通 win32,没有任何花哨的 MFC 或类似的 mumbo-jumbo。我有一扇窗户,里面有几个孩子和孙子。有些孩子是奇形怪状的图标,我需要它们有透明的背景(奇形怪状的图标)。考虑一个这样的伪结构:

  • 父母1
    • Child1(正常)
    • Child2(形状奇特的图标)
    • Child3(正常)/Parent2
      • 孙子1(正常)
      • Grandchild2(形状奇特的图标)

上面,Child2 和 Grandchild2 应该有透明背景(WM_ERASEBKGND 什么都不做,或者 (WNDCLASS)->hbrBackground = NULL)。现在这些图标的背景是透明的,但透明到极端——我在 Parent1 下看到了东西——桌面等。

这一切都发生在 Windows Mobile 下。

我需要为 Parent1 和 Parent2 设置任何额外的标志吗?您可能会提供什么好技巧?

如果没有人遇到类似问题,我会感到惊讶,因为现在许多应用程序必须显示图标,各种形状和大小。

编辑:形状奇特的窗口是带有透明胶片的图标。如果父窗口不对这些特定窗口进行剪辑,但每次父窗口自己绘制时使它们无效,那就太好了。 CS_PARENTDC 看起来很有希望,但还不够有希望。有什么想法吗?

【问题讨论】:

    标签: c++ c user-interface winapi windows-mobile


    【解决方案1】:

    我在寻找强制 Windows CE 从更新区域删除子窗口剪辑的方法时偶然发现了这个条目。这似乎根本不可能。 正如 Johann Gerell 提到的,GWES 总是会夹住孩子。这当然使得永远不可能拥有透明的静态字段! 我已经尝试了一切。在 WM_ERASEBKGND 期间设置自定义的非裁剪矩形区域,但 GWES 保留其旧的裁剪区域。 我在位图上放置了一堆静态控件(在 WM_ERASEBKGND 期间绘制)。 这在 Windows CE 上是否可行?

    【讨论】:

      【解决方案2】:

      GWES 不会使用父窗口的内容绘制任何子窗口的矩形。曾经。时期。这是设计使然。

      您可以在子矩形中绘制以响应父级中的WM_CTL...,或者子类化子级并完全覆盖其WM_PAINT。这对于某些窗口(例如编辑控件)来说确实很困难,但大多数情况下都是可行的。

      【讨论】:

        【解决方案3】:

        如果您尝试使用 SetBkColor() 不能在您的 WM_PAIN 处理中为窗口指定颜色,那么它的大小是否不规则也没关系。我是否正确地回答了您的问题?

        【讨论】:

        • 背景(父窗口)不一定是纯色。它可能是渐变,或者更糟的是位图!
        【解决方案4】:

        在形状奇特的窗口中,你是如何处理 WM_PAINT 的?你是在抹掉背景吗?也许更好的解决方案是使用非矩形剪辑区域?

        编辑 SetWindowRgn is documented here - 我说“裁剪区域”是不正确的,我真的在想这个方法。您设置了一个不规则区域,该区域是您的图标的形状,然后绘制到该区域。我认为这可能是绘制形状奇特的窗口的常用技术。

        【讨论】:

        • 是的,WM_PAINT 正在调用 DrawIcon。如何设置非矩形剪辑区域?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-02
        • 1970-01-01
        • 2011-09-21
        • 2018-07-27
        • 2013-08-13
        • 1970-01-01
        相关资源
        最近更新 更多