.Net Micro Framework界面開發官方標準功能僅支持WPF方式,而且所謂的WPF開發和Windows平臺上的WPF有很大的區別,即不支持可視化界面設計,也不支持XML方式界面格式定義,另外提供的控件也不多,又不含事件處理,因此使用上相對繁瑣,須要本身寫不少額外代碼。html
因而我在2009年末,自行開發了System.Windows.Froms庫,相關內容能夠參見我當時所寫的博客文章《開源System.Windows.Forms庫,讓.Net Micro Framework界面開發和上位機同樣簡單》。2010年5月份所寫的那篇《RFID技術在.Net Micro Framework中的應用》博文中所顯示的演示界面,就是用System.Windows.Froms庫開發的。編程
後來基於Cortex-M3(STM32F103)內核移植了.NET Micro Framework系統,因爲STM32F103的芯片主頻較低(72M),運行WPF和System.Windows.Froms庫比較吃力(而之前的.NET MF板子大部分都是原來WINCE的開發板,主頻和資源比較豐富,因此不管運行WPF仍是System.Windows.Froms庫都是蠻流暢的)。因此system.Windows.Froms庫開發完畢後,作了幾個Demo後,基本上就擱置了。另外又從新花時間開發了輕量級的界面開發庫TinyGUI(相關博文請參見《【玩轉.Net MF–06】爲Cortex-M3打造輕量級TinyGUI》)。windows
M3系統升級到STM32F207後,主頻提高爲120M,運行WPF和System.Windows.Froms庫基本上問題不大了,因此對原先的System.Windows.Froms庫又進行了升級改進。性能優化
之前的System.Windows.Froms庫主要模仿WINCE界面開發的,須要用觸摸筆才能操做,目前這種操做方式早就淘汰了,因此爲了支持手指直接操做,主要從如下幾個方面入手進行了改造。框架
(1)、從新編寫了軟鍵盤,支持手指單擊輸入;函數
(2)、默認字體由原來的12變爲16,爲了便於操控,控件也進行了擴大處理;工具
(3)、去掉了任務欄;性能
(4)、去掉任務菜單;測試
(5)、窗體界面大小覆蓋全屏;字體
System.Windows.Form目前包括Button、TextBox、ListBox、ComboBox、CheckBox、GroupBox、RadioButton、PictureBox、ProgressBar、VScrollBar、HScrollBar等11種經常使用控件,此外還提供了MessageBox方法,使用方法和Windows平臺的winform保持一致。
包含兩類窗體、普通窗體及模式窗體,含義和windows平臺相同。
軟鍵盤一共四個不一樣界面,經過上面的功能鍵進行切換。
目前還不支持中文輸入。
若是用戶比較喜歡重載OnPaint用Graphics類進行編程,那麼和在windows或wince編程中的體驗徹底同樣。不只如此Graphics類還擴展了一些函數,好比支持圖片透明、漸變、圓角矩形繪製等等方法。
Graphics類的聲明以下:
public sealed class Graphics : Microsoft.SPOT.DispatcherObject, IDisposable
{
public bool EmptyClipRect;
publicGraphics(Bitmap bmp);
publicGraphics(int width, intheight);
public Bitmap Bitmap { get;}
public Rectangle Clip { get;set; }
public int Height { get; }
public int Width { get; }
public void BlendImage(Bitmapsource, int destinationX, int destinationY, intsourceX, int sourceY, intsourceWidth, int sourceHeight, ushort opacity);
public void Clear(Colorcolor);
public static SizeComputeTextExtent(string text, Font font);
public static SizeComputeTextExtent(string text, Font font, intavailableWidth);
public void Dispose();
public void DrawEllipse(Penpen, Rectangle rect);
public void DrawEllipse(Penpen, int x, inty, int width, intheight);
public void DrawImage(Bitmapimage, int x, inty);
public void DrawImage(Bitmapimage, int destinationX, int destinationY, intsourceX, int sourceY, intsourceWidth, int sourceHeight);
public void DrawLine(Penpen, int x0, inty0, ushort Data);
public void DrawLine(Penpen, int x0, inty0, int x1, inty1);
public void DrawPolygon(Penpen, Point[] points);
public void DrawPolygon(Penpen, Point[] points, bool Sealed);
public void DrawRectangle(Penpen, Rectangle rect);
public void DrawRectangle(Penpen, int x, inty, int width, intheight);
public void DrawRoundRect(Penpen, Rectangle rect, int rx, int ry);
public void DrawRoundRect(Penpen, int x, inty, int width, intheight, int rx, intry);
public void DrawString(strings, Font font, Brushbrush, Rectangle rect);
public void DrawString(strings, Font font, Brushbrush, int x, inty);
public void DrawString(strings, Font font, Brushbrush, Rectangle rect, StringFormat format);
public void FillEllipse(Brushbrush, Rectangle rect);
public void FillEllipse(Brushbrush, int x, inty, int width, intheight);
public void FillPolygon(Brushbrush, Point[] points);
public void FillRectangle(Brushbrush, Rectangle rect);
public void FillRectangle(Brushbrush, int x, inty, int width, intheight);
public void GetTranslation(outint x, out int y);
public void ResetClip();
public void RotateImage(intangle, int destinationX, int destinationY, Bitmapbitmap, int sourceX, intsourceY, int sourceWidth, int sourceHeight, ushortopacity);
public void Scale9Image(intxDst, int yDst, intwidthDst, int heightDst, Bitmap bitmap, intleftBorder, int topBorder, int rightBorder, intbottomBorder, ushort opacity);
public void SetPixel(Colorcolor, int x, inty);
public void StretchImage(intxDst, int yDst, intwidthDst, int heightDst, Bitmap bitmap, intxSrc, int ySrc, intwidthSrc, int heightSrc, ushort opacity);
public void TileImage(intxDst, int yDst, Bitmapbitmap, int width, intheight, ushort opacity);
public void Translate(intdx, int dy);
}
因爲.Net Micro Framework的IDE開發環境並不支持所見即所得的窗體設計功能,因此咱們能夠用.Net Framework和.Net Compact Framework開發環境設計窗體,而後把相關窗體文件(如Form1.cs和Form1.designer.cs文件)直接導入到.Net Micro Framework工程中,稍加刪減便可爲.Net Micro Framework所用。
(window 控件的字體能夠設置爲:字體"Arial" 大小11.25F,這種字體和底層設備的字體大小比較接近 )
因爲字體文件相對較大,因此YFSoft.Font庫文件是全開源的,用戶能夠根據須要自行定義字體,設置好進行編譯,替換系統所提供的YFSoft.Font.*文件便可。
public Font(string name, float emSize, FontStylestyle)
{
switch(this._name)
{
default:
case"Arial":
switch(style)
{
//case FontStyle.Bold:
//_value = YFResource.GetFont(YFResource.FontResources.YFArial16B);
//break;
default:
case FontStyle.Regular:
_value = YFResource.GetFont(YFResource.FontResources.YFArial16);
break;
}
break;
}
this._size = emSize;
this._style= style;
}
根據須要上述代碼進行必要的調整,理論上能夠支持任意字體了。
關於.NET MF字體如何定製,請參見我之前寫的博文《.NetMicro Framework研究—中文顯示》和《.NetMicro Framework研究—Tinyfnt字體研究》。
字體工具下載:http://www.sky-walker.com.cn/MFRelease/Tools/YFTFConvert.rar
(1)、採用組態軟件進行界面設計,並自動生成界面相關的代碼。
(2)、再擴展幾個工業用控件,好比動態曲線,表格,儀表盤顯示等等。
視頻播放地址:http://v.youku.com/v_show/id_XNDI2NzM4Mjk2.html
從演示效果上看,添加比較多的控件,性能還不盡人意。不過這是基於STM32F207(主頻120M)測試的,後續採用STM32F407(主頻168M)的芯片,性能會有比較大的改善(固然本框架從軟件角度還會繼續進行性能優化),想之前在STM32F103(主頻72M)芯片上,這個框架根本跑步起來。期待ST推出性能更強大的Cortex-M3或Cortex-M4芯片。
固然若是你須要在當前平臺,界面跑得更快,那只有先選擇TinyGUI了,不過在寫代碼上,您本身得多下點功夫了。
下載地址:http://www.sky-walker.com.cn/MFRelease/library/V42/YFSoft.WinForm.rar