2012-09-07 105 views
1

有人可以瞭解如何從VC創建C#自定義控件?我需要創建一些圖形控件,這些控件將用於類似默認控件的C#項目中,因爲性能很重要,它在低性能的Windows CE設備上,我想我必須在c/cpp中完成它。如何從C/CPP創建C#自定義控件

+2

1.如果您正在創建.NET對象,則使用哪種語言(例如C#,C++/CLI)並不重要。 2.如果您編寫高度優化的C#代碼(包含所有對象預分配,最小互操作,高效的集合和運算符以及**等),.NET代碼可以像C++一樣快速運行,因爲它們都被轉換爲程序集.NET爲此使用JIT)。 –

+0

嗨Danny,我在David的回答下添加了一些評論,請讓我知道你對這些問題的看法?非常感謝你。 – agou

+0

Danny - 如果目標(本例中的CF)不支持C++/CLI,則會有所不同...... – ctacke

回答

1

您可以嘗試在C中編寫完整的控件,並提供一個非常薄的包裝來暴露您需要從C#中控制的內容。如果我們正在談論Forms控件,它並不一定需要遵循UserControl或Control的模型,這對於正確使用有些複雜,並且這些控件的所有成本都在這裏。它非常苛刻。

你也可以調查WPF,它試圖在託管端實現更多的完成,因此速度更快。它有其自身的複雜性。它通常會自動合成/「比特式」,但經常過度,但其速度比雙緩衝器形式控制更快(或可能),最終將在雙緩衝器模式下執行相同的組合,但隨着更多人爲勝利消息的處理速度變慢。 (要極度簡化)

所以,不要只是說不,我認爲那些是你的選擇。再一次,可以通過公平的控制,一個精心編寫的C端渲染,並獲得接近本機的性能。

編輯:

我錯過了Windows CE部分的問題。我的錯。我不知道我說的是否適用。

+0

謝謝,這就是我要做的。 – agou

0

我假設你在談論WinForms而不是Silverlight。

你不需要。

Windows CE上的.NET執行CIL的JIT(不同於解釋它的Micro Framework,就像老派的Java)。在C#中編寫控件並沒有真正的性能損失。最昂貴的操作是繪畫,如果您使用C#或C++,那麼您將使用GDI進行此操作,並且它在GDI的函數調用中進行昂貴的操作,您唯一要保存的是Managed和土着地區,但這確實算得很少。

您可能想要使用C++創建Windows CE GUI的唯一情況是,如果您使用的是視頻或動畫框架(如Flash),並且如果您正在使用該功能,則完全使用C++,不在任何GUI中使用.NET。

+0

是的,我應該完全使用C++,但這不在我的控制之下,現有項目已寫入在C#中,我在C#和C/C++中都進行了圖形編程,而且感覺C#比較慢,有時候我不需要在矩形區域中找到位置,只是改變幾個點,似乎C#需要複製整個圖像在做之前呢? (我不確定C#中的_insecureCode等背後發生了什麼,而且.net cf不支持透明(?),但是在C/C++中,這很容易做到,直接修改位圖的內存。 ?非常感謝。 – agou

+0

另外.net cf的消除鋸齒效果並不好,而且在C/C++中修復這個問題容易得多,因爲一切都在控制之中,並且不會丟失性能。(?) – agou

+0

.NET沒有它自己的消除鋸齒,只是不同的默認GDI的反鋸齒,你可以隨心所欲地自定義它們,你也可以像使用C++一樣使用不安全的代碼來處理C#中的位圖原始字節,而不需要複製位圖所有你說關於.NET不支持透明度是絕對不正確 – Dai

2

簡單直接的答案是,你不能。期。 Compact Framework不支持託管C++(C++/CLI)。現在我想你可以創建UI組件作爲COM控件,然後手動將所有COM接口的東西移植到託管端,但這將是構建,調試和特別部署的噩夢。

你最好只是丟棄不安全的代碼,並使用P/Invokes在C#代碼中正確使用Win32 API。對於大多數情況,你可以達到你想要的並獲得良好的表現。如果你有一些絕對必須用C來完成速度,那麼創建一個你通過P/Invoke傳入緩衝區的庫。例如,圖像庫使用這種類型的機制來創建縮略圖等。

+0

謝謝這正是我正在尋找的---確認沒有現成的簡單解決方案來做這件事,所以我會遵循Celess的建議。 – agou