.Net Micro Framework研究—Windows桌面

简介:

今天是2007年最后一天,还有几个小时就迎来充满期待的2008年了。元旦放假至今不到48个小时的时间里,我至少有30多个小时坐在电脑前研究MF相关技术,在缺少必要的硬件的情况下,利用现有的资料,扩充了现有的模拟器功能。也希望像我这样的穷人们,借助模拟器,能体验一下以前只有拥有硬件才能调试的功能。

以前为了介绍MF图形方面的功能,我做了一个“北京2008奥运场馆查询”程序,现在看来那个程序,已经不足以展示MF整体功能的强大。既然Windows 2000 /XP/vista,Windows CE(Windows Mobile)程序都有Windows桌面和开始菜单,那么我们的.Net Micro Framework也应该有一个。岂能光说不练,下面就是我们MF Windows的桌面和开始菜单。

 

看了这个截图,也许有的网友会认为,这有什么难,这不是从windows mobile系统上做了一个截图嘛。实话实说,这样认为还真是想简单了,除了windows图标和小喇叭外,其它部分全部用代码实现,光字体就用了两种不同大小的字库,此外时钟也不仅仅做个样子,也是能正常刷新显示的。开始菜单我们也有,不仅能选择,还能执行对应的功能,不要急,下面我们一一说起。
 


在上几篇blog上我说了,我做的模拟器又扩展了两个键(菜单键和返回键),别说,这个程序在微软的模拟器上运行起来还真有问题,因为它不支持菜单键,无法弹出菜单来。
菜单上项目也不仅仅是摆设,和模拟器新增的功能结合在一起,做了一个功能测试大荟萃。让我们先看看GPIO测试的功能在“windows桌面”是怎样的?

 

菜单上选中“GPIO测试”项,按一下键盘上的回车或者单击模拟器上的“OK”键,就进入上图界面。单击模拟右下角的“>>>”项,展开模拟器上的GPIO测试面板。
单击模拟上的I输入开关,桌面上显示的输入信息也同步发生了变化,Q输出是有用户程序控制的,灯会一一亮起或关灭,桌面上的显示也和模拟器像对应(插一句,千万不要以为上面模拟器和模拟LCD中的程序为同一个,两者彼此独立,用户程序通过正常的指令和模拟器交互(当然同样的代码对实际硬件也一样))。
下面我们再看看“AD测试”功能。

 

通过开始菜单,我们进入“AD测试”模块,相应的,我们单击“<<<”旁边的“GPIO”字符,弹出选择菜单,我们单击“AD”,模拟器呈现AD模拟数据操作面板。
移动滑块,我们发现桌面中的数据同步发生了改变,不好意思,模拟出部分被弹出菜单给挡住了,我们再来一张截图。

 

QW0是由用户程序控制的,看的出来,模拟器忠实的获取了该数据并显示了出来。说到这里我还得多说几句,其实模拟器的部分程序更像运行在实际硬件系统中的IO驱动程序,spi读写指令操作的是字节数组,所以上传的数据是否浮点型、是否整形等等,全都需要约定,这也决定了不同的厂家对同样的物理信号进行采集,传到MF系统中的数据有可能不同,不过通过特定的换算,最终的结果一定是差不多的。
下面说一下I2C总线,I2C我的理解和串口通信、CAN口通信差不多,都是两个相对独立的设备进行数据交互,I2C和CAN通信一样,需要设置设备地址,此外还需设置一下时钟主频。下图是测试程序界面。

 

前三个数据是用户程序进行修改的,由于有时间差,二者数据刷新时刻不同,所以不一致,后五个数据是模拟输入的,可以看出桌面上的显示已经可以同步更新了。用这种方式模拟I2C,我也觉得有些不妥,以后有更好的方案我再修改。
细心的用户一定会发现MF“Windows 桌面”右上角的时间在不断的变化,第一幅图是2007年12月31日21:39:23,最后一幅图的时间是22:27:33,也就是说,写这篇文章大概花了我50分钟,这是我在word写这篇文章的用时,接着再花一些时间写到我blog上,我想所有的一切完毕后,我想大概就可以聆听2008年的第一声钟声了。
祝大家新年快乐!!!

 


 
附:部分核心代码
 

 
  1. public override void OnRender(DrawingContext dc)  
  2. {  
  3.     //绘制背景                 
  4.     dc.DrawRectangle(new SolidColorBrush(ColorUtility.ColorFromRGB(41,113,189)),null , 0, 0, Width, Height);  
  5.       
  6.     //菜单条  
  7.     LinearGradientBrush lgb = new LinearGradientBrush(ColorUtility.ColorFromRGB(51,160,241), ColorUtility.ColorFromRGB(16,75,161), 0, 0, Width, 0);  
  8.     dc.DrawRectangle(lgb, null, 0, 0, Width, 26);  
  9.    
  10.     //开始菜单  
  11.     dc.DrawImage(Resources.GetBitmap(Resources.BitmapResources.Win), 0, 0);   
  12.    
  13.     //分割线  
  14.     dc.DrawLine(new Pen(Color.White), 26, 0, 26, 25);   
  15.    
  16.     //显示“开始”  
  17.     dc.DrawText("开始", YFFont, Color.White, 29, 7);  
  18.    
  19.     //显示小喇叭  
  20.     dc.DrawImage(Resources.GetBitmap(Resources.BitmapResources.Sound), 320 - 75, 6);   
  21.    
  22.     //状态区  
  23.     dc.DrawRectangle(new SolidColorBrush(ColorUtility.ColorFromRGB(189, 235, 255)), new Pen(Color.Black), 0, Height-26, Width, 26);  
  24.    
  25.     //标识  
  26.     dc.DrawText("叶帆工作室荣誉出品", YFFont, Colors.Gray, 200, 220);  
  27.    
  28.     switch (txtState.TextContent)  
  29.     {  
  30.         case "GPIO测试":  
  31.             string strPace = "   ";  
  32.             dc.DrawText("输入: I0 I1 I2 I3 I4 I5 I6 I7", YFFont, Colors.Black , 40, 50);  
  33.             dc.DrawText((input[0].Read() ? "1" : "0") + strPace + (input[1].Read() ? "1" : "0") + strPace + (input[2].Read() ? "1" : "0") + strPace + (input[3].Read() ? "1" : "0") + strPace + (input[4].Read() ? "1" : "0") + strPace + (input[5].Read() ? "1" : "0") + strPace + (input[6].Read() ? "1" : "0") + strPace + (input[7].Read() ? "1" : "0"), YFFont, ColorUtility.ColorFromRGB(255, 255, 0), 78, 75);  
  34.    
  35.             dc.DrawText("输出: Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7", YFFont, Colors.Black, 40, 100);  
  36.             dc.DrawText((output[0].Read() ? "1" : "0") + strPace + (output[1].Read() ? "1" : "0") + strPace + (output[2].Read() ? "1" : "0") + strPace + (output[3].Read() ? "1" : "0") + strPace + (output[4].Read() ? "1" : "0") + strPace + (output[5].Read() ? "1" : "0") + strPace + (output[6].Read() ? "1" : "0") + strPace + (output[7].Read() ? "1" : "0"), YFFont, ColorUtility.ColorFromRGB(255, 255, 0), 78, 125);  
  37.             break;  
  38.         case "AD测试":  
  39.             dc.DrawText("AD: AW0=" + ReadWriteAD((Int16)QAW).ToString() + "   QW0=" + QAW.ToString(), YFFont, Colors.White, 60, 100);  
  40.             break;  
  41.         case "I2C测试":  
  42.             //I2C读写  
  43.             byte[] bytRData = new byte[8];  
  44.             byte[] bytWData = new byte[3];  
  45.             bytWData[0] = (byte)IntI2CNum;  
  46.             bytWData[1] = (byte)(IntI2CNum * 2);  
  47.             bytWData[2] = (byte)(IntI2CNum * 3);  
  48.             I2CDevice.I2CTransaction[] i2c = new I2CDevice.I2CTransaction[2];  
  49.             i2c[0] = I2CBus.CreateReadTransaction(bytRData);  
  50.             i2c[1] = I2CBus.CreateWriteTransaction(bytWData);  
  51.             I2CBus.Execute(i2c, 100);   //执行  
  52.    
  53.             string strPace1 = " ";  
  54.             dc.DrawText("I2C(字节0-7):", YFFont, Colors.Black, 50, 80);  
  55.             string strInfo = bytRData[0].ToString() + strPace1 + bytRData[1].ToString() + strPace1 + bytRData[2].ToString() + strPace1 + bytRData[3].ToString() + strPace1 + bytRData[4].ToString() + strPace1 + bytRData[5].ToString() + strPace1 + bytRData[6].ToString() + strPace1 + bytRData[7].ToString();  
  56.             dc.DrawText(strInfo, YFFont, ColorUtility.ColorFromRGB(255, 255, 0), 50, 105);  
  57.             break;  
  58.         default:  
  59.             //.Net Micro Framework  
  60.             dc.DrawRectangle(new SolidColorBrush(Color.White), new Pen(Color.White), 55, 90, Width - 110, 50);  
  61.             dc.DrawText(".Net Micro Framework", Resources.GetFont(Resources.FontResources.MF), Colors.Black, 60, 105);  
  62.             break;   
  63.     }  
  64.    
  65.     //菜单显示  
  66.     if (bShowMenu)  
  67.     {  
  68.         menu.DrawMenu(dc);   
  69.      }  
  70.  }  
  71.    
  72. //按键信息  
  73. protected override void OnButtonDown(ButtonEventArgs e)  
  74. {  
  75.     switch (e.Button)  
  76.     {  
  77.         //按下确定键  
  78.         case Button.Select:  
  79.             if (bShowMenu)  
  80.             {  
  81.                 txtState.TextContent = menu.Text;  
  82.                 bShowMenu = false;  
  83.                 this.UpdateLayout();  
  84.             }  
  85.             break;  
  86.         //按下左键  
  87.         case Button.Left:  
  88.             break;  
  89.         //按下右键  
  90.         case Button.Right:  
  91.             break;  
  92.         //按向上  
  93.         case Button.Up:  
  94.             if (bShowMenu)  
  95.             {  
  96.                 menu.SelectIndex--;  
  97.                 this.UpdateLayout();  
  98.             }  
  99.             break;  
  100.         //按向下  
  101.         case Button.Down:  
  102.             if (bShowMenu)  
  103.             {  
  104.                 menu.SelectIndex++;  
  105.                 this.UpdateLayout();  
  106.             }  
  107.             break;  
  108.         //按下菜单  
  109.         case Button.Menu:  
  110.             bShowMenu = !bShowMenu;  
  111.             if (bShowMenu) menu.SelectIndex = 0;  
  112.             this.UpdateLayout();   
  113.             break;  
  114.         //按下返回键  
  115.         case Button.Back:  
  116.             txtState.TextContent = "就绪";  
  117.             break;  
  118.     }  
  119. }  
  120.  
  121.  
  122.  

 







本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/322933,如需转载请自行联系原作者

相关文章
|
6天前
|
C# Windows
.NET开源的一个小而快并且功能强大的 Windows 动态桌面软件
.NET开源的一个小而快并且功能强大的 Windows 动态桌面软件
|
6天前
|
C# Windows
C#安装“Windows 窗体应用(.NET Framework)”
C#安装“Windows 窗体应用(.NET Framework)”
57 0
|
Windows
.Net Micro Framework研究—Windows桌面
既然Windows 2000 /XP/vista,Windows CE(Windows Mobile)程序都有Windows桌面和开始菜单,那么我们的.Net Micro Framework也应该有一个。岂能光说不练,下面就是我们MF Windows的桌面和开始菜单。
637 0
.Net Micro Framework研究—带AD的模拟器
不知道为什么,很简单的代码他们总写的很复杂,让你很难看懂,幸好有以前的相关的经验做底子,用了大半天的时间模入模出都搞定了。
554 0
|
Windows
解读Windows Phone“.NET研究”开发的六个关键模块
  今天给大家提供的是一系列的Windows Phone 7 开发的文章,包括提供试用版应用程序、返回键、全景视图、项目模板以及页面间的导航等。本节内容是Windows Phone 7开发之:提供试用版应用程序。
1185 0
|
Windows
一起谈.NET技术,Windows Mobile 6.5的开始菜单
缘由 由于 luafie 对 Windows Mobile打包时增加快捷方式到开始菜单的方法 有些疑问,我把自己的经验总结一下。   历史发展 Windows Mobile的开始菜单一直被我认为是错误的设计。
860 0
|
网络安全 开发工具 Windows
运行MeeGo SD“.NET研究”K 的windows版本
系统配置要求: 1.       MeeGo SDK 目前只支持 Windows Xp和 Windows 7操作系统。 M上海企业网站设计与制作eeGo SDK 不保证在Vista下可以工作,并且不提供支持。
1071 0
|
.NET 测试技术 Windows
Windows2003 + IIS6 安装.Net FrameWork 4.0 兼容早期版本的测试
看到文档说.net4的框架可以向下兼容2.0、3.0、3.5这几个版本,觉得是一件好事,以后服务器上就不用费时费力的安装 2.0、3.5之类的框架了。但是又觉得奇怪,2.0和3.5的框架都是很大的,为什么现在这个小得多的4.0能同时运行 前几个版本的程序呢?是不是因为 win7上自带了3.5? 那win2003上会怎么样呢?      为了搞清楚这个问题,我重新装了一台全新的 win2003 ,系统装好后,添加 IIS。
1116 0
|
开发工具 Android开发 iOS开发
微软Windows Phone 7新特“.NET研究”性详解
  微软曾经借助Windows Mobile系统,在智能手机领域获得了巨大成功。但后来苹果iOS和谷歌Android的出现,不仅提升了广大用户对智能手机的更多需求与期望值,还蚕食了Windows Mobile的不少市场份额。
1336 0
|
Windows
各个版本 Windows 10 系统中自带的 .NET Framework 版本
原文 各个版本 Windows 10 系统中自带的 .NET Framework 版本 Windows 名称 Windows 版本 自带的 .NET Framework 版本 Windows 10 October 2018 Update 10.
2163 0