【物联网智能网关-04】WinForm for .NET MF 功能一览-阿里云开发者社区

开发者社区> KB小秘书> 正文

【物联网智能网关-04】WinForm for .NET MF 功能一览

简介:  .Net Micro Framework界面开发官方标准功能仅支持WPF方式,并且所谓的WPF开发和Windows平台上的WPF有很大的区别,即不支持可视化界面设计,也不支持XML方式界面格式定义,另外提供的控件也很少,又不含事件处理,所以使用上相对繁琐,需要自己写很多额外代码。
+关注继续查看

 .Net Micro Framework界面开发官方标准功能仅支持WPF方式,并且所谓的WPF开发和Windows平台上的WPF有很大的区别,即不支持可视化界面设计,也不支持XML方式界面格式定义,另外提供的控件也很少,又不含事件处理,所以使用上相对繁琐,需要自己写很多额外代码。

于是我在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》)。

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平台相同。
image.png

软键盘简介
image.png

软键盘一共四个不同界面,通过上面的功能键进行切换。

目前还不支持中文输入。

Graphics类简介
如果用户比较喜欢重载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所用。
image.png

   

(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)、再扩展几个工业用控件,比如动态曲线,表格,仪表盘显示等等。
image.png

演示视频
视频播放地址: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

MF简介:http://blog.csdn.net/yefanqiu/article/details/5711770

MF资料:http://www.sky-walker.com.cn/News.asp?Id=25

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
物联网云端一体人工智能方案的探索
说到人工智能,大家并不陌生,无论是围棋大战中战胜顶尖段位人类围棋手的Alpha Go,还是弹跳自如的波士顿机器狗。而无数的科幻电影更是为人类展示了一个无比美好的未来,而在科幻电影中的场景,正逐渐融入到我们的日常生活中。
80 0
Winform 注册机通用软件注册功能之建立有效的软件保护机制
本文转载:http://www.cnblogs.com/umplatform/archive/2013/01/23/2873001.html  众所周知,一些共享软件往往提供给使用者的是一个功能不受限制的限时使用版,在试用期内使用者可以无限制的使用软件的全部功能(只是可能会出现提示使用者 注册的窗口),试用期一过部分(或全部)功能失效,要想继续使用只能向作者索取注册码(或注册文件)完成对软件的合法注册,注册后的软件将解除一切使用限 制。
719 0
.net try-finally功能测试
一、MSDN中对try-finally语句的解释 finally 块用于清除 try 块中分配的任何资源,以及运行任何即使在发生异常时也必须执行的代码。控制总是传递给 finally 块,与 try 块的退出方式无关。
465 0
目标驱动系统模式,能否成为实现人工通用智能(AGI)的关键?
组织开发AI方案时采取的一大核心模式,正是目标驱动型系统模式。与其他AI模式一样,这种形式的AI能够解决一系列原本需要人类认知能力才能处理的常见问题。
713 0
封神-核心功能 | 钉钉告警+数据网关
封神-核心功能 | 钉钉告警+数据网关
1898 0
基于对象存储 OSS 的智能数据分析处理框架和功能
今年参加了 2019 全球闪存峰会(Flash Memory World),分享了“基于云存储的智能数据分析处理架构”,重点介绍在对象存储 OSS 之上的数据处理功能,现整理相关内容和大家探讨。
2131 0
用vb.net做一个RSS阅读器续--分类功能(博客园专用)
上次发布了一个简易的RSS阅读器的源代码这次给它加上了分类功能http://www.cnblogs.com/aowind/archive/2005/03/18/120942.html几有三个过程哈!对了,还有上次一位朋友把代码改写成了C#.
602 0
+关注
1090
文章
1253
问答
来源圈子
更多
阿里云最有价值专家,简称 MVP(Most Valuable Professional),是专注于帮助他人充分了解和使用阿里云技术的意见领袖阿里云 MVP 奖项为我们提供了这样一个机会,向杰出的意见领袖表示感谢,更希望通过 MVP 将开发者的声音反映到我们的技术路线图上。
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载
《2021云上架构与运维峰会演讲合集》
立即下载