重定向hwnd GDI调用系统内存位图?

时间:2009-10-18 04:46:56

标签: windows visual-c++ com activex gdi

我想在其他演示技术(Direct3D和WPF)中呈现第三方ActiveX控件。为此,我需要ActiveX渲染到系统内存位图而不是屏幕。我知道有办法做到这一点,但不知道从哪里开始。我不怕做任何本地方法挂钩,但我不知道从哪里开始。我以为BeginPaint(...)可能是热门票......

有没有人这样做或看过漂浮的示例/样本?

BTW,我不想做WM_PRINT类型的解决方案。我宁愿这个代码是反应性的,而不是主动的,并强迫hwnd重新绘制。

编辑:

在我的案例中,两个答案都是正确的,所以我给每个答案+1。我希望有一个更低级别的解决方案更灵活,但目前这已经足够好了。

2 个答案:

答案 0 :(得分:3)

最好的办法是查看ActiveX对象是否支持IViewObject并调用Draw()方法将其渲染到DC中。

如果对象不支持标准的OLE接口,那么这将很难让它工作。你不得不求助于做一些邪恶的事情,比如重写DLL的导入表来重定向BitBlt()等等。我做过这样的事情。我不推荐它。

您的下一个问题是如何正确映射输入事件。

答案 1 :(得分:1)

您的网站是否支持IOleInPlaceSiteWindowless界面?

不幸的是,ActiveX控件中的无窗口支持是可选的。如果第三方接口支持它,那么您可以使用IViewObject :: Draw将控件渲染到您想要的任何表面上。