代码之家  ›  专栏  ›  技术社区  ›  Mason Wheeler

发送什么Windows消息来重新绘制部分被遮挡的窗口?

  •  0
  • Mason Wheeler  · 技术社区  · 15 年前

    我知道wm_paint告诉一个窗口它需要完全重新绘制自己,但显然这不是当它被部分覆盖时发送的消息,然后在它前面的窗口不再阻碍,它需要重新绘制脏的部分。在这种情况下,有人知道发送什么消息吗?

    编辑:发现问题:

    这个问题涉及到我为嵌入 SDL 在Delphi窗体上呈现表面。SDL有一个API来在另一个窗口的Hwnd上构建其渲染器,并将其标记为“外部窗口”。

    SDL通常处理 WM_PAINT 在内部,所以我不得不在sdl的windowproc中添加一些代码,以便在外部windowproc是外部窗口时将消息转发到外部windowproc。这有时是可行的,但结果是有一个小故障,从窗口的数据结构中剥离了外国窗口标志,所以它吞咽了消息,而不是将其传递给我的应用程序。一旦我解决了这个问题,我就开始 wm_油漆 随时都有消息。

    5 回复  |  直到 15 年前
        1
  •  1
  •   Toji    15 年前

    你为什么说这显然不是? WM_PAINT 应调用部分重画(更新的rect由 BeginPaint GetUpdateRect )如果它看起来没有被调用,应用程序中的其他地方可能有一个bug阻止了它。你看到什么让你相信它不起作用?

        2
  •  1
  •   Kevin Montrose    15 年前

    WM_PAINT 用于指示窗口的某些部分(包括完整性)需要重新绘制。

    呼叫 GetUpdateRect() 获取一个限定要更新区域的矩形。此信息也包含在传递给的paintstruct(作为rcpaint字段)中 BeginPaint() .

        3
  •  0
  •   vanja.    15 年前

    函数的第二个参数beginpaint()返回需要验证的rect: http://msdn.microsoft.com/en-us/library/dd183362(VS.85).aspx

    case WM_PAINT:
    {
    PAINTSTRUCT psPaint;
    HDC hdc = BeginPaint( hwnd, &psPaint );
    // psPaint.rcPaint contains invalidated area
    EndPaint (hwnd, &psPaint);
    }
    return 0;
    

    看看pspaint.rcpaint: http://msdn.microsoft.com/en-us/library/dd162768(VS.85).aspx

        4
  •  0
  •   paxdiablo    15 年前

    我很确定win32 API使用 WM_PAINT 即使是部分重新喷漆。从 MSDN 以下内容:

    这个 水彩画 当系统或其他应用程序请求绘制时发送消息 一部分 应用程序窗口的。 [我的斜体字]。

    那个链接有完整的细节 水彩画 但是,如你所说,如果wm_paint消息是 正在发送以进行部分重新绘制, Spy++ 是你需要确定的工具。

        5
  •  0
  •   Stephen Nutt    15 年前

    看一看 WM_PRINTCLIENT .在某些情况下 WM_PAINT 未发送,并且 WM1 Prand客户端 而是发送消息。( AnimateWindow 比如说)

    推荐文章