0

我们有一些在 MFC 中构建的内部应用程序,带有 OpenGL 绘图例程。他们都使用相同的代码在屏幕上绘图并打印屏幕或将其保存为 JPEG 文件。在 Windows XP 中一切都运行良好,我需要找到一种方法让它们在 Vista 上运行。

在我们的三个应用程序中,一切正常。在剩下的一个中,我可以得到窗口边框、标题栏、菜单和任务栏,但内部从来没有出现过。正如我所说,这些应用程序使用完全相同的代码来写入屏幕并捕获窗口图像,我看到的唯一区别可能是相关的问题应用程序使用 MFC 多文档界面,而那些该工作使用单一文档界面。

要么答案不在网上,要么我在谷歌上的搜索比我想象的要差。我在 MSDN 论坛上问过,我得到的唯一实用建议是使用 GDI+ 而不是 GDI,这并没有什么不同。我对捕获和打印或保存的代码的每一部分都尝试了不同的东西,给出了一个指向窗口的指针,所以显然这是窗口本身的问题。我还没有使用 SDI 重建有问题的应用程序,我真的没有任何其他想法。

有没有人见过这样的事情?


我有四个应用程序。他们使用很多通用代码,并共享实际的 .h 和 .cpp 文件,所以我知道绘图和屏幕截图代码是相同的。

有一个 WindowtoDIB() 例程,它采用 *pWnd、源矩形和目标大小。它看起来像是经过略微改编的 Microsoft 代码,我在 Microsoft 网站上的此文件中找到了其他功能。在我的四个应用程序中,三个处理得很好,但一个没有。最明显的区别是问题之一是MDI。

在我看来,*pWnd 是问题所在。我绝对不是 MFC 专家,在我看来,问题可能在于我们在 SDI 中设置了一个窗口,而在 MDI 中设置了多个窗口。我可能将错误的 *pWnd 传递给函数。

同时,它已经开始在 64 位 Vista 测试机上正常工作,但在 32 位 Vista 机器上仍然无法正常工作。我不知道为什么。自上次测试以来,我没有改变任何东西,我认为其他人也没有。(在 32 位版本上,Print Screen 键按预期工作,但它不会将屏幕保存为 JPEG。)

4

5 回答 5

1

您的问题标题提到了屏幕截图,但您的实际问题没有。请详细说明。问题是您可以对您的三个应用程序进行屏幕截图,但不能对第四个应用程序进行屏幕截图吗?您可以使用可以捕获 OpenGL/DirectX 窗口的不同屏幕捕获软件。这些表面由窗口管理器直接处理,不会显示为简单的“PrtScn”。

切换到 GDI+ 不会解决它,切换到 SDI 也不会。

于 2008-09-18T13:59:33.730 回答
1

如果它是您想要的 CView 的内容,那么是的,那应该是正确的。如果它是整个屏幕的内容(至少是内容,没有工具栏和状态栏),那么您应该将 CMainFrame 传递给它(这是可能已更改的默认名称,派生自 CMDIFrameWnd )。

你能发布WindowToDIB()的代码吗?我刚刚尝试过,它适用于我 (TM),但视图中没有 OpenGL 代码。尝试将以下窗口传递给 WindowToDIB() 函数:

CMainFrame*mainfrm = static_cast<CMainFrame*>(::AfxGetMainWnd());

- mainfrm

- mainfrm->MDIGetActive()

- mainfrm->MDIGetActive()->GetActiveView()

看看你得到了什么。

于 2008-09-18T19:14:35.110 回答
0

每个窗口的内容都是directX表面,只由显卡中的窗口管理器组装。除非您关闭新界面 (DWM) 或专门用于从 DWM 进行屏幕捕获的代码,否则您将无法捕获此内容。

维基百科对桌面窗口管理器(DWM)有很好的描述

于 2008-09-17T20:04:04.253 回答
0

对不起,我还是不明白。您正试图让 Print Screen 键在所有四个应用程序上工作?或者您正试图让 WindowtoDIB() 函数工作,该函数需要应用程序本身的“屏幕截图”(来自您自己的应用程序),以便可以将其保存为图像文件?

另外,“他的 Print Screen 键按预期工作,但它不会将屏幕保存为 JPEG。”是什么意思?Print Screen 仅复制到剪贴板,在 Paint 中粘贴时会发生什么?

如果您的 WindowtoDIB() 函数仅“捕获”您传递给它的窗口,那么是的,您的 MDI 子窗口不会出现。

于 2008-09-18T16:54:02.220 回答
0

我们最终通过创建不同的 OpenGL 上下文并绘制所有内容来解决这个问题。我们放弃了屏幕截图。

于 2009-12-15T16:56:50.600 回答