微軟Silverlight嵌入式開發實例詳解
本文將為大家講述銀光在嵌入式方面的應用,希望通過本文能為大家打開一個更加絢麗的Silverlight新界面。
#T#
這文章寫給對使用Silverlight for Embedded(SE)在Windows嵌入式系統上開發絢麗界面感興趣的朋友。要求讀者有一定的Win32基礎,C++基礎,雖然SE是基于COM的,但是不需要你了解太多有關COM的知識,但是知道COM的原理會幫助你更好的理解SE,另外如果有接觸過Silverlight/WPF會更好。
這里有一篇文章幫你從全局來了解SE:微軟最新嵌入式界面開發技術
首先看一下我已經跑起來的應用程序的效果(我沒有自己去做XAML,而是使用上次去微軟培訓時Samples提供的),這些圖是從模擬器截取下來的,看起來效果不是太好,后面我有解釋為什么,我放到NVIDIA Tegra上面跑起來效果很好(動畫的幀率在四五十左右),這么好的板子沒道理不好。
1.What is SE? Why COM based?
看到iPhone、Android的UX不錯,市場也漸漸的流入到對方手里,微軟問自己:我要拿點什么與他們對抗呢?既然我一向平臺做的不錯,那我就拿出一個UX開發平臺吧!這樣一個在Windows Embedded上的UX開發平臺(SE)誕生了。
SE是使用C++本地代碼編寫的。(本地代碼表示不是執行在托管層之上的,所以你無法使用像C#這樣的托管語言開發。)
SE依賴于Embedded XAML Runtime (EXR) Framework,而非依賴于.Net CF或者瀏覽器。不要跟Silverlight for Windows Mobile等技術混淆。
除此之外我們還知道SE是基于COM (Component Object Model)的。為啥微軟又搞出COM技術來,而不是基于.Net技術呢?
桌面系統上我們看到非常多的技術是基于.Net技術,比如XNA(http://creators.xna.com/en-US/),XNA Framework最初構建于.Net Framework 2.0之上,另外還加入了一些專注于游戲開發的類庫,以達到很高的代碼重用。代碼執行在通用語言運行時(Common Language Runtime)之上。在這樣的平臺上開發游戲,你只需要關系游戲本身的邏輯,還不需要擔心跨微軟平臺的問題。
那么微軟SE為什么沒有基于.Net?我認為還是運行時效率問題。CE設備(將來也許在Windows Phone上支持這個技術)多是CPU主頻不到500MHz、RAM不到256M的設備,考慮到這點微軟還是選擇了基于COM技術。雖然COM還是損耗了很多運行時效率,但是它帶來的好處也是明顯的:減少了開發時間和開發錯誤。
另外可以說微軟的技術很大部分是構架在COM技術上的:IE、Media Player等應用的擴展,DirectX中無處不COM,DirectShow的Graph Manager、Filter、Pin是COM組件…
2.SE技術的本質是什么?
傳統界面開發流程中負責UI的Designer和負責Code的Developer的工作混雜在一起,如果你從事過這樣的開發,相信你能了解到其中的痛苦:開發緩慢,開發流程不能很好的并行,Designer和Developer各自的成果不能很好的重用…
那么SE就采用XAML作為Designer和Developer之間銜接的關鍵,比較好的分開了他們之間的工作。其實并沒有完全的分開,WPF會更好的實現這個理想。SE底層使用DirectDraw或者OpenGL ES的驅動來實現硬件加速(先思考一下如何使用到硬件加速)。也就是說如果你采用SE開發的Application沒有這些硬件加速支持,那就可憐了。
與SE相比,微軟內部還有個更輕量級的界面開發技術,叫做Confetti,它的升級版叫做ConfettiPlus。它們的出現是解決沒有較好的硬件加速支持下的用戶界面(很好的圖形硬件加速代表著要不少Money)。
Confetti也是采用XAML很好的分割開Designer和Developer的工作,布局、圖形、動畫基本在XAML中定義(與SE的一個區別在于Confetti在XAML中只能定義簡單的動畫,復雜一點的動畫需要在Code中實現),Designer和Developer之間定義好接口(interation points)之后工作基本上能很好的分開了。(因為更輕量級,Designer和Developer工作還是沒有SE、WPF分開的充分。)
題外話:
Windows Mobile 6.5的界面即是基于ConfettiPlus開發出來的,如果你能拿到Windows Mobile的源碼,那么ConfettiPlus的源碼在private/shellw/confetti/core目錄下。基于ConfettiPlus編寫的Application依賴于Confetti Rendering Engine,從字面意思也能知道,它的職責主要是呈現(Render)。這個Engine低下會依賴GWES組件和DDRAW。
還記得我的文章http://www.cnblogs.com/wangkewei/archive/2009/10/16/1584773.html嗎?
這篇文章提到定制Today工作主要分為3部分:注冊表配置(包括兩部分:Today整體配置部分,比如整體布局、所要使用的CPR文件等;數據源配置,比如配置按鍵的布局等)、CPR文件(基于XML)編寫。再與這里介紹到的ConfettiPlus結合起來,不知道你是否能夠明白Windows Mobile 6.5 UI的內部運行機制?
這種開發模型可并不是微軟發明的,微軟發明了它自己的基于XML的XAML。如果你從事Android開發,你會發現采用Java開發的Android Application也很好的采用這種方式來分開,而且更成熟一點,為什么這么說?請看:
Android也是采用基于XML文件的可變化的UI開發模型,一個簡單的XML布局實例代碼如下:
- xml version="1.0" encoding="utf-8"?>
- <TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:text="Hello, Android"/>
這樣的XML文件你會經常在/res/layout下看到。
另外Android開發工具(ADT插件)會根據XML文件幫你生成好一些如下代碼:
- public final class R {
- public static final class attr {
- };
- public static final class drawable {
- public static final int icon=0x7f020000;
- };
- public static final class layout {
- public static final int main=0x7f030000;
- };
- public static final class string {
- public static final int app_name=0x7f040000;
- };
- };
這些代碼生成在R.java文件中,你本身的代碼需要通過這個R類來使用XML資源。
是不是很方便?這是目前SE不能辦到的,但是相信未來微軟會搞出來類似的一套。另外一個國外朋友已經幫我們寫好一個實現類似功能的SE開發插件:XAML2CPP,我會在后面介紹到。
通過上面的介紹相信你已經簡單了解了SE的本質,如果廣義上來看,UI(用戶看的到的部分)其實也可以看做是程序的數據,SE的本質是利用XML(也可以是其它存放數據的媒介)來分開程序的數據和代碼。
3.環境搭建
安裝順序:
(1). Visual Studio 2005(VS08不可以,因為CE 6.0是在VS08之前出來的)
(2). Visual Studio 2005 SP1
(3). Windows Embedded CE 6.0
CE 6.0的Key可以獲得一個180天試用版的,在這里:http://www.microsoft.com/windowsembedded/en-us/downloads/default.mspx
想看系統源碼的朋友記得把Shared Source選上。
(4). Windows Embedded CE 6.0 SP1
在這里下載:http://www.microsoft.com/downloads/details.aspx?familyid=BF0DC0E3-8575-4860-A8E3-290ADF242678&displaylang=en
(5). Windows Embedded CE 6.0 R2
在這里下載:http://www.microsoft.com/downloads/details.aspx?FamilyId=F41FC7C1-F0F4-4FD6-9366-B61E0AB59565&displaylang=en
(6). Windows Embedded CE 6.0 R2各月補丁
ARM處理器有關的補丁大概有這些,從網上應該都能搜到:
WinCEPB60-081231-Product-Update-Rollup-Armv4I.msi
WinCEPB60-090131-2009M01-Armv4I.msi
WinCEPB60-090228-2009M02-Armv4I.msi
WinCEPB60-090331-2009M03-Armv4I.msi
WinCEPB60-090430-2009M04-Armv4I.msi
WinCEPB60-090531-2009M05-Armv4I.msi
(7). Windows Embedded CE 6.0 R3
在這里下載:http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=bc247d88-ddb6-4d4a-a595-8eee3556fe46
(8). Windows Embedded CE 6.0 R3各月補丁(這個可以先不管)
下一步就可以打開Visual Studio 2005創建一個OS Design Project,定制過程比較簡單,你可以參考馬寧老師的文章:http://www.cnblogs.com/aawolf/archive/2009/10/31/1593596.html
特別提醒的是:如果你想在定制的系統上跑起來SE based Application的話一定記得選中Core OS\CEBASE\Shell and User Interface\User Interface\目錄下的Silverlight for Windows Embedded,或者直接加上SYSGEN:SYSGEN_XAML_RUNTIME。
前面提高如何使用到圖形硬件加速,你只需添加一個SYSGEN:SYSGEN_XAML_RUNTIME_DDRAW即可使用自帶的DirectDraw rendering plug-in來實現圖形硬件加速,當然你也可以使用OpenGL ES加速,后面會提到。
4.應用程序整體流程介紹
(1).實現我們需要通過Expression Blend生成好我們需要的XAML、Pictures等文件,XAML文件里面定義了控件、動畫、布局等UI元素。
(2).然后我們新建一個Win32智能設備項目工程(如果你需要ATL庫的支持,也可以選擇ATL智能設備項目工程),選擇Alchemy SDK,如果選擇其它CE SDK的話,需要自己包含頭文件和Lib庫。將第(1)步得到的XAML等文件導入到項目的資源(rc)文件里面。
特別提醒:很久前我使用XamlRuntime.h頭文件時發現它少包含了pwinuser.h頭文件,造成編譯時出現GESTUREINFO未定義錯誤。
我發現GESTUREINFO在頭文件pwinuser.h中定義,這個頭文件在C:\WINCE600\PUBLIC\COMMON\OAK\INC。
在Visual Studio 2005中包含該目錄,并在XamlRuntime.h中添加#include
再次編譯成功。該錯誤應該是微軟員工疏忽造成的。
(3).Code, Debug。
原文標題:Silverlight for Embedded應用編寫參考
鏈接:http://www.cnblogs.com/wangkewei/archive/2009/12/22/1629869.html