2010-04-08 53 views
2

想象一下MDI應用程序中的一個文檔窗口,其中包含一個WPF子窗口,比如說一個側邊欄。如何獲得一個包含WPF像素和GDI(非wpf)像素的位圖?有沒有辦法使用本機C++從WPF窗口捕獲位圖?

我發現在製作Win7任務欄應用圖標懸停的縮略圖預覽時,我在WPF像素應該在的預覽部分中變黑。我目前的方法只是抓取文檔窗口的位圖捕獲。然後我得到一個DC的預覽,從它做一個內存DC並選擇我的位圖。然後我做一些尺寸調整,並將內存直流轉換爲真實的直流電。我猜測BitBlt操作沒有考慮到WPF像素是硬件加速的事實,因此需要從圖形硬件中抓取。 GDI中的所有東西都管理得很好,但是當沒有WPF子窗口時,預覽圖像看起來很好。

我想知道是否有可能從本地C++獲取WPF窗口的位圖。然後,我可以將其放到先前預覽的黑色區域上。

+0

我在想,既然WPF是硬件加速的,應該有辦法從DirectX獲取像素。不知道我該怎麼做...... – 2010-04-08 22:44:01

+0

是否有RenderTargetBitmap的本機版本? – 2010-04-08 22:53:19

+0

我被告知可能最好的方法是創建一個C++/CLI互操作層,我可以從C++調用這個層,它會爲我返回一個CBitmap。在這種情況下,我可以使用RenderTargetBitmap來獲取WPF像素。 – 2010-04-09 14:12:56

回答

0

爲了解決這個問題,我必須在本地代碼中創建一個包含虛擬方法的抽象類,以獲取在C++/CLI中實現的位圖。在託管實現中,我使用.NET的RenderTargetBitmap類來獲取WPF窗口的位圖捕獲,然後填充傳入的CBitmap對象(請參閱How to get an BITMAP struct from a RenderTargetBitmap in C++/CLI?)。在非託管調用程序中,我使用虛擬方法來獲取位圖。

簡而言之,沒有辦法通過簡單地使用非託管C++來獲取位圖,因爲WPF和GDI實際上並沒有爲所有實際目的一起工作。

0

也許我沒有正確理解你當前的方法,但是你可以從屏幕DC執行BitBlt()到你的內存DC嗎?你需要得到你的窗口的屏幕矩形,但這不應該太糟糕。

+0

這不適用於WPF,因爲WPF呈現給圖形硬件,而不是呈現給設備上下文。這是我目前使用的過程,我得到的只是黑色像素。 – 2010-04-09 14:11:53

+0

好吧,我不確定你現在的方法是基於你的問題。我希望你能對你的問題得到很好的回答。 :) – Andy 2010-04-09 17:58:14

+0

您可以將您的硬件級別修改爲小於2,然後WPF將生成軟件渲染。 – RandomNickName42 2011-04-02 10:50:23

相關問題