2014-06-23 16 views
1

我的問題是 - 是否有可能包裝基於GDI的MFC視圖類以用於C#.Net託管代碼。包裝基於GDI的MFC視圖在C#.Net託管代碼中使用

背景:

我目前的工作對在MFC開發的遺留應用程序。它通過MFC的文檔視圖框架執行基於GDI的繪圖。這些都是簡單的東西,比如繪製線條和點陣位圖。但是,由於它是一個MFC應用程序,繪圖代碼是C++ MFC,通過擴展CView類並將繪圖代碼添加到擴展View類的OnDraw()成員函數來實現。

現在,我想在應用程序之上加上一個很好的UI,所以我打算使用一個精簡的C++/CLI包裝器,通過在MFC中保留應用程序的所有內容,但只是使用WPF作爲GUI - 如何將控件呈現給用戶。爲了節省編碼時間並避免編組,我想保留我的擴展MFC View類和基於GDI的繪圖代碼。這可能嗎?或者如果我想使用WPF用於GUI,我是否重寫了繪圖代碼?

+0

@Admins,是問題張貼和可見?它的意見數量驚人地少。 –

+0

您是否可以將MFC視圖封裝在MFC或ATL的控件中? (我的偏好是ATL ...雖然我將ATL和MFC混合使用的經驗有點欠缺。) – Markus

+0

噢,我也可以看到你的問題,我沒有特別的,所以拿它的價值。 – Markus

回答

0

是的,我們在我們的應用程序中正是如此。我們決定創建一個DIB內存塊,並在繪製之前將其選入DC,並通過在主網格控件中使用InteropBitmap將這些比特放入WPF窗口中。

你也可以使用一個WriteableBitmap的和鎖+副本位成,但同步比InteropBitmap有點不同。一個是雙緩衝(我相信InteropBitmap),所以內存使用量增加了一倍,但是從WPF渲染線程向屏幕發送未填充/空圖像的黑色閃光不可能發生。

我們需要掛鉤CompositionTarget.Rendering通知,並將其視爲我們的WM_PAINT/OnShow中觸發。

在創建WPF窗口期間,我相信我們也會注意到HwndSource的創建,並且在此時將CView連接到創建的HWND。

我還會提到,我們還有一個C++/CLI層,如其中一個註釋所述。所以我使用代碼而不是XAML在UI中創建WPF控件。我們可以將Window對象傳遞給C#進行操作,但C++/CLI使它更容易實現IMO。