2008-09-17 99 views
0

我們有一些內置的應用程序,內置在MFC中,帶有OpenGL繪圖程序。它們都使用相同的代碼在屏幕上繪製並打印屏幕或將其保存爲JPEG文件。在Windows XP中一切正常,我需要找到一種方法讓它們在Vista上運行。Vista中的MFC應用程序無法使用屏幕截圖

在我們的三個應用程序中,一切正常。在剩下的一箇中,我可以獲得窗口邊框,標題欄,菜單和任務欄,但內部從不顯示。正如我所說的,這些應用程序使用完全相同的代碼寫入屏幕並捕獲窗口圖像,我看到的唯一區別看起來可能相關的是,問題應用程序使用MFC多文檔界面,而使用MFC該工作使用單個文檔界面。

答案不是在網上,或者我在Google上比在想象中更糟。我問MSDN論壇,我得到的唯一實際建議是使用GDI +而不是GDI,而且沒有任何不同。我已經嘗試了與捕獲和打印或保存代碼的每個部分不同的東西,只要給出一個指向窗口的指針,顯然這是窗口本身的問題。我還沒有使用SDI重建違規應用程序,而且我真的沒有任何其他想法。

有沒有人看過類似的東西?


我得到的是四個應用程序。他們使用了大量的通用代碼,並共享實際的.h和.cpp文件,因此我知道繪圖和屏幕捕獲代碼是相同的。

有一個WindowtoDIB()例程,它接受一個* pWnd和一個源矩形和目標大小。它看起來像微軟的微代碼很適應,並且我在Microsoft網站上的這個文件中發現了其他功能。在我的四個應用程序中,三個處理這個很好,但一個沒有。最明顯的區別是問題一是MDI。

它看起來像我* * pWnd是問題。我不是一個長期的MFC大師,在我看來,問題可能是我們在SDI中有一個窗口設置,在MDI中有一個以上的窗口設置。我可能會將錯誤* pWnd傳遞給函數。

與此同時,它已開始在64位Vista測試機器上正常工作,但它仍不能在32位Vista機器上工作。我不知道爲什麼。自從上次測試以來,我沒有改變任何東西,我也沒有想到其他人有過。 (在32位版本中,「打印屏幕」按鍵按預期工作,但不會將屏幕保存爲JPEG格式。)

回答

0

我們最終通過創建一個不同的OpenGL上下文來解決這個問題,並繪製了一切。我們放棄了屏幕截圖。

0

每個窗口的內容均爲directX表面,並且僅由窗口管理器在顯卡。除非您關閉新界面(DWM)或專門用於從DWM進行屏幕截圖的代碼,否則無法捕獲這些內容。

維基百科有Desktop Window Manager (DWM)

1

你的問題的標題很好的說明中提到的屏幕捕獲,但您的實際問題沒有。請詳細說明。是否可以對三個應用程序執行屏幕截圖,但不是第四個?您可以使用不同的可捕獲OpenGL/DirectX窗口的截屏軟件。這些表面由窗口管理器直接處理,不會顯示出簡單的「PrtScn」。

切換到GDI +不會解決它,也不會切換到SDI。

0

對不起,我還是不明白。您正試圖讓Print Screen鍵在所有四個應用程序上工作?或者你正試圖讓WindowtoDIB()函數工作,這需要應用程序本身的「截圖」(從你自己的應用程序中),以便它可以保存爲圖像文件?

此外,您的'他打印屏幕鍵是否按預期工作,但它不會將屏幕保存爲JPEG'。打印屏幕只複製到剪貼板,粘貼到Paint中會發生什麼?

如果您的WindowtoDIB()函數僅'捕捉'您傳遞給它的窗口,那麼是的,您的MDI子窗口不會顯示出來。

+0

我很抱歉不清楚。我想讓WindowToDIB()工作。我並不關心打印屏幕。通過「按預期工作」,我的意思是,alt-Print Screen和粘貼到Word(作品,並方便調出)顯示窗口,因爲我看到它。您對兒童窗戶的評論Roel看起來很可能就是我要找的。但是,調用來自* View類,它是CView的子類,它是cWnd的子類。因此,在我看來,我應該已經擁有了正確的cWnd。 – 2008-09-18 17:18:20

1

如果是你想要的CView的內容,那麼是的,那應該是正確的。如果它是整個屏幕的內容(至少是內容,沒有工具欄和狀態欄),那麼你應該把它傳遞給CMainFrame(這是默認的名稱,可能已經改變了,從CMDIFrameWnd派生的) )。

你能發佈WindowToDIB()的代碼嗎?我剛剛嘗試過,它適用於我(TM),但在視圖中沒有OpenGL代碼。嘗試將以下窗口傳遞給WindowToDIB()函數:

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

  • mainfrm

  • mainfrm-> MDIGetActive()

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

,看看你會得到什麼。

+0

您似乎正在討論使用「答案」作爲帖子。如果由於某種原因某人投票選擇其中一個答案,這是沒有意義的。這就是評論部分的目的! – 2008-09-19 19:57:57

相關問題