创建一个仅在内存中绘制的虚拟窗口

时间:2013-10-18 19:43:15

标签: winapi window

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

void do_draw(HDC dc) { 
  // ...
}

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