【问题标题】:Create a virtual window for painting in memory only仅在内存中创建用于绘画的虚拟窗口
【发布时间】:2013-10-18 19:43:15
【问题描述】:

我有一个 win32 屏幕保护程序应用程序,它从传递给 ScreenSaverProc 的 HWND 获取其设备上下文,例如使用 BeginPaint

现在我想使用相同的代码来创建屏幕保护程序的视频(使用ffmpeg,但这不相关)。我想做的是在调用ScreenSaverProc 的代码周围放置一个包装器(而不是让libscrsave 执行它),并传入某种虚拟窗口,以便它可以以相同的方式获取设备上下文像往常一样在上面绘画,但是在包装器代码中我可以获取设备上下文的位图并将其复制到视频的帧中。

有没有办法创建这样一个虚拟窗口?只创建一个常规窗口并将其隐藏是否可行?

【问题讨论】:

    标签: winapi window


    【解决方案1】:

    我会将屏幕保护程序构造成一个仅获取设备上下文的瘦包装函数,然后调用另一个函数将绘图绘制到 DC:

    void On_WmPaint() { 
        HDC dc = BeginPaint();
        // ...
        do_draw(dc);
        EndPaint();
    }
    
    void do_draw(HDC dc) { 
      // ...
    }
    

    然后,当您想为视频创建帧时,可以使用 CreateCompatibleDC(一种可能性)创建与您的屏幕兼容的 DC。然后使用 CreateCompatibleBitmap 创建位图(也与屏幕兼容)。将该位图选择到 DC,然后调用 do_draw,将其传递给该 DC。这将绘制到您在 DC 中选择的位图中,因此之后您可以使用位图做您想做的事情。

    【讨论】:

    • 我希望能够使用标准的屏幕保护程序界面,在那里我可以传入HWND 而不是特定的HDC,但这可能是一个合理的解决方法。我试试看,谢谢!
    • 它确实有效,但对我来说仍然不理想,但它可能是唯一的方法。如果我在窗口被隐藏或遮挡时尝试绘制到窗口的 DC,它似乎会冻结。我没有像你建议的那样使用内存 DC 的问题。感谢您的帮助。
    • 当然——很高兴为您提供帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-02-11
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多