zoukankan      html  css  js  c++  java
  • 开源System.Windows.Forms库,让.Net Micro Framework界面开发和上位机一样简单

              .Net Micro Framework本身支持WPF界面开发,但是对国内用户来说,WPF相对比较陌生,并且.Net Micro Framework对此功能的支持并不完善,ButtonTextBoxListBoxPictureBox等等基本控件并不支持,所以要想在.Net Micro Framework上开发出一套相对复杂的窗体界面还是比较困难的。

    System.Windows.Form库就是在这种背景下开发出来的,它提供的接口和控件,和.Net Framework.Net Compact Framework保持兼容,也可以说是.Net Compact Framework的一个窗体子集(不仅仅是子集,有写功能略有扩展,如Graphics类支持图片透明、渐变、圆角矩形绘制等等方法)。

    由于.Net Micro FrameworkIDE开发环境并不支持所见即所得的窗体设计功能(以后有时间可以为MF开发这一功能),所以我们可以取巧,用.Net Framework.Net Compact Framework开发环境设计窗体,然后把相关窗体文件(如Form1.csForm1.designer.cs文件)直接导入到.Net Micro Framework工程中,稍加删减即可为.Net Micro Framework所用。

    System.Windows.Form目前包括ButtonTextBoxListBoxComboBoxCheckBoxGroupBoxRadioButtonPictureBoxProgressBarVScrollBarHScrollBar11种常用控件,此外还提供了MessageBox方法。

    包含两类窗体、普通窗体及模式窗体,含义和windows平台相同。

    此外System.Windows.Form提供两种界面风格,上面的计算器显示的是SideShow风格的窗体,缺省风格和.Net Compact Framework一致(如下图):

    值得一提的是,System.Windows.Form完美支持中文,提供了Arial两种类型的字体(规则、粗体),含有3000多个常用汉字及字符。其使用方法和.Net Framework一致,如果您一致使用缺省字体,您会忽略还有字体设置这一说法的存在。不过考虑到.Net Micro Framework用到资源有限的设备上,所以还是把字体库进行了剥离,可以根据需要自行增删字体(默认字库的大小为546k)。

    下面的图例就是基于System.Windows.Form库开发的应用程序。

     

     

    System.Windows.Form库支持多窗体,并且支持软键盘,所以考虑到窗体关闭、切换等操作,故引入了任务栏(和Windows Mobile的任务栏有些类似),相关功能如下图所示。 

    为了便于说明System.Windows.Form库的方便性,我们试着比较一下.Net Micro Framework默认窗体开发和用System.Windows.Form库开发的代码区别。

    .Net Micro Framework默认窗体程序包含两个文件,一个是按钮配置程序GPIOButtonInputProvider.cs,相关代码如下:

    using Microsoft.SPOT;

    using Microsoft.SPOT.Input;

    using Microsoft.SPOT.Hardware;

    using Microsoft.SPOT.Presentation;

    namespace MFWindowApplication1

    {

        public sealed class GPIOButtonInputProvider

        {

            public readonly Dispatcher Dispatcher;

            private ButtonPad[] buttons;

            private DispatcherOperationCallback callback;

            private InputProviderSite site;

            private PresentationSource source;

     

            /////////////////////省略多个按钮操作相关函数/////////////////////

        }

    }

    第二个是主体文件Program.cs,代码如下:

    using System;

    using Microsoft.SPOT;

    using Microsoft.SPOT.Input;

    using Microsoft.SPOT.Presentation;

    using Microsoft.SPOT.Presentation.Controls;

    namespace MFWindowApplication1

    {

        public class Program : Microsoft.SPOT.Application

        {

            public static void Main()

            {

                Program myApplication = new Program();

                Window mainWindow = myApplication.CreateWindow();

                GPIOButtonInputProvider inputProvider = new GPIOButtonInputProvider(null);

                myApplication.Run(mainWindow);

            }

            private Window mainWindow;

            public Window CreateWindow()

            {

                mainWindow = new Window();

                mainWindow.Height = SystemMetrics.ScreenHeight;

                mainWindow.Width = SystemMetrics.ScreenWidth;

                Text text = new Text();

                text.Font = Resources.GetFont(Resources.FontResources.small);

                text.TextContent = Resources.GetString(Resources.StringResources.String1);

                text.HorizontalAlignment = Microsoft.SPOT.Presentation.HorizontalAlignment.Center;

                text.VerticalAlignment = Microsoft.SPOT.Presentation.VerticalAlignment.Center;

                mainWindow.Child = text;

                mainWindow.AddHandler(Buttons.ButtonUpEvent, new ButtonEventHandler(OnButtonUp), false);

                mainWindow.Visibility = Visibility.Visible;

                Buttons.Focus(mainWindow);

                return mainWindow;

            }

            private void OnButtonUp(object sender, ButtonEventArgs e)

            {

                Debug.Print(e.Button.ToString());

            }

        }

    }

     

    而用System.Windows.Form库开发的窗体程序则和.Net Framework.Net Compact Framework相同,包括三个文件,第一个文件是窗体设计文件Form1.Designer.cs,代码如下:

    namespace Test

    {

        partial class Form1

        {

            #region Windows Form Designer generated code

            private void InitializeComponent()

            {

                this.label1 = new System.Windows.Forms.Label();

                this.SuspendLayout();

                //

                // label1

                //

                this.label1.Location = new System.Drawing.Point(105, 69);

                this.label1.Name = "label1";

                this.label1.Size = new System.Drawing.Size(125, 12);

                this.label1.Text = ".Net Micro Framework";

                //

                // Form1

                //

                this.Controls.Add(this.label1);

                this.Name = "Form1";

                this.Text = "Form1";

                this.ResumeLayout(false);

            }

            #endregion

            private System.Windows.Forms.Label label1;

        }

    }

    第二个是窗体文件Form1.cs,代码如下:

    using System;

    using System.Drawing;

    using System.Windows.Forms;

    namespace Test

    {

        public partial class Form1 : Form

        {

            public Form1()

            {

                InitializeComponent();

                this.KeyDown += new KeyEventHandler(Form1_KeyDown);

            }

            void Form1_KeyDown(object sender, KeyEventArgs e)

            {

                Debug.Print(e.KeyCode.ToString());

            }

        }

    }

    第三个是启动文件Program.cs,代码如下:

    using System;

    namespace Test

    {

        static class Program

        {

            static void Main()

            {

                Application.Run(new Form1());

            }

        }

    }

     

    从以上比较可以看出,采用System.Windows.Form库开发的窗体简单,并且和.Net Framework.Net Compact Framework没有任何区别,所以很方便的把相应平台上的代码移植到.Net Micro Framework上来。

    System.Windows.Form库除了字体操作和位图取之.Net Micro Framework原图形库,其它所有函数和类库,均自行编写,和.Net Micro Framework自带的WPF库没有任何关系。目前System.Windows.Form库开发的难点主要在控件焦点切换和刷新方面,现在的版本是测试版,后面将继续优化,如有可能核心源码考虑用C++本地代码进行实现,这样性能就会得到大幅度提升。

    后续版本的开发计划暂考虑如下:

    1、  TextBox控件继续完善,支持光标操作;

    2、  支持中文输入法;

    3、  开发ListViewTreeView控件;

    4、  部分核心代码用C++本地代码实现。

     

    【源码下载】http://www.sky-walker.com.cn/yefan/SourceCode/YFWindows.rar

    【技术交流】http://space.cnblogs.com/group/MFSoft/

     

     

  • 相关阅读:
    HDU 4920 Matrix multiplication
    UVALive 5545 Glass Beads
    POJ 2230 Watchcow
    hdu 1878 欧拉回路
    hdu 3018 Ant Trip
    2015 Multi-University Training Contest 1 hdu 5296 Annoying problem
    深入理解php内核 编写扩展 I:介绍PHP和Zend
    PHP数组实际占用内存大小的分析
    深入理解php底层:php生命周期
    PHP实现的进度条效果详解
  • 原文地址:https://www.cnblogs.com/yefanqiu/p/1625164.html
Copyright © 2011-2022 走看看