一種基於ManagedC實現WPF窗體與GDI窗體消息互操作的方法
2023-05-23 10:40:01 3
專利名稱:一種基於Managed C實現WPF窗體與GDI窗體消息互操作的方法
技術領域:
本發明涉及一種界面製作相關技術,尤其是涉及一種基於Managed C實現WPF窗體與GDI窗體消息互操作的方法。
背景技術:
WPF是基於DirectX技術的圖形系統,利用硬體加速及圖形向量渲染,從呈現效果及性能上大大改善了傳統2D圖形窗口用戶體驗,其完善的Ui架構能快速幫助程序開發出媲美Mac的酷炫界面。在WPF中,傳統的窗口概念已發生了改變,窗口也是其渲染系統中一個普通的可視元素,並且與其它所有界面元素統一渲染,用戶無法直接在這窗口區域繪製自己圖形(因為一個區域只能用一種方式來渲染)。三維引擎或者其它的很多傳統的應用程式,都是基於GDI的窗口句柄,截獲其重繪消息,將自定義的渲染結果呈現在窗口上,並通過GDI的消息機制獲取用戶的輸入,其中⑶I (Graphics Device Interface)為圖形設備接口,其為Windows的子系統,負責在視訊顯示器和印表機上顯示圖形。隨著計算機硬體快速發展,用戶對軟體的體驗要求越來越高,GDI窗口及相關的技術在開發用戶圖形界面上已漸漸顯得力不從心。利用WPF提供HWNDH0ST技術,可以將⑶I窗口嵌入到wpf中應用程式中,在⑶I窗口區域實現自定義渲染,而在非GDI區域實現各種用好的圖形界面。當前實現WPF窗體的方法有多種,不管是使用D3DImage還是使用HWNDH0ST技術,都普遍存在兩者交互性差如,窗口大小變化時出現閃爍,應用程式無法接收滑鼠鍵盤一些特殊輸入消息等問題。
發明內容
本發明的目的就是為了克服上述現有技術存在的缺陷而提供一種適用範圍廣、擴展性好、操作方便的基於Managed C實現WPF窗體與⑶I窗體消息互操作的方法。本發明的目的可以通過以下技術方案來實現一種基於Managed C實現WPF窗體與⑶I窗體消息互操作的方法,其特徵在於,包括採用Managed c++創建一個⑶I窗口,並提供相應的API,同時生成一個DLL ;在WPF應用程式中定義一個派生自HwndHost的窗口類,在該窗口類將DLL提供的⑶I作為其子窗口,並以委託方式實現⑶I窗口中需要處理的消息。具體過程如下a)採用c#定義一個派生自HwndHost的窗口類;b)採用Managed c++註冊一個⑶I窗口,實現將· net程序傳過來的委託函數轉化為C++可處理的函數指針;c)判斷是否註冊成功,若為是,創建一個⑶I窗口,並返回該窗口的句柄,執行步驟d),否則,返回步驟b);d)將⑶I窗口作為HwndHost類的子窗口,得到一個在WPF中呈現自定義應用程式的⑶I子窗口 ;e)將⑶I子窗口放在WPF窗口上,該⑶I子窗口和其它WPF控制項一樣放在WPF窗口的任意位置;
f)⑶I子窗口自定義圖形渲染,並實現圖形呈現的更新;同時WPF各個界面控制項根據WPF消息的機制及渲染機制實現接收、轉發用戶輸入及界面呈現;g)⑶I窗口根據WPF用戶輸入期望的圖形呈現,WPF界面同時將圖形的屬性變化通過豐富的控制項Π反饋給用戶。所述的派生自HwndHost的窗口類中包括窗口過程函數、滑鼠構子處理函數和鍵盤鉤子處理函數。所述的⑶I子窗口根據窗口過程函數實現圖形呈現的更新。與現有技術相比,本發明具有以下優點I)適用範圍廣,提供獨立於應用⑶I窗口 dll庫,該dll可以很多windows程序中使用;2)擴展性好,使用Managed c++實現的dll,可以直接在Dot Net c#語言中直接使用,避免使用p/invoke聲明大量的API及結構體,也提供了更好的擴展性;3)操作方便,將窗口過程在應用程式中實現,大大方便應用中各種消息處理過程。
圖1為本發明實現的流程圖。
具體實施例方式下面結合附圖和具體實施例對本發明進行詳細說明。實施例如圖1所不,一種基於Managed C實現WPF窗體與⑶I窗體消息互操作的方法,包括;採用Managed c++創建一個⑶I窗口,並提供相應的API,同時生成一個DLL ;在WPF應用程式中定義一個派生自HwndHost的窗口類,在該窗口類將DLL提供的⑶I作為其子窗口,並以委託方式實現⑶I窗口中需要處理的消息。本發明的具體過程如下I)編寫好⑶I窗口類程序,並調試通過,以dll的方式輸出;2)在WPF程序中實現一個派生自HwndHost的窗口類,在該類中實現一個窗口過程函數,提供窗口類的名稱,將窗口過程函數及窗口類名作為參數,調用GDI窗口創建子窗口,並子窗口作為HwndHost的子窗口 ;3)在⑶I窗口中實現自定義圖形渲染,wpf窗口接收滑鼠,鍵盤等各種用戶輸入,並根據需求轉發給GDI窗口,GDI窗口根據從程序中獲取的條件更新渲染;圖形屬性更新通過wpf屬性綁定機制及時的反饋在程序界面上。
權利要求
1.一種基於Managed C實現WPF窗體與⑶I窗體消息互操作的方法,其特徵在於,包括 採用Managed c++創建一個⑶I窗口,並提供相應的API,同時生成一個DLL ;在WPF應用程式中定義一個派生自HwndHost的窗口類,在該窗口類將DLL提供的GDI作為其子窗口,並以委託方式實現⑶I窗口中需要處理的消息。
2.根據權利要求1所述的一種基於ManagedC實現WPF窗體與GDI窗體消息互操作的方法,其特徵在於,具體過程如下 a)採用c#定義一個派生自HwndHost的窗口類; b)採用Managedc++註冊一個⑶I窗口,實現將· net程序傳過來的委託函數轉化為c++可處理的函數指針; c)判斷是否註冊成功,若為是,創建一個GDI窗口,並返回該窗口的句柄,執行步驟d),否則,返回步驟b); d)將⑶I窗口作為HwndHost類的子窗口,得到一個在WPF中呈現自定義應用程式的GDI子窗口 ; e)將⑶I子窗口放在WPF窗口上,該⑶I子窗口和其它WPF控制項一樣放在WPF窗口的任意位置; f)GDI子窗口自定義圖形渲染,並實現圖形呈現的更新;同時WPF各個界面控制項根據WPF消息的機制及渲染機制實現接收、轉發用戶輸入及界面呈現; g)⑶I窗口根據WPF用戶輸入期望的圖形呈現,WPF界面同時將圖形的屬性變化通過豐富的控制項Π反饋給用戶。
3.根據權利要求2所述的一種基於ManagedC實現WPF窗體與GDI窗體消息互操作的方法,其特徵在於,所述的派生自HwndHost的窗口類中包括窗口過程函數、滑鼠構子處理函數和鍵盤鉤子處理函數。
4.根據權利要求3所述的一種基於ManagedC實現WPF窗體與GDI窗體消息互操作的方法,其特徵在於,所述的GDI子窗口根據窗口過程函數實現圖形呈現的更新。
全文摘要
本發明涉及一種基於Managed C實現WPF窗體與GDI窗體消息互操作的方法,包括採用Managed c++創建一個GDI窗口,並提供相應的API,同時生成一個DLL;在WPF應用程式中定義一個派生自HwndHost的窗口類,在該窗口類將DLL提供的GDI作為其子窗口,並以委託方式實現GDI窗口中需要處理的消息。與現有技術相比,本發明具有適用範圍廣、擴展性好、操作方便等優點。
文檔編號G06F9/44GK103034490SQ20121051780
公開日2013年4月10日 申請日期2012年12月5日 優先權日2012年12月5日
發明者鄭婉清, 林秀全, 張生言 申請人:上海創圖網絡科技發展有限公司